🐤

初めての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用のインストールコマンド」をコマンドライン上で実行しましょう。
https://github.com/ollama/ollama?tab=readme-ov-file#ollama

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を実装したコードを記載します。
このコードの処理内容は以下です。

  1. RAGで参照したいテキストの定義(#1部分)
    今回は[langchainの説明,名前はllama3であること]をテキストとして設定
  2. 1のテキストをembedding(#2部分)
  3. 質問文の入力(#3部分)
  4. 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