初めてのRAG(langchain & ollama)
対象読者
本記事は『筆者が30分程度の時間で
「langchainでRAGってどんな感じで実装するんだ?」
という検索したらどこにでも出てくるような内容をただローカルで実際に動かした際の記録』であるため、高度な内容は含まれません。
そのため、読者は以下のような方を想定しています。
- 簡単にRAGの実装をしてみたい
- API Keyとか使わず、ローカルLLMでlangchainを動かしたい
目的
langchainを使用したRAGの実装。
環境
| 項目 | 設定値 |
|---|---|
| OS | Windwos11 WSL docker(Ubuntu) |
| Python Version | 3.11.14 |
| langchain | 1.0.2 |
| langchain-core | 1.0.0 |
| langchain_ollama | 1.0.0 |
前提
以下からはすべてdockerコンテナ内での作業です。
ローカルLLMの準備
ollamaのインストール
以下のGitHubページ内に添付されている「Linux用のインストールコマンド」をコマンドライン上で実行しましょう。
curl -fsSL https://ollama.com/install.sh | sh
以下の表示が出たらインストール成功です。

llama3のインストール
ollamaのインストールができたら次はllama3をインストールしましょう。
以下のコマンドをコマンドライン上で実行。
ollama pull llama3
以下の表示が出たらインストール成功です。
実装
以下pythonでの実装です。
embedding用のモデルロード
RAGの実装には「データをembeddingしてベクトルにする」必要があります。
そのため、embedding用のモデルをロードします。
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(
model="llama3",
)
RAGの実装
以下にRAGを実装したコードを記載します。
このコードの処理内容は以下です。
- RAGで参照したいテキストの定義(#1部分)
今回は[langchainの説明,名前はllama3であること]をテキストとして設定 - 1のテキストをembedding(#2部分)
- 質問文の入力(#3部分)
- 1で定義したテキストの中で3の質問文と最も類似度が高いテキストを出力
from langchain_core.vectorstores import InMemoryVectorStore
# 1
texts = ["LangChain is the framework for building context-aware reasoning applications","My name is llama3"]
# 2
vectorstore = InMemoryVectorStore.from_texts(
texts,
embedding=embeddings,
)
retriever = vectorstore.as_retriever()
# 3
retrieved_documents = retriever.invoke("What is your name?")
# 4
print(retrieved_documents[0].page_content)
以下が4の出力結果です。
My name is llama3
しっかり「What is your name?」に対する回答の「My name is llama3」を1で設定したテキストの中から出力してくれましたね。
次はlangchainについて質問し、「LangChain is the framework for building context-aware reasoning applications」を出力してくれるか確認しましょう。
retrieved_documents = retriever.invoke("What is LangChain?")
print(retrieved_documents[0].page_content)
以下が出力結果です。
LangChain is the framework for building context-aware reasoning applications
しっかりlangchainの説明を出力してくれましたね。
まとめ
今回はlangchainとollamaを使用したRAGの簡易実装を行いました。
langchainに詳しい人からすると物足りないかと思いますが、初学者向け且つ自分の備忘録として残しておきたいと思います。
Discussion