LangChainとOllamaを使ってローカル環境でRAG(Retrieval-Augmented Generation)を実行する

はじめに

今回、用意したPDFの内容をもとにユーザの質問に回答してもらいました。

別にPDFでなくても良いのですがざっくり言うとそういったのが「RAG」です。

Python環境構築

pip install langchain langchain_community langchain_ollama langchain_chroma
pip install chromadb
pip install pypdf

Pythonスクリプト

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

from langchain_community.document_loaders import PyPDFLoader
from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain_ollama import OllamaLLM
from langchain.indexes import VectorstoreIndexCreator

loader = PyPDFLoader("salt.pdf")

embeddings = OllamaEmbeddings(model="mxbai-embed-large")
llm = OllamaLLM(model="gemma2:27b")

index = VectorstoreIndexCreator(
    vectorstore_cls=Chroma,
    embedding=embeddings
).from_loaders([loader])

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

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

結果

この文章から、しぼルトメニューは「健康に配慮したメニュー」であると推測できます。 具体的には、塩分を控えめにしたり、野菜 を多く使ったりして作られた料理のことでしょう。

また、山梨県が推進する取り組みの一環として、「やまなししぼルトメニュー届出書」を提出して審査を受け、基準を満たせば「やまなししぼルトメニュー登録台帳」に登録されるようです。登録された事業者はロゴマークの使用が認められ、県民への周知活動にも力を入れています。

補足

HuggingFaceEmbeddings

OllamaEmbeddingsの代わりにHuggingFaceEmbeddingsを使うことも可能です。

pip install sentence-transformers
pip install langchain_huggingface

モデルによっては「sentencepiece」も必要になります。

pip install sentencepiece

intfloat/multilingual-e5-large

from langchain_huggingface import HuggingFaceEmbeddings
embed_model_id = "intfloat/multilingual-e5-large"
embeddings = HuggingFaceEmbeddings(model_name=embed_model_id)

oshizo/sbert-jsnli-luke-japanese-base-lite
「sentencepiece」が必要です。

from langchain_huggingface import HuggingFaceEmbeddings
embed_model_id = "oshizo/sbert-jsnli-luke-japanese-base-lite"
embeddings = HuggingFaceEmbeddings(model_name=embed_model_id)

pkshatech/GLuCoSE-base-ja
「sentencepiece」が必要です。

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

現状

自分が試した中では「gemma2:27b」と「pkshatech/GLuCoSE-base-ja」の組み合わせが良い印象です。(オープンソースでかつローカルで実行可能なサイズのモデルに限定した場合です)

もちろんChatGPTやClaudeに課金すればもっと良い結果が得られると思います。

しぼルトメニューは、山梨県が推進する健康増進事業の一環として、食塩の摂取を抑え、野菜を一定量以上含む弁当や飲食店の料理のことです。

具体的には、エネルギーが500kcal以上700kcal未満で、野菜が120g以上、食塩相当量が3.0g未満、主食・主菜・副菜がそろっているメニューのことを指します。





このエントリーをはてなブックマークに追加