🐙

LangChainからMilvusを使ってみた

2023/05/19に公開

想定読者

  • LangChain からベクターデータベースを使う方法に興味がある方
  • LangChain から Milvus を使う方法を知りたい方

やってみた

前提

Google Colab 上で試していきます。
以下の公式ドキュメントに沿って進めますが、詰まった箇所があったので補足しながら進めていきます。

https://python.langchain.com/en/latest/modules/indexes/vectorstores/examples/milvus.html

また、Milvus は EC2 上に立てている前提で進めます。(こちらの過程は別ブログを後日紹介予定です)

ダミーデータの準備

LlamaIndex のリポジトリにあるダミーデータを利用します。

https://github.com/hwchase17/langchain/blob/master/docs/modules/state_of_the_union.txt

Google Colab を開きます。左袖から以下を作成します。

  • ファイル:state_of_the_union.txt (データは上記ダミーデータをコピペ)

コードの準備

パッケージのインストール

必要なパッケージをインストールします。

!pip install langchain
!pip install openai
!pip install pymilvus
!pip uninstall grpcio -y
!pip install grpcio==1.53.0
!pip install tiktoken
  • Google Colab の 2023/05/05 のリリースノートによると、grpcio のバージョンが 1.53.0 -> 1.54.0 になったということで、一度、アンインストールした後、必要なバージョンを再インストールしています。
  • 後ほど実行する Milvus.from_documents() に必要な tiktoken を予めインストールしています。
  • Google Colab にランタイムの再起動を求められた場合は、再起動してもう一度パッケージインストールしてください。

https://colab.research.google.com/notebooks/relnotes.ipynb#scrollTo=lMM_RgGAmksZ

環境変数の設定

必要な環境変数を設定します。

import os
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass('OpenAI API Key:')
os.environ["MILVUS_HOST"] = getpass.getpass('Milvus Host:')
os.environ["MILVUS_PORT"] = getpass.getpass('Milvus Port:')
os.environ["MILVUS_USER"] = getpass.getpass('Milvus User:')
os.environ["MILVUS_PWD"] = getpass.getpass('Milvus Password:')

実行すると、プロンプトで入力を求められるので、適切な値を設定ください。

プロンプトのイメージ
OpenAI API Key:··········
Milvus Host:··········
Milvus Port:··········
Milvus User:··········
Milvus Password:··········

パッケージのインポート

後ほど利用するパッケージをインポートしておきます。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Milvus
from langchain.document_loaders import TextLoader

インデックス作成準備

用意したダミーデータを用いてインデックス作成の準備をします。

from langchain.document_loaders import TextLoader
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

インデックス作成&ベクターデータベースへの保存

Milvus.from_documents() を実行してインデックス作成とベクターデータベースへの保存を行います。

vector_db = Milvus.from_documents(
    docs,
    embeddings,
    connection_args={
          "host": os.environ["MILVUS_HOST"],
          "port": os.environ["MILVUS_PORT"],
          "user": os.environ["MILVUS_USER"],
          "password": os.environ["MILVUS_PWD"],
        }
)

クエリ

ベクターデータベースに対してクエリを投げます。

query = "What did the president say about Ketanji Brown Jackson"
docs = vector_db.similarity_search(query)

以下の通り、公式ドキュメントと同じレスポンスを得ることができました!

Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections.

Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service.

One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.

And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.

おわりに

最後まで読んでいただきありがとうございました。
LangChain から Milvus の利用を簡単に試すことができました。今後、この環境を利用して、Milvus の検証をもっとやっていきたいと思います。
参考になった場合は、Like やバッジを贈っていただけると励みになります!それではまた!

参考

https://book.st-hakky.com/docs/indexes-of-langchain/

Discussion