LangChainとOllamaを使ってRAGを実行する時に、Embeddingの結果を保存しておく方法

はじめに

前回の続きです。
touch-sp.hatenablog.com

Python環境構築

pip install langchain langchain_community langchain_ollama langchain_chroma langchain_huggingface
pip install chromadb
pip install pypdf
pip install sentence-transformers sentencepiece

Pythonスクリプト

PDFは山梨県の公式ホームページから「やまなししぼルトメニュー」に関するものをダウンロードさせて頂きました。
こちらです。

Embeddingの結果を保存

from langchain_community.document_loaders import PyPDFLoader
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.indexes import VectorstoreIndexCreator

loader = PyPDFLoader("salt.pdf")

embed_model_id = "pkshatech/GLuCoSE-base-ja"
embeddings = HuggingFaceEmbeddings(model_name=embed_model_id)

index = VectorstoreIndexCreator(
    vectorstore_cls=Chroma,
    embedding=embeddings,
    vectorstore_kwargs={ "persist_directory": "/tmp/vectorstore"}
).from_loaders([loader])

保存したEmbeddingの結果を再利用

from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_ollama import OllamaLLM
from langchain.indexes.vectorstore import VectorStoreIndexWrapper

embed_model_id = "pkshatech/GLuCoSE-base-ja"
embeddings = HuggingFaceEmbeddings(model_name=embed_model_id)

llm = OllamaLLM(model="gemma2:27b")

vectorstore = Chroma(
    persist_directory="/tmp/vectorstore",
    embedding_function=embeddings
)
index = VectorStoreIndexWrapper(vectorstore=vectorstore)

query = "しぼルトメニューとは何ですか?日本語で回答して下さい。"

answer = index.query(query, llm=llm)
print(answer)

バージョン固定(2025年1月9日)

LangChainはバージョンが違えば書き方が大きく異なる場合があります。

pip install langchain langchain_community langchain_ollama langchain_chroma
pip install pypdf
chromadb==0.5.23
langchain-chroma==0.2.0
langchain-community==0.3.14
langchain-core==0.3.29
langchain-ollama==0.2.2
langchain-text-splitters==0.3.5
langsmith==0.2.10
ollama==0.4.5
pypdf==5.1.0

Pythonスクリプト

from langchain_community.document_loaders import PyPDFLoader
from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings

loader = PyPDFLoader("salt.pdf")

embed_model_id = "mxbai-embed-large:latest"
embeddings = OllamaEmbeddings(model=embed_model_id)

index = Chroma.from_documents(
    documents=loader.load(),
    embedding=embeddings,
    persist_directory = "./vectorstore"
)
from langchain_chroma import Chroma
from langchain_ollama import OllamaLLM, OllamaEmbeddings
from langchain.indexes.vectorstore import VectorStoreIndexWrapper

embed_model_id = "mxbai-embed-large:latest"
embeddings = OllamaEmbeddings(model=embed_model_id)

llm = OllamaLLM(model="gemma2:27b")

vectorstore = Chroma(
    persist_directory="./vectorstore",
    embedding_function=embeddings
)

index = VectorStoreIndexWrapper(vectorstore=vectorstore)

query = "しぼルトメニューとは何ですか?日本語で回答して下さい。"

answer = index.query(query, llm=llm)
print(answer)

結果

しぼルトメニューは、山梨県が推進する「健康的な食生活」を目的とした取り組みの一環として誕生した、塩分やカロリーを抑えた、栄養バランスの取れたメニューです。

具体的には、レストランや飲食店などが、山梨県の推奨する基準に基づいて、健康志向のメニューを開発・提供しています。しぼルトメニューは、県民の健康増進に貢献するとともに、地元食材の活用や食文化の振興にもつながっています。