359 測定値
359 測定値

スマートストアを構築する:GPTが製品をラベル化し、次に販売するものを予測する

LJ11m2025/05/08
Read on Terminal Reader

長すぎる; 読むには

CocoIndexは、継続的なソースアップデートで知識グラフを構築し、維持することを容易にします。 製品タクソノミーは、論理的で階層的な構造で製品カタログを組織する方法です。
featured image - スマートストアを構築する:GPTが製品をラベル化し、次に販売するものを予測する
LJ HackerNoon profile picture
0-item
1-item

このブログでは、Aknowledge graphタクソノミーと補完タクソノミーを用いた製品推奨についてココインデックス情報グラフを構築し、継続的なソースアップデートで維持することを容易にします。


Product taxonomy is a way to organize product catalogues in a logical and hierarchical structure; a great detailed explanation can be found. s a way to organize product catalogues in a logical and hierarchical structure; a great detailed explanation can be foundhere実際には、複雑な問題である:製品は複数のカテゴリーの一部であり、カテゴリーは複数の親を持つことができます。


私たちはまた、LLMを使用して、各製品のための補完タクソノミーのリストを生成します - たとえば、誰かがノートブックを購入すると、彼らはまた補完製品としてペンを購入することができます。


ソースコードはこちらで入手可能CocoIndex 例 - product_taxonomy.


We are constantly improving, and more features and examples are coming soon. 気をつけて、私たちの進歩をフォローしてくださいstarring↓↓our GitHub repo.

GitHub レポ

前提条件

  • PostgreSQL をインストールします. CocoIndex は PostgreSQL を内部で増加処理に使用します。
  • グラフデータベースのNeo4jをインストールします。
  • また、Ollamaに切り替えることもできますので、LLMモデルをローカルに実行できます。

文書化

You can read the official CocoIndex Documentation for Property Graph Targets ここ.

知識グラフを構築するためのデータフロー

概要

コア・フローは約100行のPythonコード.


データフローを宣言します。

  1. イングレスト製品(JSON)
  2. for each product,
    • parse JSON
    • map & clean up data
    • extract taxonomy from the mapped data
  3. データ収集
  4. 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それがカタログの鍵です。


data ingestion

データ収集者追加

コレクターを root 範囲に追加して、製品、タクソノミー、補完タクソノミーを収集します。

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
  • 価格フィールドの清掃
  • すべてのフィールドに基づいて製品の詳細のためのマークダウンを生成する(LLMはタクソノミーと補完タクソノミーを抽出するため、マークダウンはLLMの文脈として最適であることがわかります)。

フロー

フロー内では、データマッピング変換を接続して各製品の 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"])
  1. 最初の変換() は JSON ファイルを解析します。
  2. 第二の変換() は、定義されたデータマッピングを実行します。
  3. Neo4j の製品ノードに必要なフィールドを収集します。


data mapping


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]


taxonomy and complementary taxonomy


それぞれの製品については、その分類学と補完分類学についての洞察が必要であり、知識グラフを使用して関連製品を見つけるための橋としてそれを使うことができます。

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))


Taxonomy extraction


たとえば、LLMは、その説明をとる。ジェルペン, and extracts taxonomy to beジェルペンつまり、人々が買うとき、ジェルペンもしかしたら、彼らも興味があるかもしれません。ノート褒め言葉としてのタクシー。


そしてその後、収集者にタクソノミーと補完タクソノミーを収集します。

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のすべてのノードには、以下の2つが必要です。

  1. タグ:ノードの種類. 例えば、製品、タクソノミー。
  2. 主要キーフィールド:ノードをユニークに識別するフィールド. e.g., id for Product nodes.


CocoIndex は、メインキー フィールドを使用してノードを一致させ、それらをデダプライクします. If you have multiple nodes with the same primary key, CocoIndex retains only one of them.



ノードをマップする方法は2つあります。

  1. ノードだけのコレクターを持っている場合、それをNeo4jに直接輸出することができます. たとえば製品. 各製品を明示的に収集しました。
  2. ノードに接続する関係のコレクターがある場合は、関係コレクターの選択したフィールドからノードをマッピングできます。


例えば、

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",
))

輸出製品ネオ4J

製品
product_node.export(
    "product_node",
    cocoindex.storages.Neo4j(
        connection=conn_spec,
        mapping=cocoindex.storages.Nodes(label="Product")
    ),
    primary_key_fields=["id"],
)


This exports Neo4j nodes with label. この Neo4jノードをラベルで輸出します。Productから Theproduct_nodeコレクター

  • It declares Neo4j node label Product. It specifies id as the primary key field. それは、主なキーフィールドとしてIDを指定します。
  • product_node collector から Product ラベルを持つ Neo4j ノードに至るまで、すべてのフィールドを持ちます。


輸出Taxonomyネオ4J

タクシー

We don't have an explicit collector forTaxonomyNODES. They are part of theproduct_taxonomyそしてproduct_complementary_taxonomyコレクターとフィールドは、タクソノミー抽出の過程で収集されます。


Neo4jノードとして輸出するには、まず宣言する必要があります。Taxonomyノード

flow_builder.declare(
    cocoindex.storages.Neo4jDeclaration(
        connection=conn_spec,
        nodes_label="Taxonomy",
        primary_key_fields=["value"],
    )
)


次に、輸出product_taxonomyNeo4jとの関係

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"],
)


Export taxonomy


同様に、輸出することもできます。product_complementary_taxonomyNeo4jとの関係

    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"],
    )


Export comlementary taxonomy



THEcocoindex.storages.RelationshipsNeo4j で関係をマッピングする方法を宣言します。


関係において、それは:

  1. ソースノードとターゲットノード
  2. ソースとターゲットを接続する関係 異なる関係が同じソースとターゲットノードを共有する場合があります。


NodeFromFields田舎から取ってくるentity_relationshipコレクター&CreatesTaxonomyノード

Main function

最後に、フローの主な関数は CocoIndex フローを初期化し、それを実行します。

 @cocoindex.main_fn()
def _run():
    pass

if __name__ == "__main__":
    load_dotenv(override=True)
    _run()

あなたのインデックスを検索してテストする

すでに全員セットです!

  1. Install the dependencies:

    pip install -e .
    
  2. 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
    
  3. (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
    


  4. And then open the url https://cocoindex.io/cocoinsight. It just connects to your local CocoIndex server, with Zero pipeline data retention.


CocoInsight


Browse the Knowledge Graph を参照

知識グラフが作成された後、Neo4j Browserで作成した知識グラフを探索できます。


開発環境では、Credentials を使用して Neo4j ブラウザに接続できます。

  • タグ : Neo4J
  • パスワード: cocoindex は、私たちの docker で config.yaml を構成するために事前設定されています。


You can open it athttp://localhost:7474, 次の Cypher クエリを実行して、すべての関係を取得します。

MATCH p=()-->() RETURN p


Knowledge Graph


応援

我々は絶え間なく改善し、より多くの機能と例が間もなく来る. あなたがこの記事を愛している場合は、私たちに星をください ⭐ atGitHub レポ私たちを成長させるために


読んでくれてありがとう!

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks