🌲

Vald+LangChainで行う類似検索チュートリアル

2023/10/10に公開

今日において加速度的に進歩を遂げているAI関連技術の中で、大規模言語モデル(Large Language Model、LLM)はかなりの注目を集めており、ChatGPTなどに代表されるように一般的に身近なサービスとして、多様な用途で用いられ始めています。

さらに、最近特に注目を集めているのが、Retrieval Augmented Generation(RAG)という手法で、質問応答やテキスト生成のタスクにおいて有望な成果を示しています。
RAGの簡単な説明としては外部の知識データベース(事前に訓練されたベクトルで構築されたベクトル検索エンジンなど)とLLMを組み合わせることで、より洗練された情報確度の高いレスポンスを生成することができる仕組みです。

そのような流れの中で、私たちが開発しているValdなどの「ベクトル検索エンジン」と「LLM」を繋ぐプロダクトもまた多く開発・提供されています。

その中の1つとして、LangChainというライブラリに私たちは注目しており、先日、Valdがその機能の一部として新たに使えるようになりました🎉

私たちはLangChainやRAGなどに代表されるように、今後もベクトル検索とLLMを繋ぐ様々な動きが良い方向に進んでいくことを期待しています。

その最初の一歩として、本投稿では、LangChainのVectorStoreとしてValdを利用したデモの実行を行います。

準備

本チュートリアルを進めるにあたり必要な依存について列挙します。必要に応じて、準備してください。
また、Vald clusterの構築などの事前準備は過去の記事を参考にしてください。

  • Helm
  • Kubernetes cluster: GKE, EKS, k3d, kindなど
  • LangChain
  • sentence-transformers
  • vald-client-python

過去の記事:

本記事では、768次元のベクトルを扱うため、設定ファイル(example/helm/values.yaml)の修正が必要になります。

./example/helm/values.yaml
## vald-agent-ngt settings
agent:
  ngt:
    dimension: 768

サンプルコードによるデモ

データセットとしてLangChain内のテキストファイル state_of_the_union.txt を使用します。
必要に応じてダウンロードしてください。

curl -LO https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/extras/modules/state_of_the_union.txt

初めに、必要なpacakgeをimportします。

from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Vald

次に、データセットとして使用するテキストファイルをロードし, VectorStore(Vald)にInsertします。
必要に応じて host/port の部分を修正してください。

raw_documents = TextLoader('state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
embeddings = HuggingFaceEmbeddings()
db = Vald.from_documents(documents, embeddings, host="localhost", port=8080)

最後に検索を行います。
Valdで検索を行うためには CreateIndex の処理を完了しIndexの構築を待たなければならないため、環境によっては数秒程度待機する必要があることに注意してください。

query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)
出力例
As Frances Haugen, who is here with us tonight, has shown, we must hold social media platforms accountable for the national experiment they’re conducting on our children for profit. 

It’s time to strengthen privacy protections, ban targeted advertising to children, demand tech companies stop collecting personal data on our children. 

And let’s get all Americans the mental health services they need. More people they can turn to for help, and full parity between physical and mental health care. 

Third, support our veterans. 

Veterans are the best of us. 

I’ve always believed that we have a sacred obligation to equip all those we send to war and care for them and their families when they come home. 

My administration is providing assistance with job training and housing, and now helping lower-income veterans get VA care debt-free.  

Our troops in Iraq and Afghanistan faced many dangers.

以上が基本的な使い方になります。

Similarity search by vector

検索を行う際には、クエリだけでなくベクトルを用いて検索をすることもできます。

embedding_vector = embeddings.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
出力例
As Frances Haugen, who is here with us tonight, has shown, we must hold social media platforms accountable for the national experiment they’re conducting on our children for profit. 

It’s time to strengthen privacy protections, ban targeted advertising to children, demand tech companies stop collecting personal data on our children. 

And let’s get all Americans the mental health services they need. More people they can turn to for help, and full parity between physical and mental health care. 

Third, support our veterans. 

Veterans are the best of us. 

I’ve always believed that we have a sacred obligation to equip all those we send to war and care for them and their families when they come home. 

My administration is providing assistance with job training and housing, and now helping lower-income veterans get VA care debt-free.  

Our troops in Iraq and Afghanistan faced many dangers.

Similarity search with score

検索の結果として、類似検索のスコアも含めて返却することが可能です。

docs_and_scores = db.similarity_search_with_score(query)
print(docs_and_scores[0])
出力例
(Document(page_content='As Frances Haugen, who is here with us tonight, has shown, we must hold social media platforms accountable for the national experiment they’re conducting on our children for profit. \n\nIt’s time to strengthen privacy protections, ban targeted advertising to children, demand tech companies stop collecting personal data on our children. \n\nAnd let’s get all Americans the mental health services they need. More people they can turn to for help, and full parity between physical and mental health care. \n\nThird, support our veterans. \n\nVeterans are the best of us. \n\nI’ve always believed that we have a sacred obligation to equip all those we send to war and care for them and their families when they come home. \n\nMy administration is providing assistance with job training and housing, and now helping lower-income veterans get VA care debt-free.  \n\nOur troops in Iraq and Afghanistan faced many dangers.', metadata={}), 0.7476236820220947)

Maximal Marginal Relevance Search (MMR)

Valdによる検索の結果に対して、Maximal Marginal Relevance Search(MMR)と呼ばれるアルゴリズムを用いてリランキングすることが可能です。

retriever = db.as_retriever(search_type="mmr")
docs = retriever.get_relevant_documents(query)
print(docs[0].page_content)
出力例
As Frances Haugen, who is here with us tonight, has shown, we must hold social media platforms accountable for the national experiment they’re conducting on our children for profit. 

It’s time to strengthen privacy protections, ban targeted advertising to children, demand tech companies stop collecting personal data on our children. 

And let’s get all Americans the mental health services they need. More people they can turn to for help, and full parity between physical and mental health care. 

Third, support our veterans. 

Veterans are the best of us. 

I’ve always believed that we have a sacred obligation to equip all those we send to war and care for them and their families when they come home. 

My administration is providing assistance with job training and housing, and now helping lower-income veterans get VA care debt-free.  

Our troops in Iraq and Afghanistan faced many dangers.

また、VectorStoreの対応する関数を使って直接結果を取得することも可能です。

db.max_marginal_relevance_search(query, k=2, fetch_k=10)

まとめ

本記事では、LangChainを用いた類似検索のデモをチュートリアル形式で行いました。

Valdの更に詳しい内容については、下記ドキュメントを参考にしてください。

https://vald.vdaas.org/docs/

質問等がありましたら、下記Slack WSに投稿してください。
また、ValdへのContributionもいつでもお待ちしています。

https://join.slack.com/t/vald-community/shared_invite/zt-db2ky9o4-R_9p2sVp8xRwztVa8gfnPA

Mediumでblog(英語)を公開しているので、こちらも是非ご覧ください。

https://medium.com/@vdaas-vald

公式X(Twitter)アカウントはこちら

https://twitter.com/vdaas_vald


Valdの関連記事

https://techblog.yahoo.co.jp/entry/2021061430159867/

Discussion