LlamaIndex は、さまざまなアプリケーションを利用できる主要なオープンソース データ検索フレームワークであり、典型的なアプリケーションの 1 つは、企業内でのチャット ロボットの構築です。
企業にとって、文書の数は増加し続けるため、文書管理はますます困難になります。したがって、多くの企業は社内のナレッジベースに基づいてチャットボットを構築することになります。構築プロセス中は、データの切り取り方法、保存するメタデータ、クエリのルーティング方法という 3 つの重要な点に注意する必要があります。
01.
チャットボットの構築に LlamaIndex を使用する理由は何ですか?
前回の記事では、Zilliz Cloud (フルマネージド Milvus クラウド サービス) を使用して、基本的な検索拡張生成(RAG) (https://zilliz.com/use-cases/llm-retrieval-augmented-generation) チャットボットを構築しました。このチュートリアルでは、Zilliz Cloud の無料バージョンを引き続き使用できますが、独自のMilvus (https://milvus.io/) インスタンスを使用して、 Milvus Lite (https://milvus.io/ ) をすぐに起動して使用することもできます。 )ノートブック内。docs
前回の記事では、記事を多数の小さなテキスト ブロックに分割しました。「大規模言語モデルとは何ですか?」という質問で単純な検索を実行すると、返されるテキストは意味的に質問と類似したテキスト ブロックですが、質問には答えません。したがって、このプロジェクトでは、バックエンドとして同じベクトル データベースを使用しますが、より良い Q&A 結果をさらに得るために、異なる検索プロセスを使用します。このプロジェクトでは、LlamaIndex を使用して効率的な検索を実現します。
LlamaIndex (https://zilliz.com/product/integrations/Llamaindex) は、大規模な言語モデル上でデータを処理するのに役立つフレームワークです。LlamaIndex によって提供される主な抽象化の 1 つは「インデックス」です。インデックスはデータ分散のモデルです。これに基づいて、LlamaIndex は、これらのインデックスをクエリ エンジンに変換する機能も提供します。クエリ エンジンは、大規模な言語モデルと埋め込みモデルを利用して、効率的なクエリを編成し、関連する結果を取得します。
02.
データ サイエンスに向けたチャットにおける LlamaIndex と Milvus の役割
では、LlamaIndex はデータ取得の調整にどのように役立つのでしょうか? Milvus はチャットボットの構築にどのように役立ちますか? LlamaIndex の永続ベクトル ストアのバックエンドとして Milvus を使用できます。Milvus または Zilliz Cloud インスタンスを使用すると、Python ネイティブの非調整アプリケーションから LlamaIndex 主導の検索アプリケーションに切り替えることができます。
ノートブックをセットアップし、Zilliz と LlamaIndex を使用する
前回の記事で述べたように、このシリーズのプロジェクトでは、データ サイエンスに向けたチャット | パーソナル データ ナレッジ ベースを使用して RAG チャットボットを構築するにはどうすればよいですか? (上)では、Zilliz Cloud を選択します。Zilliz Cloud に接続する手順は、基本的に Milvus に接続する手順と同じです。Milvus に接続し、Milvus をローカル ベクトルとして保存する方法については、ベクトル埋め込みを比較する例を参照してください。
ノートブックでは、3 つのライブラリをインストールし、 pip install llama-index python-dotenv openaiを通じてインストールし、 python-dotenvを使用して環境変数を管理する必要があります 。
インポートを取得した後、load_doten v ()を使用する必要があります。.envファイルをロードします。このプロジェクトに必要な 3 つの環境変数は、OpenAI API キー、Zilliz Cloud クラスターの URI、および Zilliz Cloud クラスターのトークンです。
! pip install llama-index python-dotenv openai
import osfrom dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
zilliz_uri = os.getenv("ZILLIZ_URI")
zilliz_token = os.getenv("ZILLIZ_TOKEN")
既存のコレクションを LlamaIndex に取り込む
既存のコレクションを LlamaIndex に取り込む際には、いくつかの小さな課題があります。LlamaIndex には、ベクトル データベース コレクションを作成およびアクセスするための独自の構造がありますが、ここでは直接使用されません。ネイティブの LlamaIndex ベクター ストレージ インターフェイスと独自のモデルの使用の主な違いは、埋め込みベクターとメタデータにアクセスする方法です。このチュートリアルを実装するために、いくつかのコードも作成し、LlamaIndex (https://github.com/run-llama/llama_index/commit/78ed06c95313e933cc255ac17bcd592e3f4b2be1) プロジェクトに貢献しました。
LlamaIndex はデフォルトで OpenAI の埋め込みを使用しますが、私たちは HuggingFace モデルを使用して埋め込みを生成しました。したがって、正しい埋め込みモデルを渡す必要があります。さらに、今回はテキストを保存するために別のフィールドが使用されます。「段落」を使用しますが、LlamaIndex はデフォルトで「_node_content」を使用します。
この部分では、LlamaIndex から 4 つのモジュールをインポートする必要があります。まず、 Milvus と LlamaIndex を使用するには、 MilvusVectorStor e が 必要です。また、Milvus をベクトル ストレージ インデックスとして使用するためのVectorStoreIndexモジュールと、使用したいサービスを渡すための ServiceContext モジュールも必要です。最後に、HuggingFaceEmbeddingモジュールをインポートして、Hugging Face のオープンソース埋め込みモデルを使用できるようにします。
埋め込みモデルの取得に関しては、HuggingFaceEmbedding オブジェクトを宣言してモデル名を渡すだけです。このチュートリアルでは MiniLM L12 モデルを使用します。次に、ServiceContext オブジェクトを作成します。埋め込みモデルを渡します。
from llama_index.vector_stores import MilvusVectorStore
from llama_index import VectorStoreIndex, ServiceContext
from llama_index.embeddings import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L12-v2")
service_context = ServiceContext.from_defaults(embed_model=embed_model)
もちろん、Milvus ベクター ストアにも接続する必要があります。このステップでは、コレクションの URI、コレクションにアクセスするためのトークン、使用するコレクション名 (デフォルトは「Llamalection」)、使用する類似タイプ、テキストを格納するメタデータ フィールドに対応するキーの 5 つのパラメーターを渡します。 . .
vdb = MilvusVectorStore(
uri = zilliz_uri,
token = zilliz_token,
collection_name = "tds_articles",
similarity_metric = "L2",
text_key="paragraph"
)
LlamaIndex を使用して Milvus コレクションをクエリする
现在,我们已经连接至现有的 Milvus Collection 并拉取了需要的模型,接下来讲讲如何进行查询。
首先,创建一个 ServiceContext 对象,以便可以传递 Milvus 向量数据库。然后,将 Milvus Collection 转化为向量存储索引。这也是通过上面创建的 ServiceContext 对象传入 embedding 模型的地方。
有了一个初始化的向量存储索引对象后,只需要调用as_query_engine()函数将其转化为查询引擎。本教程中,通过使用与之前相同的问题 “什么是大型语言模型?”来比较直接的语义搜索和使用 LlamaIndex 查询引擎的区别。
vector_index = VectorStoreIndex.from_vector_store(vector_store=vdb, service_context=service_context)
query_engine = vector_index.as_query_engine()
response = query_engine.query("What is a large language model?")
为了使输出更易于阅读,我导入了pprint并用它来打印响应。
from pprint import pprint
pprint(response)
下方是我们使用 LlamaIndex 进行检索得到的响应,这比简单的语义搜索得到的结果要好得多:
03.
总结
本次,我们使用了 LlamaIndex 和现有的 Milvus Collection 来改进上一篇文章中搭建的聊天机器人。上一个版本使用了简单的语义相似性通过向量搜索来寻找答案,但结果并不是很好。相较之下,用 LlamaIndex 搭建查询引擎返回的结果更好。
本项目最大的挑战是如何带入已有的 Milvus Collection。现有的 Collection 并没有使用 embedding 向量维度的默认值,也没有使用用于存储文本的元数据字段的默认值。这两点的解决方案是通过 ServiceContext 传递特定的 embedding 模型和在创建 Milvus Vector Store 对象时定义正确的文本字段。
创建向量存储对象后,使用 Hugging Face embedding 将其转化为索引,然后将该索引转化为查询引擎。查询引擎利用 LLM 来理解问题、收集响应和返回更好的响应。
本文作者
本文分享自微信公众号 - ZILLIZ(Zilliztech)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。