Šiame tinklaraštyje mes sukursime dėl produktų rekomendacijų naudojant taksonomiją ir papildomą taksonomiją. leidžia lengvai kurti ir prižiūrėti žinių grafikus su nuolatiniais šaltinio atnaujinimais. knowledge graph Kokosų indeksas yra būdas organizuoti produktų katalogus logine ir hierarchine struktūra; galima rasti didelį išsamų paaiškinimą Praktiškai tai sudėtinga problema: produktas gali būti kelių kategorijų dalis, o kategorija gali turėti kelis tėvus. Product taxonomy i čia Mes taip pat naudosime LLM, kad sukurtume kiekvieno produkto papildomų taksonomijų sąrašą - pavyzdžiui, kai kas nors perka pieštuką, jie taip pat gali nusipirkti pieštuką kaip papildomą produktą. Šaltinis yra prieinamas . CocoIndex Pavyzdžiai - product_taxonomy Mes nuolat tobuliname, ir netrukus ateis daugiau funkcijų ir pavyzdžių. starring our . „GitHub“ repo „GitHub“ repo Išankstinės sąlygos Įdiekite PostgreSQL. „CocoIndex“ naudoja „PostgreSQL“ viduje. Įdiekite Neo4j, grafikos duomenų bazę. Arba galite pereiti prie Ollama, kuris veikia LLM modelius vietoje - vadovas. dokumentacijos Galite perskaityti oficialią „CocoIndex“ dokumentaciją dėl turto grafiko tikslų . čia Duomenų srautas kuriant žinių grafiką Apžvalga Pagrindinis srautas yra apie . 100 Python kodo eilučių Mes deklaruosime duomenų srautą Prekės aprašymas (JSON) for each product, parse JSON map & clean up data extract taxonomy from the mapped data Duomenų rinkimas Eksportuoti duomenis į neo4j Pridėti dokumentus kaip šaltinį @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)) čia Sukūrė a • Tai yra raktas į kaktusą. flow_builder.add_source Kėdainiai filename Pridėti duomenų rinkėjai Pridėkite kolektorius prie šaknų, kad surinktumėte produktą, taksonomiją ir papildomą taksonomiją. product_node = data_scope.add_collector() product_taxonomy = data_scope.add_collector() product_complementary_taxonomy = data_scope.add_collector() Kiekvieno produkto procesas Mes analizuosime JSON failą kiekvienam produktui ir transformuosime duomenis į formatą, kurio mums reikia tolesnei apdorojimui. Duomenų žemėlapiai @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), ) Čia mes apibrėžiame duomenų kartografavimo funkciją, pvz., Išvalykite ID lauką Žemėlapio pavadinimas -> pavadinimas clean up the field price sukurti žymėjimo eilutę produkto detalėms, pagrįstoms visomis sritimis (už LLM išgauti taksonomiją ir papildomą taksonomiją, mes nustatome, kad žymėjimas geriausiai veikia kaip LLM kontekstas). srautas Per srautą mes įjungiame duomenų kartografavimo transformaciją, kad apdorotume kiekvieną produktą 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"]) Pirmasis transformas parsetuoja JSON failą. Antrasis transform() atlieka apibrėžtą duomenų kartografavimą. Mes renkame laukus, kurių mums reikia produkto mazgui Neo4j. Ištraukite taksonomiją ir papildomą taksonomiją naudojant LLM Produkto taksonomijos apibrėžimas Kadangi mes naudojame LLM išgauti produktų taksonomiją, mes turime pateikti išsamią instrukciją klasės lygio 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 Apibrėžti produktų taksonomijos informaciją Iš esmės mes norime išgauti visas galimas produkto taksonomijas ir galvoti apie tai, kokie kiti produktai greičiausiai bus įsigyti kartu su dabartiniu produktu. @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] Kiekvienam produktui norime įžvalgos apie jo taksonomiją ir papildomą taksonomiją ir galėtume tai panaudoti kaip tiltą, kad surastume susijusį produktą, naudodami žinių grafiką. LLM Ekstrakcija Galiausiai naudosime iš produkto detalių išgauti taksonomiją ir papildomą taksonomiją. 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)) Pavyzdžiui, LLM imasi aprašymą , ir išskiria taksonomiją, kad būtų Tai rodo, kad kai žmonės perka Galbūt jie taip pat domisi Pavyzdžiui, kaip apibūdintumėte komplimentinę taksonomiją. Geležinė plytelė Geležinė plytelė Geležinė plytelė Knygynas Ir tada mes surinksime taksonomiją ir papildomą taksonomiją rinkėjui. 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"]) Žinių grafikas Pagrindinės sąvokos Visi Neo4j mazgai turi du dalykus: Etiketė: mazgo tipas. pvz., produktas, taksonomija Pirminio rakto laukas: laukas, unikaliai identifikuojantis mazgą, pvz., produkto mazgų id. CocoIndex naudoja pirminio rakto lauką, kad atitiktų mazgus ir juos dedupliuotų. Jei turite kelis mazgus su tuo pačiu pirminio rakto, CocoIndex išlaiko tik vieną iš jų. Yra du būdai, kaip išmatuoti mazgus: Kai turite kolektorių tik mazgui, galite jį tiesiogiai eksportuoti į Neo4j. Pavyzdžiui, produktas. Kai turite ryšių kolektorių, jungiantį prie mazgo, galite nukreipti mazgus iš pasirinktų laukų ryšių kolektoriuje. Pavyzdžiui, product_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"]) Surenka ryšį, o iš ryšio sukuriamas taksonomijos mazgas. Neo4j ryšio konfigūracija: conn_spec = cocoindex.add_auth_entry( "Neo4jConnection", cocoindex.storages.Neo4jConnection( uri="bolt://localhost:7687", user="neo4j", password="cocoindex", )) eksportuoti Žymės: Neo4j Produktas Produktas product_node.export( "product_node", cocoindex.storages.Neo4j( connection=conn_spec, mapping=cocoindex.storages.Nodes(label="Product") ), primary_key_fields=["id"], ) Tai eksportuoja Neo4j mazgus su etiketėmis Iš The Kolektyvinė Product product_node Jis deklaruoja Neo4j mazgo etiketę Produktas. Jis nurodo id kaip pirminio rakto lauką. Jis perneša visus laukus nuo product_node kolektoriaus iki Neo4j mazgų su ženklu produktas. eksportuoti Žymės: Neo4j Taxonomijos Taxonomijos Nėra aiškaus kolekcionieriaus Širvintų.lt yra dalis ir Kolektoriai ir laukai surenkami taksonomijos gavybos metu. Taxonomy product_taxonomy product_complementary_taxonomy Norėdami juos eksportuoti kaip Neo4j mazgus, pirmiausia turime deklaruoti Naujovės Taxonomy flow_builder.declare( cocoindex.storages.Neo4jDeclaration( connection=conn_spec, nodes_label="Taxonomy", primary_key_fields=["value"], ) ) Toliau eksportuojame Kaip atpažinti 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"], ) Taip pat galime eksportuoti Kaip atpažinti 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"], ) Tų Išsiaiškinti, kaip naudoti Neo4j. cocoindex.storages.Relationships Santykiuose yra: A source node and a target node. Atkreipkite dėmesį, kad skirtingi ryšiai gali bendrinti tuos pačius šaltinio ir tikslo mazgus. Paimkite laukus iš Kolektoriai ir kūrėjai Naujovės NodeFromFields entity_relationship Taxonomy Pagrindinė funkcija Galiausiai, pagrindinė srauto funkcija inicijuoja CocoIndex srautą ir paleidžia jį. @cocoindex.main_fn() def _run(): pass if __name__ == "__main__": load_dotenv(override=True) _run() Patikrinkite ir išbandykite savo indeksą Dabar jūs visi sutvarkyti! 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 Browse the žinių grafikas Po žinių grafiko sukūrimo galite ištirti žinias, kurias sukūrėte Neo4j naršyklėje. Dėl kūrėjo aplinkos galite prisijungti prie Neo4j naršyklės naudodamiesi įgaliojimais: Žymė: Neo4j slaptažodis: cocoindex, kuris yra iš anksto sukonfigūruotas mūsų dokerio sudaryti config.yaml. Galite jį atidaryti , ir paleiskite šią Cifro užklausą, kad gautumėte visus santykius: http://localhost:7474 MATCH p=()-->() RETURN p Palaikyk mus Mes nuolat tobuliname, ir netrukus ateis daugiau funkcijų ir pavyzdžių. Jei jums patinka šis straipsnis, prašome suteikti mums žvaigždutę ⭐ Padėti mums augti. „GitHub“ repo Thanks for reading!