في هذا المقال سنقوم بإنشاءknowledge graphلتوصيات المنتجات باستخدام التعديلات والتعديلات التكاملية.CocoIndexيجعل من السهل إنشاء وتعزيز الخرائط المعرفة مع تحديثات مصدر مستمر.
Product taxonomy iطريقة لتنظيم قوائم المنتجات في هيكل منطقي ومتعدد؛ يمكن العثور على تفسير مفصل للغايةهنافي الممارسة، إنها مشكلة معقدة: يمكن أن يكون المنتج جزءًا من فئة متعددة، ويمكن أن يكون فئة من الأبوين متعددة.
وسوف نستخدم LLM لإزالة قائمة التعديلات من وصفات المنتج. وسوف نستخدم أيضًا LLM لإنتاج قائمة التعديلات التكاملية لكل منتج - على سبيل المثال، عندما يشتري شخص ما نصيحة، قد يشتري أيضًا نصيب كمنتج كمنتج التكامل.
يتم توفير رمز المصدر فيCocoIndex أمثلة - product_taxonomy.
نحن نتحسن دائمًا، ونقدم المزيد من الميزات والموضوعات قريبًا.starringour GitHub Repo.
GitHub Repoمتطلبات
- تثبيت PostgreSQL. CocoIndex يستخدم PostgreSQL داخليًا لتشخيص متزايد.
- تثبيت Neo4j، قاعدة بيانات الخرائط.
- إعداد مفتاح OpenAI API الخاص بك. بدلاً من ذلك، يمكنك التبديل إلى Ollama، الذي يقوم بتشغيل نموذج LLM على المستوى المحلي.
الوثائق
يمكنك قراءة وثيقة CocoIndex الرسمية لأهداف جدول العقاراتهنا.
تدفق البيانات لإنشاء جدول المعرفة
نظرة عامة
The core flow is about 100 صفحة من الكود Python.
سوف نقوم بإعلان تدفق البيانات
- إنشاء منتجات (في 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))
هناflow_builder.add_source
إنشاء Aكتيبة. .filename
وهذا هو المفتاح لـ KTable.
إضافة جمعيات البيانات
Add collectors at the root scope to collect the product, taxonomy and complementary taxonomy.
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
- الصفحة الرئيسية -> عنوان
- إزالة مساحة السعر
- إنتاج سلسلة تقييم لبيانات المنتج بناء على جميع المجالات (لماذا LLM استخراج التقييم والتقييم التكميلي التكميلي، ونحن نجد أن التقييم يعمل بشكل أفضل كناية ل LLM).
Flow
داخل تدفق ، نحن نلجأ إلى تحويل خرائط البيانات لإجراء كل منتج 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.
- التغيير الثاني() يقوم بتحليل البيانات المحددة.
- We collect the fields we need for the product node in Neo4j.
استخراج السياسات والسياسات التكاملية باستخدام LLM
تعريف التصنيف المنتج
نظرًا لأننا نستخدم LLM لإخراج تصنيف المنتج، ونحن بحاجة إلى توفير تعليم مفصل على مستوى الفصل الدراسي.
@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
تحديد معلومات التكتيك المنتج
في الأساس ، نريد استخراج جميع التعديلات المحتملة للمنتج ، وتفكير في ما هي المنتجات الأخرى التي من المرجح شراء مع المنتج الحالي.
@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]
بالنسبة إلى كل منتج ، نريد بعض النظرة على التعديلات والتعديلات التكاملية ، ويمكننا استخدام ذلك كبوحة لتحديد المنتج ذات الصلة باستخدام شاشة المعرفة.
LLM استخراج
وفي النهاية سوف نستخدم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))
على سبيل المثال، LLM يأخذ وصفكيلوب Pen، وتختار التعديلات التكتيكية لتكونكيلوب Penوفي الوقت نفسه، فإنّه يشير إلى أنّ الناس يشتريونكيلوب Penقد تكون مهتمًا أيضاًالكتبكما هو الحال مع التعديلات الضريبية.
وسيتم جمع التعديلات والتعديلات المشتركة إلى المشترك.
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"])
بناء المعرفة Graph
الفكرة الأساسية
كل القنوات ل Neo4j تحتاج إلى اثنين من الأشياء:
- العلامة التجارية: العلامة التجارية: العلامة التجارية: العلامة التجارية: العلامة التجارية: العلامة التجارية: العلامة التجارية
- مجلد مفتاح الرئيسي: المجلد الذي يحدد بوضوح الضوء، على سبيل المثال، ID للضوء المنتج.
يستخدم CocoIndex مجال المفتاح الرئيسي للتوافق على المفاتيح وتقسيمها.إذا كان لديك عدة المفاتيح مع نفس المفتاح الرئيسي، يحافظ 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",
))
التصديرProduct
أندرويد Neo4J
المنتج
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 Node label Product. يحدد id كقطرة مفتاح الرئيسي.
- يتم نقل جميع المجالات من product_node collector إلى Neo4j القنوات مع علامة المنتج.
التصديرTaxonomy
أندرويد Neo4J
Taxonomy
ليس لدينا جمعيات صريحة للTaxonomy
الأوراق: هي جزء منproduct_taxonomy
وproduct_complementary_taxonomy
يتم جمع المشترين والمناطق أثناء استخراج التعديلات.
لتصديرها كأنماط Neo4j ، يجب أن نقول أولاًTaxonomy
نانسي
flow_builder.declare(
cocoindex.storages.Neo4jDeclaration(
connection=conn_spec,
nodes_label="Taxonomy",
primary_key_fields=["value"],
)
)
وبالتالي، سيتم إنتاجproduct_taxonomy
كيفية التعامل مع Neo4j
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"],
)
وبالتالي، يمكننا استيرادproduct_complementary_taxonomy
كيفية التعامل مع Neo4j
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"],
)
ذاكcocoindex.storages.Relationships
تعريف كيفية تشكيل علاقات في Neo4j.
في علاقة ، هناك:
- نقطة مصدر و نقطة الهدف.
- العلاقة التي تتواصل مع مصدر وهدف. يرجى ملاحظة أن العلاقات المختلفة قد تشترك في نفس مصدر وهدف.
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 https://cocoindex.io/cocoinsight. It just connects to your local CocoIndex server, with Zero pipeline data retention.
انقر على Graph of Knowledge
بعد إنشاء جدول المعرفة ، يمكنك استكشاف جدول المعرفة الذي تم إنشاؤه في Neo4j Browser.
بالنسبة للبيئة التطويرية، يمكنك الانضمام إلى متصفح Neo4j باستخدام الوثائق:
- اسم المستخدم: Neo4j
- كلمة المرور: cocoindex التي يتم تحديدها مسبقًا في أندرويد لدينا compig.yaml.
يمكنك فتحها فيhttp://localhost:7474، وبدء الاستفسار التالي Cypher للحصول على جميع العلاقات:
MATCH p=()-->() RETURN p
دعمنا
نحن نغير دائمًا، وأكثر الميزات والمثلات ستأتي قريبًا.إذا كنت تحب هذا المقال، يرجى إعطاءنا نجمة ⭐ فيGitHub Repoلمساعدتنا على النمو.
شكرا على القراءة!