[Python] ローカルLLMにRAGを適用して精度を上げてみる(ベクトルDB永続化)

Python

本記事は、
[Python] ローカルLLMにRAGを適用して精度を上げてみる
でのベクトルDB(ChromaDB)を永続化して利用する方法を解説しています。

この方法によって、事前にベクトルDBに情報を登録しておくことができますので、問い合わせ時に毎回情報を再度読み込む必要がなくなります。

ベクトルDB永続化

まずは、ベクトルDBに情報を蓄えます。
本記事ではベクトルDBとして「ChromaDB」を使って、ファイルに永続化することを想定しています。

サンプルコード

サンプルコードはこちらになります。
trump2.0.pdfについてはこちらの記事を確認ください。

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

loader = PyPDFLoader("trump2.0.pdf")
documents = loader.load()
embeddings = OllamaEmbeddings(model="mxbai-embed-large:latest")

db = Chroma(
    collection_name="rag_store",
    embedding_function=embeddings,
    persist_directory="./chromadb"
)

db.add_documents(documents=documents, embedding=embeddings)

ベクトルDBを利用したRAGの適用

情報を保存したベクトルDBを利用して、問い合わせに適用してみます。

サンプルコード

サンプルコードはこちらになります。

llm_rage_query.py
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import OllamaEmbeddings
from langchain_ollama import OllamaLLM

embeddings = OllamaEmbeddings(model="mxbai-embed-large:latest")
llm = OllamaLLM(model="gemma2:2b")
loaded_db = Chroma(
    collection_name="rag_store",
    embedding_function=embeddings,
    persist_directory="./chromadb"
)

qa_system_prompt = """あなたは質問対応のアシスタントです。
ユーザからの質問に答えてください。
答えがわからないときは、わからないと答えましょう。
{context}"""

prompt = ChatPromptTemplate.from_messages(
    [
        ('system', qa_system_prompt),
        ('human',  '{input}')
    ]
)

chain = create_stuff_documents_chain(llm, prompt)
retriever = loaded_db.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, chain)

response = retrieval_chain.invoke({"input": "トランプ2.0とは何ですか?"})
print(response['answer'])

実行結果確認

以下の順序でスクリプトを実行します。

  1. llm_rage_storedb.py
  2. llm_rage_query.py

正しく情報が格納された状態で 2. を実行することで、適切な回答を返してくれます。
逆に 1. を実行していない状態で 2. を実行すると、「トランプ2.0」を正しく理解できず、見当はずれな回答を返してきます。

色々な情報を 1. として格納していくことで、より賢い回答を得られるようになります。

実行結果例
トランプ2.0は、アメリカ大統領ドナルド・トランプの新たな政権を表す言葉です。

**主な政策は以下の通りです:**

* **経済政策:**
    * **減税:** 法定的な減税を実施し、国際競争力を強化する。
    * **関税措置:**  関税措置を導入し、貿易不均衡を是正する。

* **エネルギー・環境政策:**
   * **化石燃料の増産:** 化石燃料の生産を増やすことを重視する。

トランプ2.0は、より強硬かつ迅速な「アメリカ・ファースト」政策を展開すると予想されています。国際関係においても、貿易、外交、安全保障に大きな影響を与えると考えられています。


**日本への影響:**
 トランプ2.0の政策は、日本を含む同盟国にも大きな影響を与えます。特に、経済、外交、安全保障の各面で戦略的調整が求められます。

まとめ

本記事はベクトルDB(ChromaDB)を永続化してRAGで利用する方法をまとめました。
問い合わせ時に毎回情報を再度読み込むのは非効率ですので、事前に情報を格納しておくことで、ユーザの期待した回答に近づけることができます。

コメント

タイトルとURLをコピーしました