V tomto blogu budeme vytvárať pre odporúčania výrobkov s použitím taxonómie a doplnkovej taxonómie. Uľahčuje vytváranie a údržbu znalostných grafov s nepretržitými zdrojovými aktualizáciami. knowledge graph CocoIndex spôsob organizovania produktových katalógov v logickej a hierarchickej štruktúre; veľké podrobné vysvetlenie možno nájsť V praxi ide o komplikovaný problém: výrobok môže byť súčasťou viacerých kategórií a kategória môže mať viacerých rodičov. Product taxonomy i tu Budeme tiež používať LLM vytvoriť zoznam komplementárnych taxonómie pre každý produkt - napríklad, keď niekto kúpi poznámkový blok, môžu tiež kúpiť pero ako komplementárny produkt. budeme používať Knowledge Graph preskúmať vzťahy medzi produktmi, ktoré môžu byť ďalej použité pre odporúčania produktov alebo označovanie. Zdrojový kód je k dispozícii na . CocoIndex Príklady - product_taxonomy Neustále sa zlepšujeme a čoskoro príde viac funkcií a príkladov. ☀️ starring our . GitHub repo GitHub repo Predpoklady CocoIndex používa PostgreSQL interne pre inkrementálne spracovanie. Nainštalujte Neo4j, grafickú databázu. Prípadne môžete prepnúť na Ollama, ktorý spúšťa modely LLM lokálne - sprievodca. dokumentácia Môžete si prečítať oficiálnu dokumentáciu CocoIndex pre ciele grafu nehnuteľností . tu Prúd údajov na vytvorenie grafu vedomostí Prehľad Hlavným prúdom je okolo . 100 riadkov pythonového kódu Budeme deklarovať tok údajov Zoznam produktov (v JSON) for each product, parse JSON map & clean up data extract taxonomy from the mapped data Zbieranie dát Export údajov do neo4j Pridať dokumenty ako zdroj @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)) tu Vytvorenie A → To je kľúč k Tebe. flow_builder.add_source Ťažká filename Pridať dátové zberače Pridajte zberače v koreňovom rozsahu na zhromažďovanie produktu, taxonómie a doplnkovej taxonómie. product_node = data_scope.add_collector() product_taxonomy = data_scope.add_collector() product_complementary_taxonomy = data_scope.add_collector() Proces každý produkt Analyzujeme súbor JSON pre každý produkt a transformujeme údaje do formátu, ktorý potrebujeme na následné spracovanie. dátové mapovanie @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), ) Tu definujeme funkciu na mapovanie údajov, napr. Vyčistiť pole ID Názov mapy -> Názov Vyčistiť cenové pole generovať značkovací reťazec pre podrobnosti o produkte na základe všetkých oblastí (pre LLM na extrakciu taxonómie a komplementárnej taxonómie zistíme, že značkovanie funguje najlepšie ako kontext pre LLM). prúdenie V rámci toku zapojíme transformáciu mapovania údajov na spracovanie každého produktu 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"]) Prvým transformom je súbor JSON. Druhý transform() vykonáva definované mapovanie údajov. Zhromažďujeme polia, ktoré potrebujeme pre produktový uzol v Neo4j. Extrahovať taxonómiu a komplementárnu taxonómiu pomocou LLM Definícia produktovej taxonómie Keďže používame LLM na extrakciu produktovej taxonómie, musíme poskytnúť podrobné pokyny na úrovni triedy. @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 Definovať produkt Taxonomy Info V podstate chceme extrahovať všetky možné taxonómie pre produkt a premýšľať o tom, aké ďalšie produkty sú pravdepodobne zakúpené spolu s aktuálnym produktom. @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] Pre každý produkt chceme nejaký pohľad na jeho taxonómiu a komplementárnu taxonómiu a mohli by sme to použiť ako mostík na nájdenie súvisiaceho produktu pomocou znalostného grafu. LLM extrakcia Nakoniec budeme používať extrahovať taxonómiu a komplementárnu taxonómiu z podrobností o výrobku. 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)) Napríklad, LLM berie opis , a extrakty taxonómie byť Z toho vyplýva, že keď ľudia kupujú Môžu mať záujem aj o Tak ako v komplimentárnej taxonómii. Ľadový Pen Ľadový Pen Ľadový Pen notebooku A potom budeme zhromažďovať taxonómiu a komplementárnu taxonómiu pre zberateľa. 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"]) Vytvorenie znalostného grafu Základné pojmy Všetky uzly pre Neo4j potrebujú dve veci: Label: Typ uzla. Napríklad produkt, taxonómia. Pole primárneho kľúča: Pole, ktoré jedinečne identifikuje uzol. CocoIndex používa pole s primárnym kľúčom na zosúladenie uzlov a ich zdvojnásobenie.Ak máte viac uzlov s rovnakým primárnym kľúčom, CocoIndex si ponechá iba jeden z nich. Existujú dva spôsoby mapovania uzlov: Keď máte zberač len pre uzol, môžete ho priamo exportovať do Neo4j. Napríklad Produkt. Keď máte zberač vzťahov, ktorý sa pripája k uzlu, môžete mapovať uzly z vybraných polí v zberači vzťahov. Musíte deklarovať označenie uzla a pole primárneho kľúča. Napríklad product_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"]) Zhromažďuje vzťah a z tohto vzťahu sa vytvorí taxonomický uzol. Konfigurácia pripojenia Neo4j: conn_spec = cocoindex.add_auth_entry( "Neo4jConnection", cocoindex.storages.Neo4jConnection( uri="bolt://localhost:7687", user="neo4j", password="cocoindex", )) Exportovať Príslušenstvo pre Neo4j produktov produktov product_node.export( "product_node", cocoindex.storages.Neo4j( connection=conn_spec, mapping=cocoindex.storages.Nodes(label="Product") ), primary_key_fields=["id"], ) Toto exportuje uzly Neo4j s označením Z toho zberateľom . Product product_node Vyhlasuje Neo4j uzol označenie produktu. Určuje id ako primárne kľúčové pole. Prináša všetky polia od kolektora product_node až po uzly Neo4j s označením Produkt. Export Príslušenstvo pre Neo4j Taxonómia Taxonómia Nemáme výslovného zberateľa pre Node.sk je súčasťou a Kolektory a polia sa zhromažďujú počas taxonomickej extrakcie. Taxonomy product_taxonomy product_complementary_taxonomy Aby sme ich mohli exportovať ako uzly Neo4j, musíme najprv deklarovať Nožnice Taxonomy flow_builder.declare( cocoindex.storages.Neo4jDeclaration( connection=conn_spec, nodes_label="Taxonomy", primary_key_fields=["value"], ) ) a následne exportovať Spojenie s 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"], ) Môžeme tiež exportovať Spojenie s 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"], ) na Ako vytvoriť mapu vzťahov v Neo4j cocoindex.storages.Relationships Vo vzťahu existuje: Zdrojový uzol a cieľový uzol. Vzťah, ktorý spája zdroj a cieľ. Všimnite si, že rôzne vzťahy môžu zdieľať rovnaké zdrojové a cieľové uzly. Vezmite si polia z Zberateľ a tvorca Nožnice NodeFromFields entity_relationship Taxonomy Hlavná funkcia Nakoniec hlavná funkcia pre tok inicializuje tok CocoIndex a spustí ho. @cocoindex.main_fn() def _run(): pass if __name__ == "__main__": load_dotenv(override=True) _run() Prečítajte si a otestujte svoj index Teraz ste všetci nastavení! 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 Prehľadávať znalostný graf Po vytvorení znalostného grafu môžete preskúmať znalostný graf, ktorý ste vytvorili v prehliadači Neo4j. Pre vývojárske prostredie sa môžete pripojiť k prehliadaču Neo4j pomocou poverení: Užívateľské meno: Neo4j heslo: cocoindex, ktorý je vopred nakonfigurovaný v našom dokumente compose config.yaml. Môžete ho otvoriť na , a spustite nasledujúci dotaz Cypher získať všetky vzťahy: http://localhost:7474 MATCH p=()-->() RETURN p Podporte nás Neustále sa zlepšujeme a čoskoro príde viac funkcií a príkladov.Ak sa vám tento článok páči, dajte nám hviezdu ⭐ na aby nám pomohol rásť. GitHub repo Ďakujem za čítanie!