Bu blogda, birknowledge graphTaksonomi ve ek taksonomi kullanılarak ürün önerileri için.CocoIndex Hakkındasürekli kaynak güncellemeleri ile bilgi grafikleri oluşturmak ve sürdürmek kolaylaştırır.
Product taxonomy iÜrün kataloglarını mantıksal ve hijerarşik bir yapıda organize etmenin bir yolu; büyük bir ayrıntılı açıklama bulunabilir.burdaUygulamada, bu karmaşık bir sorun: bir ürün birden fazla kategoriye ait olabilir ve bir kategori birden fazla ebeveyn olabilir.
Ürün açıklamalarından taksonomların bir listesini çıkarmak için LLM'yi kullanacağız. ayrıca, her ürün için tamamlayıcı taksonomların bir listesini oluşturmak için LLM'yi kullanacağız - örneğin, birisi bir not defteri satın aldığında, ek bir ürün olarak bir kalem satın alabilirler. Ürün önerileri veya etiketleme için daha da kullanılabilecek ürünler arasındaki ilişkileri keşfetmek için Bilgi Grafiği kullanacağız.
Kaynak kodu mevcutturCocoIndex Örnekleri - product_taxonomy.
Sürekli iyileştirme yapıyoruz ve daha fazla özellik ve örnek yakında geliyor.starringour GitHub Repo Hakkında.
GitHub Repo HakkındaÖn koşullar
- CocoIndex, PostgreSQL'i içsel olarak arttırıcı işlemler için kullanır.
- Neo4j, bir grafik veritabanı kurun.
- Alternatif olarak, LLM modellerini yerel olarak çalıştıran Ollama'ya geçebilirsiniz.
Belgelendirme
Property Graph Targets için resmi CocoIndex Dokümantasyonunu okuyabilirsinizburda.
Bilgi Grafiği oluşturmak için veri akışı
genel bakış
Nükleer akım yaklaşıkPython kodunun 100 satırları.
Bir veri akışı ilan edeceğiz
- Ürün Yorumları (JSON)
- for each product,
- parse JSON
- map & clean up data
- extract taxonomy from the mapped data
- verileri toplamak
- Neo4j'e veri aktarımı
Kaynak olarak belgeleri ekle
@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))
Buradaflow_builder.add_source
yaratır aÇekilişve .filename
Bu da anahtarın anahtarıdır.
Data Collectors ekleme
Ürün, taksonomi ve ek taksonomi toplamak için kök kapsamına koleksiyoner ekleyin.
product_node = data_scope.add_collector()
product_taxonomy = data_scope.add_collector()
product_complementary_taxonomy = data_scope.add_collector()
Her ürünün işlemi
Her ürün için JSON dosyasını analiz edeceğiz ve verileri aşağıdaki işleme için ihtiyacımız olan biçime dönüştürüyoruz.
Bilgi Haritası
@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),
)
Burada bir veri haritası işlevini tanımlıyoruz, örneğin,
- id alanını temizle
- Etiket arşivi: title
- Fiyat alanını temizle
- Tüm alanlara dayanan ürün ayrıntıları için bir markdown dizisi oluşturun (LLM'nin taksonomi ve taksonomi ayrıntılarını çıkarmak için, markdown'un LLM için bağlam olarak en iyi çalıştığını düşünüyoruz).
akış
Akış içinde, her ürün JSON'u işlemek için veri haritalama dönüşümünü takıyoruz.
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"])
- İlk transform() JSON dosyasını analiz eder.
- İkinci transform() tanımlanmış veri haritasını gerçekleştirir.
- Neo4j'deki ürün düğmesine ihtiyacımız olan alanları topluyoruz.
LLM kullanarak taksonomi ve tamamlayıcı taksonomi çıkarın
Ürün Taksonomi Tanımları
LLM'yi ürün taksonomisini çıkarmak için kullandığımızdan, ders düzeyinde ayrıntılı bir talimat vermek zorundayız.
@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
Ürün Taksonomi Bilgileri
Temel olarak, bir ürünün tüm olası taksonomlarını çıkarmak ve mevcut ürünün yanı sıra hangi diğer ürünlerin satın alınması muhtemel olduğunu düşünmek istiyoruz.
@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]
Her bir ürünün taksonomisi ve taksonomisi hakkında biraz bilgi istiyoruz ve bunu bilgi grafiklerini kullanarak ilgili ürünü bulmak için köprü olarak kullanabiliriz.
LLM Ekstraksiyon
Son olarak kullanacağızcocoindex.functions.ExtractByLlm
Ürün detayından taksonomi ve ek taksonomi çıkarmak için.
taxonomy = data["detail"].transform(cocoindex.functions.ExtractByLlm(
llm_spec=cocoindex.LlmSpec(
api_type=cocoindex.LlmApiType.OPENAI, model="gpt-4.1"),
output_type=ProductTaxonomyInfo))
Örneğin, LLM açıklamasını alırGelen PenTaksonomik olarak ortaya çıkmak içinGelen PenÖte yandan, insanlar satın aldığındaGelen PenOnlar da ilgilenebilirNotebook HakkındaTaksonomik taksim olarak da bilinir.
Ve daha sonra taksonomi ve ek taksonomi toplayıcıya toplayacağız.
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"])
Bilgi Grafiği Oluşturma
Temel kavramlar
Neo4j için tüm düğmelerin iki şeye ihtiyacı vardır:
- Etiket: Node türü. örneğin, Ürün, Taksonomi.
- Ana anahtar alanı: Düğmeyi benzersiz olarak tanımlayan alan. örneğin, Ürün düğmeleri için id.
CocoIndex prim anahtar alanını kullanır ve düğmeleri eşleştirir ve bunları çifteleştirir. eğer aynı prim anahtarı olan çok sayıda düğmeye sahipseniz, CocoIndex bunlardan yalnızca birini saklar.
Düğmeleri haritalamanın iki yolu vardır:
- Sadece düğmeye ait bir koleksiyoncu olduğunda, onu doğrudan Neo4j'e ihraç edebilirsiniz. örneğin Ürün.
- Düğmeye bağlanan ilişkiler için bir koleksiyoncu olduğunda, ilişki koleksiyoncusu'nda seçilen alanlardan düğmeleri haritada görebilirsiniz. bir düğme etiketini ve birincil anahtar alanını belirtmeniz gerekir.
Örneğin,
product_taxonomy.collect(id=cocoindex.GeneratedField.UUID, product_id=data["id"], taxonomy=t["name"])
Bir ilişki topluyor ve ilişkiden taksonomi düğmesi oluşturulur.
Neo4j bağlantısı:
conn_spec = cocoindex.add_auth_entry(
"Neo4jConnection",
cocoindex.storages.Neo4jConnection(
uri="bolt://localhost:7687",
user="neo4j",
password="cocoindex",
))
ihracatÜrün
Neo4j Hakkında
Ürün
product_node.export(
"product_node",
cocoindex.storages.Neo4j(
connection=conn_spec,
mapping=cocoindex.storages.Nodes(label="Product")
),
primary_key_fields=["id"],
)
Bu, etiketli Neo4j düğmeleri ihraç ediyorProduct
O’ndanproduct_node
Bir koleksiyoner.
- Neo4j node etiket ürün ilan eder. prim anahtar alanı olarak id tanımlar.
- Ürün etiketli Neo4j düğmeleri için product_node collector alanından tüm alanları taşır.
ihracatTaxonomy
Neo4j Hakkında
Taksonomik
Açık bir koleksiyoncu yokTaxonomy
Cevap: Bunlar birer parçadırproduct_taxonomy
veproduct_complementary_taxonomy
Toplayıcılar ve alanlar taksonomik ekstraksiyon sırasında toplanır.
Bunları Neo4j düğmeleri olarak ihraç etmek için, önce ilan etmeliyizTaxonomy
Nöbetçiler
flow_builder.declare(
cocoindex.storages.Neo4jDeclaration(
connection=conn_spec,
nodes_label="Taxonomy",
primary_key_fields=["value"],
)
)
Sonrasında ise ihracatproduct_taxonomy
Neo4j ile ilgili yorumlar
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"],
)
Aynı şekilde ihracat yapabiliriz.product_complementary_taxonomy
Neo4j ile ilgili yorumlar
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"],
)
vecocoindex.storages.Relationships
Neo4j’de ilişkileri haritaya nasıl koyacağınızı açıklıyor.
Bir ilişkide şunlar vardır:
- Bir kaynak düğmesi ve bir hedef düğmesi.
- Kaynağı ve hedefi birleştiren bir ilişki. Farklı ilişkilerin aynı kaynağı ve hedefi düğmeleri paylaşabileceğini unutmayın.
NodeFromFields
Bu alanlardan alınanentity_relationship
Koleksiyoncu ve yaratıcıTaxonomy
Nöbetçiler
Ana fonksiyon
Son olarak, akış için ana fonksiyon, CocoIndex akışını başlatır ve çalıştırır.
@cocoindex.main_fn()
def _run():
pass
if __name__ == "__main__":
load_dotenv(override=True)
_run()
indeksleri denetleyin ve test edin
Artık hepiniz hazırsınız!
-
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 https://cocoindex.io/cocoinsight. It just connects to your local CocoIndex server, with Zero pipeline data retention.
Bilgi Grafiği İnceleme
Bilgi grafiğini oluşturduktan sonra, Neo4j Browser'da oluşturduğunuz bilgi grafiğini keşfedebilirsiniz.
Dev ortamında, Neo4j tarayıcıya kimlik bilgilerini kullanarak bağlanabilirsiniz:
- Kullanıcı Adı: Neo4j
- şifre: cocoindex bizim docker compose config.yaml önceden yapılandırılmıştır.
Onu açabilirsinhttp://localhost:7474, ve tüm ilişkileri almak için aşağıdaki Cypher sorgusunu çalıştırın:
MATCH p=()-->() RETURN p
Bizi Destek
Biz sürekli iyileştirme yapıyoruz ve daha fazla özellik ve örnek yakında geliyor. eğer bu makaleyi seviyorsanız, lütfen bize bir yıldız verin ⭐GitHub Repo HakkındaBize büyümemize yardımcı olmak için.
Okuduğunuz için teşekkürler!