इस ब्लॉग में हम एक टैक्सीनॉमी और पूरक टैक्सीनॉमी का उपयोग करके उत्पाद सिफारिशों के लिए। यह आसान बनाता है और निरंतर स्रोत अद्यतन के साथ ज्ञान ग्राफ बनाए रखता है। knowledge graph कोकोइंडेक्स उत्पाद कैटलॉग को एक तार्किक और रीरेखिक संरचना में व्यवस्थित करने का एक तरीका; एक महान विस्तृत स्पष्टीकरण पाया जा सकता है अभ्यास में, यह एक जटिल समस्या है: एक उत्पाद कई श्रेणियों का हिस्सा हो सकता है, और एक श्रेणी में कई माता-पिता हो सकते हैं। Product taxonomy i यहां हम उत्पाद वर्णन से टैक्सोनिमों की एक सूची निकालने के लिए एलएलएम का उपयोग करेंगे. हम प्रत्येक उत्पाद के लिए पूरक टैक्सोनिमों की एक सूची उत्पन्न करने के लिए एलएलएम का भी उपयोग करेंगे - उदाहरण के लिए, जब कोई नोटबुक खरीदता है, तो वे एक पेंटिंग भी एक पूरक उत्पाद के रूप में खरीद सकते हैं. हम उत्पादों के बीच संबंधों का पता लगाने के लिए ज्ञान ग्राफ का उपयोग करेंगे जो उत्पाद सिफारिशों या लेबलिंग के लिए आगे इस्तेमाल किया जा सकता है. स्रोत कोड उपलब्ध है . CocoIndex उदाहरण - product_taxonomy हम लगातार सुधार कर रहे हैं, और अधिक सुविधाएं और उदाहरण जल्द ही आ रहे हैं। starring our . GitHub रीपो GitHub रीपो पूर्वानुमान PostgreSQL स्थापित करें. CocoIndex अंदरूनी रूप से PostgreSQL का उपयोग बढ़ती प्रसंस्करण के लिए करता है। Neo4j, एक ग्राफ़ डेटाबेस स्थापित करें। वैकल्पिक रूप से, आप Ollama पर स्विच कर सकते हैं, जो स्थानीय रूप से एलएलएम मॉडल चलाता है - गाइड। दस्तावेज आप संपत्ति ग्राफ लक्ष्यों के लिए आधिकारिक CocoIndex दस्तावेज़ पढ़ सकते हैं . यहां ज्ञान ग्राफ बनाने के लिए डेटा प्रवाह समीक्षा मुख्य प्रवाह के बारे में है . Python कोड के 100 पंक्तियाँ हम एक डेटा प्रवाह घोषित करेंगे इनपुट उत्पादों (JSON में) for each product, parse JSON map & clean up data extract taxonomy from the mapped data डेटा इकट्ठा Neo4j के लिए डेटा निर्यात दस्तावेज़ों को स्रोत के रूप में जोड़ें @cocoindex.flow_def(name="StoreProduct") def store_product_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope): data_scope["products"] = flow_builder.add_source( cocoindex.sources.LocalFile(path="products", included_patterns=["*.json"]), refresh_interval=datetime.timedelta(seconds=5)) यहां बनाता है A . यह कुंजी की कुंजी है। flow_builder.add_source कटवाना filename डेटा संग्रहकों को जोड़ें उत्पाद, टैक्सीनॉमी और पूरक टैक्सीनॉमी को इकट्ठा करने के लिए जड़ सीमा में कलेक्टर जोड़ें। product_node = data_scope.add_collector() product_taxonomy = data_scope.add_collector() product_complementary_taxonomy = data_scope.add_collector() प्रत्येक उत्पाद की प्रक्रिया हम प्रत्येक उत्पाद के लिए JSON फ़ाइल का विश्लेषण करेंगे, और डेटा को उस प्रारूप में परिवर्तित करेंगे जो हमें बाद में प्रसंस्करण के लिए आवश्यक है। डेटा मैप @cocoindex.op.function(behavior_version=2) def extract_product_info(product: cocoindex.typing.Json, filename: str) -> ProductInfo: return ProductInfo( id=f"{filename.removesuffix('.json')}", url=product["source"], title=product["title"], price=float(product["price"].lstrip("$").replace(",", "")), detail=Template(PRODUCT_TEMPLATE).render(**product), ) यहाँ हम डेटा मानचित्रण के लिए एक कार्य परिभाषित करते हैं, उदाहरण के लिए, ID फ़ील्ड को साफ करें कागज का नाम - Title कीमत क्षेत्र को साफ करें सभी क्षेत्रों के आधार पर उत्पाद विवरण के लिए एक मार्कअप श्रृंखला उत्पन्न करें (एलएलएम के लिए टैक्सोनिम और पूरक टैक्सोनिम निकालने के लिए, हम पाते हैं कि मार्कअप एलएलएम के लिए संदर्भ के रूप में सबसे अच्छा काम करता है)। फ्लो प्रवाह के भीतर, हम प्रत्येक उत्पाद JSON को संसाधित करने के लिए डेटा मैपिंग रूपांतरण को जोड़ते हैं। with data_scope["products"].row() as product: data = (product["content"] .transform(cocoindex.functions.ParseJson(), language="json") .transform(extract_product_info, filename=product["filename"])) product_node.collect(id=data["id"], url=data["url"], title=data["title"], price=data["price"]) पहला ट्रांसफार्म() JSON फ़ाइल को पारित करता है। दूसरा ट्रांसफार्म() परिभाषित डेटा मैपिंग को पूरा करता है। हम Neo4j में उत्पाद नोड के लिए आवश्यक क्षेत्रों को एकत्र करते हैं। एलएलएम का उपयोग करके टैक्सोमिया और पूरक टैक्सोमिया निकालना उत्पाद टैक्सी परिभाषा चूंकि हम उत्पाद टैक्सीनॉमी निकालने के लिए एलएलएम का उपयोग कर रहे हैं, इसलिए हमें कक्षा स्तर के docstring पर विस्तृत निर्देश प्रदान करने की आवश्यकता है। @dataclasses.dataclass class ProductTaxonomy: """ Taxonomy for the product. A taxonomy is a concise noun (or short noun phrase), based on its core functionality, without specific details such as branding, style, etc. Always use the most common words in US English. Use lowercase without punctuation, unless it's a proper noun or acronym. A product may have multiple taxonomies. Avoid large categories like "office supplies" or "electronics". Use specific ones, like "pen" or "printer". """ name: str Product Taxonomy के बारे में जानकारी मूल रूप से हम एक उत्पाद के लिए सभी संभावित टैक्सोनॉमी निकालना चाहते हैं, और सोचते हैं कि वर्तमान उत्पाद के साथ किन अन्य उत्पादों को खरीदा जा सकता है। @dataclasses.dataclass class ProductTaxonomyInfo: """ Taxonomy information for the product. Fields: - taxonomies: Taxonomies for the current product. - complementary_taxonomies: Think about when customers buy this product, what else they might need as complementary products. Put labels for these complentary products. """ taxonomies: list[ProductTaxonomy] complementary_taxonomies: list[ProductTaxonomy] प्रत्येक उत्पाद के लिए, हम इसकी टैक्सोनिमिया और पूरक टैक्सोनिमिया के बारे में कुछ अंतर्दृष्टि चाहते हैं और हम ज्ञान ग्राफ का उपयोग करके संबंधित उत्पादों को खोजने के लिए पुल के रूप में इसका उपयोग कर सकते हैं। एलएलएम निकासी अंत में, हम उपयोग करेंगे उत्पाद विवरण से टैक्सीनॉमी और पूरक टैक्सीनॉमी निकालने के लिए। cocoindex.functions.ExtractByLlm taxonomy = data["detail"].transform(cocoindex.functions.ExtractByLlm( llm_spec=cocoindex.LlmSpec( api_type=cocoindex.LlmApiType.OPENAI, model="gpt-4.1"), output_type=ProductTaxonomyInfo)) उदाहरण के लिए, एलएलएम वर्णन लेता है , और निकालें टैक्सोमिया होने के लिए हालांकि, यह बताता है कि जब लोग खरीदते हैं वे भी रुचि रख सकते हैं एक तारीफ टैक्सी के रूप में। पेन के लिए पेन के लिए पेन के लिए नोटबुक और फिर हम संग्रहकर्ता को टैक्सोनॉमी और पूरक टैक्सोनॉमी एकत्र करेंगे। with taxonomy['taxonomies'].row() as t: product_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"]) with taxonomy['complementary_taxonomies'].row() as t: product_complementary_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"]) ज्ञान ग्राफ का निर्माण बुनियादी अवधारणाएं Neo4j के लिए सभी नोड्स को दो चीजों की आवश्यकता होती है: लेबल: नोड का प्रकार. उदाहरण के लिए, उत्पाद, टैक्सोनॉमी। प्राथमिक कुंजी फ़ील्ड: फ़ील्ड जो एकमात्र रूप से नोड की पहचान करता है. उदाहरण के लिए, उत्पाद नोड के लिए id। यदि आपके पास एक ही प्राथमिक कुंजी के साथ कई नोड हैं, तो CocoIndex केवल उनमें से एक को रखता है। नोड्स को नक्शे बनाने के दो तरीके हैं: जब आपके पास केवल नोड के लिए एक संग्रहक है, तो आप इसे सीधे Neo4j में निर्यात कर सकते हैं. उदाहरण के लिए उत्पाद. हमने प्रत्येक उत्पाद को स्पष्ट रूप से एकत्र किया है. जब आपके पास रिश्तों के लिए एक संग्रहक है जो नोड से जुड़ा हुआ है, तो आप रिश्तों के संग्रहक में चयनित क्षेत्रों से नोडों को नक्शे कर सकते हैं. आपको नोड लेबल और प्राथमिक कुंजी क्षेत्र की घोषणा करनी चाहिए. उदाहरण के लिए, product_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"]) एक रिश्ते को इकट्ठा करता है, और रिश्ते से टैक्सीनॉमी नोड बनाया जाता है। Neo4j कनेक्शन कॉन्फ़िगर करें: conn_spec = cocoindex.add_auth_entry( "Neo4jConnection", cocoindex.storages.Neo4jConnection( uri="bolt://localhost:7687", user="neo4j", password="cocoindex", )) निर्यात Neo4j के बारे में राय Product उत्पाद product_node.export( "product_node", cocoindex.storages.Neo4j( connection=conn_spec, mapping=cocoindex.storages.Nodes(label="Product") ), primary_key_fields=["id"], ) यह लेबल के साथ Neo4j नोड्स निर्यात करता है के से संग्रहक Product product_node यह Neo4j नोड लेबल उत्पाद की घोषणा करता है. यह पहचान को प्राथमिक कुंजी क्षेत्र के रूप में निर्दिष्ट करता है. यह उत्पाद लेबल के साथ Neo4j नोड्स के लिए product_node collector से सभी क्षेत्रों को ले जाता है। निर्यात Neo4j के बारे में राय टैक्सी टैक्सी हमारे पास स्पष्ट संग्रहक नहीं है नक्सलियों का यह हिस्सा है और कलेक्टरों और क्षेत्रों को टैक्सीनॉमी निकासी के दौरान इकट्ठा किया जाता है। Taxonomy product_taxonomy product_complementary_taxonomy उन्हें Neo4j नोड्स के रूप में निर्यात करने के लिए, हमें पहले घोषित करने की आवश्यकता है नोड्स Taxonomy flow_builder.declare( cocoindex.storages.Neo4jDeclaration( connection=conn_spec, nodes_label="Taxonomy", primary_key_fields=["value"], ) ) इसके बाद, निर्यात Neo4j से जुड़े अन्य समाचार » product_taxonomy product_taxonomy.export( "product_taxonomy", cocoindex.storages.Neo4j( connection=conn_spec, mapping=cocoindex.storages.Relationships( rel_type="PRODUCT_TAXONOMY", source=cocoindex.storages.NodeFromFields( label="Product", fields=[ cocoindex.storages.TargetFieldMapping( source="product_id", target="id"), ] ), target=cocoindex.storages.NodeFromFields( label="Taxonomy", fields=[ cocoindex.storages.TargetFieldMapping( source="taxonomy", target="value"), ] ), ), ), primary_key_fields=["id"], ) इसी तरह, हम निर्यात कर सकते हैं Neo4j से जुड़े अन्य समाचार » product_complementary_taxonomy product_complementary_taxonomy.export( "product_complementary_taxonomy", cocoindex.storages.Neo4j( connection=conn_spec, mapping=cocoindex.storages.Relationships( rel_type="PRODUCT_COMPLEMENTARY_TAXONOMY", source=cocoindex.storages.NodeFromFields( label="Product", fields=[ cocoindex.storages.TargetFieldMapping( source="product_id", target="id"), ] ), target=cocoindex.storages.NodeFromFields( label="Taxonomy", fields=[ cocoindex.storages.TargetFieldMapping( source="taxonomy", target="value"), ] ), ), ), primary_key_fields=["id"], ) के Neo4j में रिश्तों को नक्शे कैसे डालें cocoindex.storages.Relationships एक रिश्ते में, यह है: एक स्रोत नोड और एक लक्ष्य नोड। एक रिश्ता जो स्रोत और लक्ष्य को जोड़ता है ध्यान दें कि विभिन्न रिश्ते एक ही स्रोत और लक्ष्य नोड साझा कर सकते हैं। मैदानों से ले जाते हैं संग्रहक और बनाता है नोड्स NodeFromFields entity_relationship Taxonomy मुख्य कार्य अंत में, प्रवाह के लिए मुख्य कार्य CocoIndex प्रवाह को प्रारंभ करता है और इसे चलाता है। @cocoindex.main_fn() def _run(): pass if __name__ == "__main__": load_dotenv(override=True) _run() जांचें और अपने इंडेक्स का परीक्षण करें अब आप सभी सेट हैं! Install the dependencies: pip install -e . Run following commands to setup and update the index. python main.py cocoindex setup python main.py cocoindex update You'll see the index updates state in the terminal. For example, you'll see the following output: documents: 9 added, 0 removed, 0 updated (Optional) I used CocoInsight to troubleshoot the index generation and understand the data lineage of the pipeline. It is in free beta now, you can give it a try. Run following command to start CocoInsight: python3 main.py cocoindex server -c https://cocoindex.io And then open the url . It just connects to your local CocoIndex server, with Zero pipeline data retention. https://cocoindex.io/cocoinsight ज्ञान ग्राफ ब्राउज़ करें ज्ञान ग्राफ का निर्माण करने के बाद, आप Neo4j ब्राउज़र में बनाए गए ज्ञान ग्राफ का पता लगा सकते हैं। डेव वातावरण के लिए, आप क्रिप्टिकल का उपयोग करके Neo4j ब्राउज़र से कनेक्ट कर सकते हैं: उपयोगकर्ता नाम: Neo4j पासवर्ड: cocoindex जो हमारे दस्तावेज़ में अनुकूलित है compose config.yaml। आप इसे खोल सकते हैं , और सभी रिश्तों को प्राप्त करने के लिए निम्नलिखित Cypher पूछताछ चलाएं: http://localhost:7474 MATCH p=()-->() RETURN p हमें समर्थन हम लगातार सुधार कर रहे हैं, और अधिक सुविधाएं और उदाहरण जल्द ही आ रहे हैं. यदि आप इस लेख को पसंद करते हैं, तो कृपया हमें एक स्टार दें ⭐ पर हमें बढ़ने में मदद करें। GitHub रीपो पढ़ने के लिए धन्यवाद!