マルチユーザーデータ取得: LangChain 技術ガイドとケーススタディ

マルチユーザーデータ取得: LangChain 技術ガイドとケーススタディ

著者 | 崔昊

レビュー | Chonglou

まとめ

この記事では、さまざまなユーザー データの分離を確実に行う方法について説明し、さまざまな取得要件に適応するための柔軟な構成オプションを提供します。

この記事ではまず、データ権限管理、検索システムの柔軟性、ユーザー エクスペリエンスの問題など、マルチユーザー データ検索の背景と課題について説明します。次に、高次元ベクトルデータを処理するベクトルデータベースとして Pinecone を使用する利点に特に重点を置いた技術分析を実行します。このホワイト ペーパーでは、マルチユーザー サポートのためのリトリーバー検証、チェーン構成フィールドの追加、チェーンを呼び出すための構成可能なフィールドの使用など、データの保存と取得の重要な手順について詳しく説明します。最後に、実際のコードを使用して、環境設定、テキストの埋め込み、インデクサーとチェーン構築の構成、特定の名前空間を介したドキュメント ライブラリの分離のテスト結果など、LangChain でマルチユーザー検索を実装する方法を示しました。

背景

マルチユーザー環境でデータを取得するには、システムが異なるユーザーのデータを区別して管理できる必要があります。これには、データのセキュリティとプライバシーの保護だけでなく、さまざまなユーザーのデータ検索ニーズに柔軟に対応できる検索システムも必要です。市場分析から技術文書に至るまで、さまざまな種類の情報を保存する巨大なナレッジベース システムを備えた大企業があるとします。企業内には研究開発、マーケティング、人事など複数の部門があり、各部門にはナレッジベースに対する異なるデータ アクセス要件があります。情報セキュリティを確保するために、企業はデータに対する権限制御を実装し、各部門が対応する関連データのみにアクセスできるようにする必要があります。

このビジネス シナリオでは、さまざまなユーザーのデータ取得ニーズを満たしながら、データ セキュリティを確保する方法が最大の課題となります。具体的な質問は次のとおりです。

データ権限管理: 各ユーザーが許可されたデータにのみアクセスできるようにするにはどうすればよいでしょうか?

検索システムの柔軟性: さまざまなユーザーの検索ニーズに柔軟に対応しながら、データのセキュリティを保護できるシステムをどのように設計するか?

ユーザー エクスペリエンス: 他の部門からデータを漏らすことなく、高速かつ正確な検索結果を提供するにはどうすればよいでしょうか。

テクニカル分析

LangChain は、大量のデータから特定のクエリに最も関連性の高い情報を検索するという検索タスクの処理に特に適した規模なアプリケーションフレームワークです。この記事では、LangChain フレームワークでマルチユーザー検索を実装する方法に焦点を当てます。次に複数のユーザーが異なるデータを取得できるようにするには、データの保存とデータの取得という 2 つの問題を解決する必要があります。

データストレージ

推奨システムやセマンティック検索などの AI アプリケーションでは、大量の高次元ベクトル データを処理して取得する必要があります。したがって大規模なベクトルデータを処理する場合には、次のような問題直面します

  • リアルタイムのデータ更新とクエリの遅延の問題: AI アプリケーションは、データの最新の変更を迅速に反映する必要があります (ユーザー設定をリアルタイムで更新するなど)。多くのシステムでは、正確性を確保しながら低レイテンシでデータを更新およびクエリすることに苦労しています。
  • 複雑なインフラストラクチャ管理とコスト: ベクター データを保存および取得するためのインフラストラクチャの構築と維持は、特にクラウド環境では複雑でコストがかかることがよくあります。
  • 高次元データのストレージとインデックスの最適化の問題: 密または疎なベクトル埋め込みを保存するには、効率的な検索とストレージのパフォーマンスを維持するために、最適化されたストレージ構造とインデックス戦略が必要です。
  • 多言語およびマルチプラットフォーム アクセスの課題: AI アプリケーション開発者は、さまざまなプログラミング環境 (Python Node.js など) でベクター データを処理する必要がある場合があります。そのため、クロスプラットフォームで使いやすい API が必要になります。

上記の問題を解決するために、このでは Pinecone を選択します Pinecone は、AI アプリケーション向けに設計されたクラウドネイティブのベクトル データベースであり、シンプルな API と自己管理型インフラストラクチャを提供します。高次元ベクトルデータの処理に特化しており、数十億のベクトルの取得要求を低レイテンシで処理できます。本質的に、ベクトル埋め込みは意味情報を表し、AI アプリケーションに長期記憶機能を提供し、複雑なタスクを実行するときに過去の経験を活用できるようにします。

従来のスカラー データベースと比較して、Pinecone はベクター データに最適化されたストレージとクエリを提供し、複雑なベクター データの処理の問題を解決します。インデックスには、一意の ID と密なベクトル埋め込みを持つ浮動小数点数の配列が含まれており、ハイブリッド検索およびフィルタリング クエリ用のスパース ベクトル埋め込みとメタデータのキーと値のペアもサポートしています。 Pinecone は、高いパフォーマンスとリアルタイム パフォーマンスを保証します。各ポッド レプリカは、最新のデータ更新を反映するために 1 秒あたり 200 クエリを処理できます。ユーザーは、HTTP、Python、または Node.js を介して追加、削除、変更、クエリ操作を実行し、ベクター データを柔軟に処理できます。

データ取得

マルチユーザー検索を実現するには、次の主要な手順を実行する必要があります。

1. マルチユーザー機能をサポートするリトリーバーの確認:使用するリトリーバーがマルチユーザー機能をサポートしているかどうかを確認します。現在、LangChain にはこれを実現するための統一された識別子やフィルターがなく、各ベクトル ストレージとリトリーバーには独自の実装 (名前空間、マルチテナントなど) がある可能性があります。通常、これは similarity_search に渡されるキーワード引数を介して公開されます。したがって、使用しているリトリーバーがマルチユーザー機能をサポートしているかどうか、およびその使用方法を判断するには、ドキュメントまたはソース コードを読む必要があります。

2. チェーンの構成フィールドを追加します。実行時にチェーンを呼び出し、関連するフラグを構成します。設定の詳細についてはドキュメントを参照してください。 「チェーン」はLangChain の重要な概念であることに注意してくださいチェーンは、特定のタスクを実行するために使用される一連の処理ステップの集合です。複数ユーザーの取得をサポートするには、ユーザーはチェーンに構成フィールドを追加する必要があります。これらのフィールドにより、さまざまなユーザーのニーズに合わせて、実行時にチェーンの動作を動的に調整できます。

3. 構成可能なフィールドを使用してチェーンを呼び出す:実行時に、以前に設定した構成可能なフィールドを使用して、チェーンへのパーソナライズされた呼び出しを実装できます。つまり、ユーザーはさまざまな状況やユーザーのニーズに応じてチェーンの動作を調整できます。このステップは、検索結果をさまざまなユーザーの固有のニーズに応じて最適化および調整できるようにするため、マルチユーザー検索を実現するための鍵となります。

上記の 3 つのポイントでは、インデックスマルチユーザー クエリをサポートする必要があります。フィールドを構成することで、ユーザー クエリ データのパラメータを Chains に渡すことができます。 構成フィールドを受け入れ、操作を実行してデータの取得を完了できます。

Pineconeベクトルストレージの以前の説明に基づいて、LangChainを参照します。 公式ドキュメント

データの保存とデータの取得の問題が解決されたので、コード練習リンクを開始しましょう。パッケージlangchain_community.vectorstores.pinecone.Pineconeには VectorStore から初期化された VectorStoreRetriever オブジェクトを作成して返すas_retriever メソッドが含まれていますこの検索エンジンは複数の検索タイプを提供しており、ユーザーはさまざまなニーズに基づいてカスタマイズされたベクター データ検索を実行できます。

このメソッドの主なパラメータは次のとおりです

 search_type(可选字符串)定义:指定检索器执行的搜索类型。选项: "similarity":标准的相似度搜索,默认选项。 "mmr":最大边缘相关性(Maximum Marginal Relevance),用于生成多样化的搜索结果。 "similarity_score_threshold":设置相似度分数阈值,仅返回超过此阈值的文档。 search_kwargs(可选字典)功能:提供给搜索函数的关键字参数。包含内容: k:返回的文档数量,默认为4。 score_threshold:用于similarity_score_threshold的最小相关性阈值。 fetch_k:传递给MMR算法的文档数量,默认为20。 lambda_mult:MMR结果的多样性程度,从1(最小多样性)到0(最大多样性),默认为0.5。 filter:基于文档元数据的过滤条件。返回值类型:VectorStoreRetriever功能:一个检索类,用于在VectorStore上执行数据检索操作。

コーディング練習

テクニカル分析の後は、いくつかのステップでコードを実践する必要があります。具体的な手順は次のとおりです。

松ぼっくり情報取得

まずPineconeアカウントを登録し、対応するAPIを取得する必要があります。 Pinecone サービスを呼び出すときに使用するキー Pinecone の登録手順は比較的簡単です。基本的な情報を入力するだけで完了しますので、ここでは詳細を説明しません。下の図に示すように、ユーザーコンソールの「API 「キー」メニューで、キーに対応する「コピー」アイコンを選択して「API」をコピーします。 将来使用するために「キー」を保存します。

次に、 「インデックス」ページ移動してインデックスを作成します。以下に示すように、「セットアップ」を選択します。 による モデル"。

ポップアップダイアログボックスでOpenAIを選択します 埋め込み インデックスとして 構成項目。

最後に、下図のように「作成」をクリックします。 インデックスを作成するには、「インデックス」ボタンをクリックします。

インデックス作成する 完了すると、下の図に対応する情報が表示されます。「rag - per - user」はインデックスの名前で、gcp - starter は環境の名前です。これら 2 つの情報は、 Pinecone を初期化するときに必要です

環境のインストールとパラメータの設定

コードに必要なコンポーネント パッケージをインストールし、次のコマンドでインストールする必要があります

 !pip install openai langchain pinecone-client pypdf tiktoken -q -U

Openai :これは、GPT や DALL-E などの OpenAI の API と対話するために OpenAI が提供する公式 Python ライブラリです。

Langchain :このライブラリは、言語関連のタスクを処理するために使用できます。これには、自然言語処理、機械翻訳、その他の言語テクノロジーのためのツールやモデルが含まれる場合があります。

pinecone-client : Pinecone は、大規模な類似性検索アプリケーションを構築および展開するためのベクター データベースです。 pinecone-client は、Pinecone サービスと対話するためのクライアント ライブラリです。

Pypdf :これは PDF ファイルを操作するための Python ライブラリですこれにより、ユーザーは PDF ドキュメントの読み取り、書き込み、分割、結合、変換を実行できるようになります。

Tiktoken :テキストをセグメント化するために使用されます。

次に、次のようにいくつかのパラメータを割り当てます。

 import os import getpass os.environ["PINECONE_API_KEY"] = getpass.getpass("输入Pinecone key") os.environ["OPENAI_API_KEY"] = getpass.getpass("输入OpenAI Key") PINECONE_API_KEY=os.environ.get("PINECONE_API_KEY") PINECONE_ENVIRONMENT="gcp-starter" PINECONE_INDEX="rag-per-user"

(1)インポートモジュール

import os: 環境変数の管理など、オペレーティング システムと対話するための多くの機能を提供する Python の os モジュールをインポートします。

import getpass : getpass モジュールをインポートします。このモジュールは、入力 (パスワードやキーなど) を画面に表示せずに、ユーザー入力を安全に取得するために使用されます。

(2)環境変数の取得と設定

os.environ["PINECONE_API_KEY"] = getpass.getpass("Enter Pinecone key"): このコード行は、最初に「Enter Pinecone key」というプロンプトを表示し、次にユーザーが Pinecone API キーを入力するのを待ちます。入力内容は画面に表示されません。入力すると、キーは環境変数 PINECONE_API_KEY として設定されます。

os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter OpenAI Key"): 同様に、このコード行は OpenAI の API キーを取得して環境変数 OPENAI_API_KEY として設定するために使用されます。

(3)環境変数の読み取り

PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY") :環境変数から PINECONE_API_KEY の値を読み取り、変数 PINECONE_API_KEY に割り当てます。環境変数が存在しない場合は None を返します。

(4)松ぼっくりに関連する他の変数を設定する

PINECONE_ENVIRONMENT="gcp-starter" :文字列変数 PINECONE_ENVIRONMENT の値を「gcp-starter」に設定します。これは通常、Pinecone サービスが実行される環境を指定するために使用されます。

PINECONE_INDEX="rag-per-user": PINECONE_INDEX 変数を "rag-per-user" に設定します。この値は通常、Pinecone で使用する特定のインデックスを指定するために使用されます。

全体として、このコードの目的は、Pinecone および OpenAI サービスに関連する機密情報 (API キーなど) を安全に取得して保存し、Pinecone サービスに関連するいくつかの構成変数を設定することです。そうすることで、これらのキーと構成をコード内にハードコードしなくても、コードの他の部分で安全に使用できるようになり、セキュリティと柔軟性が向上します。

テキスト埋め込み

次に、 Pinecone をベクトルストレージとして使用し OpenAIを埋め込みジェネレーターとして使用して、言語処理システムを構築します。

 import pinecone from langchain.embeddings.openai import OpenAIEmbeddings from langchain_community.chat_models import ChatOpenAI from langchain.vectorstores import Pinecone pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENVIRONMENT) index = pinecone.Index(PINECONE_INDEX) embeddings = OpenAIEmbeddings() vectorstore = Pinecone(index, embeddings, "text") vectorstore.add_texts(["我的工作职责是为用户提供产品方面的介绍。"], namespace="product-service") vectorstore.add_texts(["我的工作职责是为用户提供技术方面的支持。"], namespace="tech-service") from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import ( ConfigurableField, RunnableBinding, RunnableLambda, RunnablePassthrough, ) template = """基于如下信息回答问题: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) model = ChatOpenAI() retriever = vectorstore.as_retriever()

コードの説明は次のとおりです。

(1)必要なモジュールとクラスをインポートする

import pinecone: Pinecone サービスと対話するための pinecone モジュールをインポートします。

from langchain.embeddings.openai import OpenAIEmbeddings: テキスト埋め込みを生成するために、langchain ライブラリから OpenAIEmbeddings クラスをインポートします。

from langchain_community.chat_models import ChatOpenAI: チャットや質問回答タイプのタスクを処理するためのモデルとなる ChatOpenAI をインポートします。

from langchain.vectorstores import Pinecone: Pinecone サービスでベクター ストアを操作するための Pinecone クラスをインポートします。

(2)Pineconeサービスを初期化し、インデックスを作成する

pinecone.init(api_key=PINECONE_API_KEY, envirnotallow=PINECONE_ENVIRONMENT): 提供された API キーと環境変数を使用して Pinecone サービスを初期化します。

index = pinecone.Index(PINECONE_INDEX): PINECONE_INDEX という名前の Pinecone インデックスを作成またはアクセスします。

(3)埋め込みジェネレータとベクトルストレージの設定

embeddings = OpenAIEmbeddings(): OpenAIEmbeddings をインスタンス化してテキスト埋め込みを生成します。

vectorstore = Pinecone(index,embeddings, "text"): テキスト埋め込みを保存および取得するための Pinecone インスタンスを作成します。ここでは、以前に作成されたインデックスと埋め込みが使用されます。

(4)ベクターストレージにテキストを追加する

vectorstore.add_texts(["私の仕事は、ユーザーに製品の紹介を提供することです。"], namespace="product-service"): 「製品サービス」に関連する情報を表すテキストをベクター ストアに追加します。

vectorstore.add_texts(["私の仕事は、ユーザーに技術サポートを提供することです。"], namespace="tech-service"): 「技術サービス」に関連する情報を表す別のテキストをベクター ストアに追加します。

(5)出力パーサー、プロンプトテンプレート、モデルの設定

langchain_core からいくつかのクラスと関数がインポートされ、言語モデルの出力を処理および解析するために使用できます。

template = "..." および prompt = ChatPromptTemplate.from_template(template): 言語モデルが質問にどのように回答するかをガイドするチャット プロンプト テンプレートを定義します。

model = ChatOpenAI(): チャットや質問への回答タスクの処理に使用できる ChatOpenAI モデルをインスタンス化します。

retriever = vectorstore.as_retriever():保存された埋め込みから関連情報を取得するためのリトリーバーに vectorstore を変換します

このコードは、Pinecone と OpenAI に基づく言語処理システムを設定し、特定のモデルとテンプレートを使用してテキスト情報を保存および取得し、チャットや質問応答タイプのタスクを処理できます。

インデクサーとチェーンの構成

次に、構成されたリトリーバー (configurable_retriever)、プロンプト テンプレート ( Prompt )、モデル ( Model )、および出力パーサー (StrOutputParser)を使用して、処理チェーン (chain) を構築する必要がありますこのチェーン 名前空間に従って実行するために使用されます インデックスされます。コードは次のとおりです。

(1)リトリーバーの設定

configurable_retriever =retriever.configurable_fields(...): このコード行は、構成可能なリトリーバー configurable_retriever を作成します。 ConfigurableField を通じて構成可能なフィールド search_kwargs を定義します。これは、リトリーバーの検索パラメータ (たとえば、ベクター ストレージからデータを取得する方法) を定義するために使用されます。

(2)処理チェーンの構築

処理チェーンは、| 記号で接続された複数の部分で構成され、データがこれらのコンポーネントを順番に通過することを示します。

{"context": configurable_retriever, "question": RunnablePassthrough()}: これはチェーンの最初の部分であり、コンテキストと質問の 2 つの入力が含まれます。コンテキストは configurable_retriever を介して取得されますが、質問は RunnablePassthrough を介して直接渡されます。つまり、質問は処理されずにチェーンの次の部分に渡されます。

  • prompt: 入力データはプロンプトに渡されます。この ChatPromptTemplate オブジェクトは、コンテキストと質問に基づいてプロンプトをフォーマットし、処理のために言語モデルに渡す準備をします。
  • model: 次に、フォーマットされたプロンプトがモデルに渡されます。ここで、model は ChatOpenAI インスタンスであり、提供されたプロンプトに基づいて回答を生成します。
  • StrOutputParser(): 最後に、モデルの出力が StrOutputParser に渡され、モデルの出力が文字列に変換されます。

全体として、この処理チェーンは、取得されたコンテキストと未処理の質問に基づいてフォーマットされたプロンプトを生成し、ChatOpenAI モデルを使用して応答を生成し、応答を文字列に変換します。このアプローチは、コンテキスト情報が必要に応じて動的に取得され、質問がモデルに直接渡されて回答が生成される質問応答システムに適しています。

テスト結果

Cチェーンを作成したら、さまざまな名前空間に対応する職務を以前に定義したので、質問してみましょう。ここでは、職務内容、最初のテスト製品サービスについて直接質問します この名前空間では、どのような回答が返されるかを確認します。

 chain.invoke( "你的工作职责是什么?", config={"configurable": {"search_kwargs": {"namespace": "product-service"}}}, )

結果は次のとおりです

我的工作职责是为用户提供产品方面的介绍。

結果は私たちの期待と一致しており、製品サービス この名前空間 実際に製品の問題に対処するために使用されます。

次に技術サービスをテストします この名前空間への回答。

 chain.invoke( "你的工作职责是什么?", config={"configurable": {"search_kwargs": {"namespace": "tech-service"}}}, )

結果は次のとおりです

我的工作职责是为用户提供技术方面的支持。

返された結果も正しいようです。

ドキュメントライブラリの分離

上記、異なる名前空間を通じて 異なるテキスト情報を追加して、異なるユーザーが異なる名前空間にアクセスできるようにします。 「知識」コンテンツの分離を実現します。ただし、実際のアプリケーション シナリオでは、異なるドキュメントを異なる名前空間にアップロードします。質問をするときは、どのドキュメントがメッセージに応答するかを決定するために、名前空間を指定する必要があります。

そこで私たちは製品サービスをターゲットにしました 技術サービス 2つの異なる名前空間 2 つの異なるドキュメント、 product - service.pdftech - service.pdfをアップロードします 2つの文書の内容は次のとおりです。

product - service.pdfは、質問と回答の形式で提供される製品サービス ナレッジ ベースです顧客サービスに関する具体的なガイダンス、特に返品ポリシーの詳細を提供します。

产品服务知识库(问答形式)问:如果客户询问关于退货政策的具体细节,我们应该如何回答?答:⾸先,礼貌地感谢客户对产品的购买。然后, 详细解释我们的退货政策:客户可以在购买后的30 天内⽆条件退货,产品必须保持原始状态且包装完整。提醒客户保留收据,因为这是退货的必要凭证。 最后,告知客户退货流程,并提供相关表格和联系信息。

tech - service.pdfは、質問と回答の形式で提供される技術サービス ナレッジ ベースです主に技術的な問題、特にスマートロックの故障の問題に対する解決策に関するガイダンスを提供します。

技术服务知识库(问答形式)问:客户如何解决智能锁频繁失灵的问题?答:⾸先,指导客户检查智能锁的电源和电池状态,确认电量是否充⾜。如果电量正常,请引导客户重置智能锁,具体⽅法是⻓按重置键5 秒钟。如果问题仍然存在,请建议客户检查智能锁的软件版本是否最新,并引导进⾏系统更新。若以上步骤⽆法解决问题,建议客户联系技术⽀持以获取进⼀步的帮助。

ドキュメントを入手したら、それをアップロードしてベクター ライブラリ Pinecone に埋め込む必要があります。コードは次のとおりです。

 from langchain.document_loaders import PyPDFLoader from google.colab import drive drive.mount('/content/drive') file_path = '/content/drive/My Drive/files/product-service.pdf' loader = PyPDFLoader(file_path) documents = loader.load_and_split() vectorstore.add_documents(documents, namespace="product-service") file_path = '/content/drive/My Drive/files/tech-service.pdf' loader = PyPDFLoader(file_path) documents = loader.load_and_split() vectorstore.add_documents(documents, namespace="tech-service")

私はcolabを使用しているので 環境なので、このコードは Google Colab 環境で PDF ファイルを読み込み、そのコンテンツをベクター ストアに追加する方法について説明しています。コードの詳細な説明は次のとおりです。

(1)**必要なモジュールとクラスをインポートする**

  • `from langchain.document_loaders import PyPDFLoader`: PDF ファイルを読み込み、その内容を処理可能なドキュメント形式に変換するために使用される `PyPDFLoader` クラスをインポートします。
  • `from google.colab import drive`: Google Colab 環境で Google Drive をマウントするために使用されるモジュールをインポートします。

(2)**Googleドライブをマウントする**

  • `drive.mount('/content/drive')`: このコード行は、Google Drive を Colab のファイル システムにマウントします。これにより、Google ドライブに保存されているファイルに Colab で直接アクセスできるようになります。

(3)**最初のPDFファイルを読み込んで処理する**

  • `file_path = '/content/drive/My Drive/files/product-service.pdf'`: 最初の PDF ファイルへのパスを設定します。
  • `loader = PyPDFLoader(file_path)`: `PyPDFLoader` インスタンスを作成し、ファイル パスを渡して、ファイルをロードする準備をします。
  • `documents = loader.load_and_split()`: `load_and_split` メソッドを使用して PDF ファイルを読み込み、その内容を個別のドキュメントに分割します。これらのドキュメントは通常、PDF の各ページまたは各段落です。

(4)**ベクターストレージにドキュメントを追加する**

  • `vectorstore.add_documents(documents, namespace="product-service")`: 名前空間を「product-service」として指定して、PDF ファイルから読み込まれたドキュメントをベクター ストアに追加します。

(5)**上記の手順を繰り返して2番目のPDFファイルを読み込みます**

  • 2 番目の PDF ファイル `tech-service.pdf` へのパスを設定します。
  • 別の PyPDFLoader インスタンスを作成し、2 番目のファイルをロードします。
  • 2 番目のファイルから読み込まれたドキュメントをベクター ストアに追加します。今回は、名前空間「tech-service」を指定します。

全体として、このコードの目的は、2 つの PDF ファイル (1 つは製品サービスのナレッジ ベースに関するもの、もう 1 つは技術サービスに関するもの) の内容をベクター ストレージ システムに読み込み、後続の検索または取得タスクに使用することです。ファイルの内容を別々のドキュメントに分割し、名前空間を使用して異なるファイルの内容を区別することにより、コードは後で処理するために情報を効果的に整理します。

PDF ドキュメントが埋め込まれたので、作業に取り掛かります。一連の処理ステップ (処理チェーン) を使用して、質問と名前空間が与えられたベクター ストアから質問を取得して回答する ask_question という関数を定義しますコードは次のとおりです。

 from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough def ask_question(question, namespace): retriever = vectorstore.as_retriever() template = """基于如下的上下文内容进行回答[CONTEXT][/CONTEXT]: [CONTEXT]{context}[/CONTEXT]如果你不知道答案,你就回答:我不知道。 Question: {question} """ prompt = ChatPromptTemplate.from_template(template) model = ChatOpenAI() configurable_retriever = retriever.configurable_fields( search_kwargs=ConfigurableField( id="search_kwargs", name="Search Kwargs", description="The search kwargs to use", ) ) chain = ( {"context": configurable_retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) response = chain.invoke( question, config={"configurable": {"search_kwargs": {"namespace": namespace}}}, ) print(response)

コードの説明は次のとおりです。

(1)必要なモジュールとクラスをインポートする

言語モデルの出力を処理および解析するために使用される ChatPromptTemplate、StrOutputParser、RunnablePassthrough などのクラスをインポートします。

(2)ask_question関数を定義する

def ask_question(question, namespace): 2 つのパラメータ (question (尋ねられる質問) と namespace (検索を指定するために使用される名前空間。異なるタイプの知識ベースを表す場合があります)) を受け入れる関数を定義します。

(3)リトリーバーとプロンプトテンプレートを設定する

retriever = vectorstore.as_retriever(): ベクトルストアのリトリーバーを取得します。

template = """...""": 質問とコンテキストのフォーマット方法を指定するチャットプロンプトテンプレートを定義します。ここで設計されたプロンプトは テンプレート 答えがわからない場合は、単に「わかりません」と答えてください。 」 これは、知識ベースから答えが得られない場合は、正直に「わかりません」と答え、答えをでっち上げようとしないことをビッグモデルに伝えます。

prompt = ChatPromptTemplate.from_template(template): 上記のテンプレートを使用して ChatPromptTemplate インスタンスを作成します。

(4)リトリーバーの設定

configurable_retriever =retriever.configurable_fields(...): 検索パラメータ (名前空間など) を調整できる構成可能なリトリーバーを作成します。

(5)処理チェーンの構築

chain = (...): 次の部分で構成される処理チェーンを作成します。

configurable_retriever と RunnablePassthrough を入力として受け取ります。前者はコンテキストを取得するために使用され、後者は質問を直接渡します。

プロンプトを使用して入力をフォーマットします。

モデル (ここでは ChatOpenAI インスタンス) は回答を生成するために使用されます。

StrOutputParser モデルの出力を文字列に変換します。

(6)処理チェーンを呼び出して応答を出力する

response = chain.invoke(...): 処理チェーンを呼び出すには、invoke メソッドを使用し、質問と構成 (指定された名前空間を含む) を渡します。

print(response): 生成された応答を出力します。

この機能は、設定された処理チェーンを使用して質問に自動的に回答します。指定された名前空間のベクトル ストアから関連するコンテキストを取得し、このコンテキストと提供された質問を使用して適切な回答を生成します。これは、特定のナレッジベースに基づいてユーザーの質問に自動的に回答するシナリオに役立ちます。

最後に実行結果を見てみましょう。

次のステートメントを実行します

 ask_question("退货政策", "product-service")

質問とそれに対応する名前空間を渡します返品ポリシーは前のPDFファイルに記載されていたので、今度は製品サービスについて説明します この名前空間 関連するコンテンツを検索します。以下の結果が得られます。

答:客户可以在购买后的30天内无条件退货,产品必须保持原始状态且包装完整。请提醒客户保留收据,因为这是退货的必要凭证。退货流程和相关表格以及联系信息可以提供给客户。

結果は PDF ドキュメントの内容と一致します。

次に、「スマートロックの故障」について質問します。ここでは、「技術-サービス」ではなく、「製品-サービス」について質問します。明らかに、製品-サービス名前空間 保管されている文書は製品サービスに関するものであり、「スマートロックの故障」などの技術サポートの問題に関する知識はありません。したがって、まずコードを実行してから結果を確認します。コードは次のとおりです。

我不知道。

明らかに、上記のプロンプトからの結果「わかりません」 テンプレート 「わかりません」という概念を定義することで、ドキュメントの内容が見つからない場合にビッグモデルに情報を作り上げるのではなく、「わかりません」と正直に答えるように求めます。これは、製品-サービス名前空間に技術サポートに関連する情報が存在しないことも証明しています

最後に、次のコードを通じて技術サービスに問い合わせます。

 ask_question("智能锁失灵", "tech-service")

結果は次のとおりです

回答:首先,指导客户检查智能锁的电源和电池状态,确认电量是否充足。如果电量正常,请引导客户重置智能锁,具体方法是长按重置键5秒钟。如果问题仍然存在,请建议客户检查智能锁的软件版本是否最新,并引导进行系统更新。若以上步骤无法解决问题,建议客户联系技术支持以获取进一步的帮助。

結果は私たちの想定と一致しており、技術サポートに関連する問題は技術サービスからのものである 名前空間から取得します。

要約する

この記事では、LangChain フレームワークでマルチユーザー データ検索を実現し、データ セキュリティとプライバシー保護を確保しながら、検索システムとユーザー エクスペリエンスの柔軟性も確保する効果的な方法を示しますPinecone をベクター データベースとして使用することで、従来のスカラー データベースが高次元ベクター データを処理する際に遭遇する困難を克服します。この記事では、マルチユーザー検索の実装手順を、検索者の構成からチェーンの構築、実際のコードデモンストレーションまで詳細に紹介し、理論から実践まであらゆる側面を包括的にカバーしています。このドキュメントでは具体的な例とコードを提供することで、読者がこれらの概念をより簡単に理解し、実際のマルチユーザー検索タスクに適用できるようにします。

著者について

51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。

<<:  分裂の統一へ! OMG-Seg: すべてのセグメンテーションタスクに対応する 1 つのモデル

>>:  スマートシティの発展: 複数の接続デバイスと人工知能の重要な役割

ブログ    
ブログ    
ブログ    

推薦する

AIGCと因果推論により双方向の

本文に入る前に、まずはJiuzhang Yunji DataCanvasを紹介したいと思います。九張...

Chen Danqi 氏のグループによるマスク言語モデルに関する研究: 15% のマスク率は最適ではないが、40% は維持可能か?

少し前に、スローン財団は2022年度スローン研究賞の受賞者を発表しました。Chen Danqi、Fa...

200 の優れた機械学習チュートリアルの要約「史上最も完全」

この記事には、これまでで最も優れたチュートリアル コンテンツであると一般に考えられている内容が含まれ...

快手とインテルが提携し、KGNN プラットフォームでの大規模リアルタイム動的グラフトレーニングの効率を向上

ショートビデオの推奨やソーシャル推奨などのアプリケーションシナリオでは、推奨システムは大量の急速に変...

LSTMとトランスフォーマーの利点を組み合わせることで、DeepMindの強化学習エージェントはデータ効率を向上させます

[[423163]]近年、マルチエージェント強化学習は飛躍的な進歩を遂げています。例えば、Deep...

Java 実装と読み取り/書き込みロック アルゴリズムの考え方

問題の背景: 複数のスレッドが共有リソースへの読み取りおよび書き込みアクセスを実行します。書き込みス...

ICLR 2022: AI が「目に見えないもの」を認識する方法

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

データセキュリティの向上と人工知能の信頼性の向上

JD Discovery Research InstituteのTao Dacheng所長はかつて、...

...

機械学習における再現率、精度、正確さの指標は何ですか?

以前の記事では、Naive Bayes、KNN、KMeans、EM、線形回帰、ロジスティック回帰など...

現在、中国における知能ロボットの開発状況はどうなっているのでしょうか?

インテリジェントロボットは、知覚、思考、効果の面で人間を完全にシミュレートする機械システムです。近年...

2030年までにAI/自動化によって消滅する6つの技術職

翻訳者 | ジン・ヤンレビュー | Chonglou現在、人工知能と自動化は急速な発展段階に入ってお...

卒業生向け: 機械学習とデータサイエンスのどちらを選ぶべきでしょうか?

[[337428]]データサイエンス業界は 2013 年以降、人気が爆発的に高まり、より幅広い方向...