著者 | 崔昊 レビュー | Chonglou まとめこの記事では、さまざまなユーザー データの分離を確実に行う方法について説明し、さまざまな取得要件に適応するための柔軟な構成オプションを提供します。 この記事ではまず、データ権限管理、検索システムの柔軟性、ユーザー エクスペリエンスの問題など、マルチユーザー データ検索の背景と課題について説明します。次に、高次元ベクトルデータを処理するベクトルデータベースとして Pinecone を使用する利点に特に重点を置いた技術分析を実行します。このホワイト ペーパーでは、マルチユーザー サポートのためのリトリーバー検証、チェーン構成フィールドの追加、チェーンを呼び出すための構成可能なフィールドの使用など、データの保存と取得の重要な手順について詳しく説明します。最後に、実際のコードを使用して、環境設定、テキストの埋め込み、インデクサーとチェーン構築の構成、特定の名前空間を介したドキュメント ライブラリの分離のテスト結果など、LangChain でマルチユーザー検索を実装する方法を示しました。 背景マルチユーザー環境でデータを取得するには、システムが異なるユーザーのデータを区別して管理できる必要があります。これには、データのセキュリティとプライバシーの保護だけでなく、さまざまなユーザーのデータ検索ニーズに柔軟に対応できる検索システムも必要です。市場分析から技術文書に至るまで、さまざまな種類の情報を保存する巨大なナレッジベース システムを備えた大企業があるとします。企業内には研究開発、マーケティング、人事など複数の部門があり、各部門にはナレッジベースに対する異なるデータ アクセス要件があります。情報セキュリティを確保するために、企業はデータに対する権限制御を実装し、各部門が対応する関連データのみにアクセスできるようにする必要があります。 このビジネス シナリオでは、さまざまなユーザーのデータ取得ニーズを満たしながら、データ セキュリティを確保する方法が最大の課題となります。具体的な質問は次のとおりです。 データ権限管理: 各ユーザーが許可されたデータにのみアクセスできるようにするにはどうすればよいでしょうか? 検索システムの柔軟性: さまざまなユーザーの検索ニーズに柔軟に対応しながら、データのセキュリティを保護できるシステムをどのように設計するか? ユーザー エクスペリエンス: 他の部門からデータを漏らすことなく、高速かつ正確な検索結果を提供するにはどうすればよいでしょうか。 テクニカル分析LangChain は、大量のデータから特定のクエリに最も関連性の高い情報を検索するという検索タスクの処理に特に適した大規模なアプリケーションフレームワークです。この記事では、LangChain フレームワークでマルチユーザー検索を実装する方法に焦点を当てます。次に、複数のユーザーが異なるデータを取得できるようにするには、データの保存とデータの取得という 2 つの問題を解決する必要があります。 データストレージ推奨システムやセマンティック検索などの AI アプリケーションでは、大量の高次元ベクトル データを処理して取得する必要があります。したがって、大規模なベクトルデータを処理する場合には、次のような問題に直面します。
上記の問題を解決するために、この例では 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 メソッドが含まれています。この検索エンジンは複数の検索タイプを提供しており、ユーザーはさまざまなニーズに基づいてカスタマイズされたベクター データ検索を実行できます。 このメソッドの主なパラメータは次のとおりです。 コーディング練習テクニカル分析の後は、いくつかのステップでコードを実践する必要があります。具体的な手順は次のとおりです。 松ぼっくり情報取得まずPineconeアカウントを登録し、対応するAPIを取得する必要があります。 Pinecone サービスを呼び出すときに使用するキー。 Pinecone の登録手順は比較的簡単です。基本的な情報を入力するだけで完了しますので、ここでは詳細を説明しません。下の図に示すように、ユーザーコンソールの「API 「キー」メニューで、キーに対応する「コピー」アイコンを選択して「API」をコピーします。 将来使用するために「キー」を保存します。 次に、 「インデックス」ページに移動してインデックスを作成します。以下に示すように、「セットアップ」を選択します。 による モデル"。 ポップアップダイアログボックスでOpenAIを選択します 埋め込み インデックスとして 構成項目。 最後に、下図のように「作成」をクリックします。 インデックスを作成するには、「インデックス」ボタンをクリックします。 インデックスを作成する 完了すると、下の図に対応する情報が表示されます。「rag - per - user」はインデックスの名前で、gcp - starter は環境の名前です。これら 2 つの情報は、 Pinecone を初期化するときに必要です。 環境のインストールとパラメータの設定コードに必要なコンポーネント パッケージをインストールし、次のコマンドでインストールする必要があります。 Openai :これは、GPT や DALL-E などの OpenAI の API と対話するために OpenAI が提供する公式 Python ライブラリです。 Langchain :このライブラリは、言語関連のタスクを処理するために使用できます。これには、自然言語処理、機械翻訳、その他の言語テクノロジーのためのツールやモデルが含まれる場合があります。 pinecone-client : Pinecone は、大規模な類似性検索アプリケーションを構築および展開するためのベクター データベースです。 pinecone-client は、Pinecone サービスと対話するためのクライアント ライブラリです。 Pypdf :これは PDF ファイルを操作するための Python ライブラリです。これにより、ユーザーは PDF ドキュメントの読み取り、書き込み、分割、結合、変換を実行できるようになります。 Tiktoken :テキストをセグメント化するために使用されます。 次に、次のようにいくつかのパラメータを割り当てます。 (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を埋め込みジェネレーターとして使用して、言語処理システムを構築します。 コードの説明は次のとおりです。 (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 を介して直接渡されます。つまり、質問は処理されずにチェーンの次の部分に渡されます。
全体として、この処理チェーンは、取得されたコンテキストと未処理の質問に基づいてフォーマットされたプロンプトを生成し、ChatOpenAI モデルを使用して応答を生成し、応答を文字列に変換します。このアプローチは、コンテキスト情報が必要に応じて動的に取得され、質問がモデルに直接渡されて回答が生成される質問応答システムに適しています。 テスト結果Cチェーンを作成したら、さまざまな名前空間に対応する職務を以前に定義したので、質問してみましょう。ここでは、職務内容、最初のテスト製品、サービスについて直接質問します この名前空間では、どのような回答が返されるかを確認します。 結果は次のとおりです。
結果は私たちの期待と一致しており、製品とサービス この名前空間 実際に製品の問題に対処するために使用されます。 次に技術とサービスをテストします この名前空間への回答。 結果は次のとおりです。
返された結果も正しいようです。 ドキュメントライブラリの分離上記、異なる名前空間を通じて 異なるテキスト情報を追加して、異なるユーザーが異なる名前空間にアクセスできるようにします。 「知識」コンテンツの分離を実現します。ただし、実際のアプリケーション シナリオでは、異なるドキュメントを異なる名前空間にアップロードします。質問をするときは、どのドキュメントがメッセージに応答するかを決定するために、名前空間を指定する必要があります。 そこで私たちは製品とサービスをターゲットにしました 技術とサービス 2つの異なる名前空間 2 つの異なるドキュメント、 product - service.pdfとtech - service.pdfをアップロードします。 2つの文書の内容は次のとおりです。 product - service.pdfは、質問と回答の形式で提供される製品サービス ナレッジ ベースです。顧客サービスに関する具体的なガイダンス、特に返品ポリシーの詳細を提供します。
tech - service.pdfは、質問と回答の形式で提供される技術サービス ナレッジ ベースです。主に技術的な問題、特にスマートロックの故障の問題に対する解決策に関するガイダンスを提供します。
ドキュメントを入手したら、それをアップロードしてベクター ライブラリ Pinecone に埋め込む必要があります。コードは次のとおりです。 私はcolabを使用しているので 環境なので、このコードは Google Colab 環境で PDF ファイルを読み込み、そのコンテンツをベクター ストアに追加する方法について説明しています。コードの詳細な説明は次のとおりです。 (1)**必要なモジュールとクラスをインポートする**
(2)**Googleドライブをマウントする**
(3)**最初のPDFファイルを読み込んで処理する**
(4)**ベクターストレージにドキュメントを追加する**
(5)**上記の手順を繰り返して2番目のPDFファイルを読み込みます**
全体として、このコードの目的は、2 つの PDF ファイル (1 つは製品サービスのナレッジ ベースに関するもの、もう 1 つは技術サービスに関するもの) の内容をベクター ストレージ システムに読み込み、後続の検索または取得タスクに使用することです。ファイルの内容を別々のドキュメントに分割し、名前空間を使用して異なるファイルの内容を区別することにより、コードは後で処理するために情報を効果的に整理します。 PDF ドキュメントが埋め込まれたので、作業に取り掛かります。一連の処理ステップ (処理チェーン) を使用して、質問と名前空間が与えられたベクター ストアから質問を取得して回答する ask_question という関数を定義します。コードは次のとおりです。 コードの説明は次のとおりです。 (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): 生成された応答を出力します。 この機能は、設定された処理チェーンを使用して質問に自動的に回答します。指定された名前空間のベクトル ストアから関連するコンテキストを取得し、このコンテキストと提供された質問を使用して適切な回答を生成します。これは、特定のナレッジベースに基づいてユーザーの質問に自動的に回答するシナリオに役立ちます。 最後に実行結果を見てみましょう。 次のステートメントを実行します。 質問とそれに対応する名前空間を渡します。返品ポリシーは前のPDFファイルに記載されていたので、今度は製品サービスについて説明します。 この名前空間 関連するコンテンツを検索します。以下の結果が得られます。
結果は PDF ドキュメントの内容と一致します。 次に、「スマートロックの故障」について質問します。ここでは、「技術-サービス」ではなく、「製品-サービス」について質問します。明らかに、製品-サービス名前空間 保管されている文書は製品サービスに関するものであり、「スマートロックの故障」などの技術サポートの問題に関する知識はありません。したがって、まずコードを実行してから結果を確認します。コードは次のとおりです。
明らかに、上記のプロンプトからの結果「わかりません」 テンプレート 「わかりません」という概念を定義することで、ドキュメントの内容が見つからない場合にビッグモデルに情報を作り上げるのではなく、「わかりません」と正直に答えるように求めます。これは、製品-サービス名前空間に技術サポートに関連する情報が存在しないことも証明しています。 最後に、次のコードを通じて技術サービスに問い合わせます。 結果は次のとおりです。
結果は私たちの想定と一致しており、技術サポートに関連する問題は技術サービスからのものである。 名前空間から取得します。 要約するこの記事では、LangChain フレームワークでマルチユーザー データ検索を実現し、データ セキュリティとプライバシー保護を確保しながら、検索システムとユーザー エクスペリエンスの柔軟性も確保する効果的な方法を示します。 Pinecone をベクター データベースとして使用することで、従来のスカラー データベースが高次元ベクター データを処理する際に遭遇する困難を克服します。この記事では、マルチユーザー検索の実装手順を、検索者の構成からチェーンの構築、実際のコードデモンストレーションまで詳細に紹介し、理論から実践まであらゆる側面を包括的にカバーしています。このドキュメントでは具体的な例とコードを提供することで、読者がこれらの概念をより簡単に理解し、実際のマルチユーザー検索タスクに適用できるようにします。 著者について51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。 |
<<: 分裂の統一へ! OMG-Seg: すべてのセグメンテーションタスクに対応する 1 つのモデル
>>: スマートシティの発展: 複数の接続デバイスと人工知能の重要な役割
本文に入る前に、まずはJiuzhang Yunji DataCanvasを紹介したいと思います。九張...
少し前に、スローン財団は2022年度スローン研究賞の受賞者を発表しました。Chen Danqi、Fa...
この記事には、これまでで最も優れたチュートリアル コンテンツであると一般に考えられている内容が含まれ...
ショートビデオの推奨やソーシャル推奨などのアプリケーションシナリオでは、推奨システムは大量の急速に変...
[[423163]]近年、マルチエージェント強化学習は飛躍的な進歩を遂げています。例えば、Deep...
問題の背景: 複数のスレッドが共有リソースへの読み取りおよび書き込みアクセスを実行します。書き込みス...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
[[177815]]著者: Carl Johan Ivarsson (Qlucore)厳選記事 | ...
JD Discovery Research InstituteのTao Dacheng所長はかつて、...
以前の記事では、Naive Bayes、KNN、KMeans、EM、線形回帰、ロジスティック回帰など...
インテリジェントロボットは、知覚、思考、効果の面で人間を完全にシミュレートする機械システムです。近年...
翻訳者 | ジン・ヤンレビュー | Chonglou現在、人工知能と自動化は急速な発展段階に入ってお...
Baidu Smart Cloud は、中国で最も繁栄した AI ネイティブ産業エコシステムを確立し...
[[337428]]データサイエンス業界は 2013 年以降、人気が爆発的に高まり、より幅広い方向...