【AI】PythonのLangChainでRAGを実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

手元のドキュメントを根拠にAIへ質問できる仕組みを作りたい」とお考えではありませんか?

ChatGPTやClaudeは優秀ですが、社内マニュアルや専門資料の内容までは知りません。

LangChainを使えば、独自のドキュメントを検索させてから回答させるRAGの仕組みを比較的少ないコードで構築可能です。

いずみ

仕組みさえ理解すれば実装自体はシンプルなので、順番に解説します。

ということで、本記事ではPythonのLangChainでRAGを実装する方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AI】PythonのLangChainでRAGを実装する方法

早速ですが、PythonのLangChainを使ってRAGを実装する手順を紹介します。

RAGの仕組み

RAGとはRetrieval-Augmented Generationの略称です。

質問に関連するドキュメントをベクトル検索で取得し、取得した内容を根拠として大規模言語モデルに回答を生成させる仕組みです。

大規模言語モデルの学習データに含まれない社内資料や最新情報でも、正確な回答を引き出せる点が利点です。

環境構築

まずは、RAGの実装に必要なライブラリを準備します。

STEP
必要なライブラリをインストールする

LangChain本体に加え、OpenAIとChromaの連携パッケージをインストールします。

pip install langchain langchain-openai langchain-chroma langchain-community chromadb
STEP
OpenAIのAPIキーを設定する

OpenAIのAPIキーを取得し、環境変数として保存します。

OPENAI_API_KEY="your_api_key"
いずみ

APIキーはコードに直接書かず、環境変数から読み込むようにしましょう。

ドキュメントの分割とベクトル化

次に、検索対象のドキュメントをチャンクに分割し、ベクトルストアへ保存します。

STEP
ドキュメントを読み込んで分割する

テキストファイルを読み込み、一定の文字数ごとにチャンクへ分割します。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = TextLoader("docs/manual.txt")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)

チャンクサイズを小さくしすぎると文脈が失われ、大きくしすぎると検索精度が落ちるため、ドキュメントの内容に合わせて調整してください。

STEP
Embeddingを作成しベクトルストアへ保存する

分割したチャンクをベクトル化し、Chromaへ保存します。

from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
いずみ

persist_directoryを指定しておくと、次回起動時にベクトル化をやり直さずに済みます。

Retrieverとチェーンの構築(コード付き)

ベクトルストアの準備ができたら、検索と回答生成をつなぐチェーンを組み立てます。

STEP
Retrieverを作成する

ベクトルストアからRetrieverを生成します。

retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})

kの値は、質問に対して何件のチャンクを検索結果として渡すかを表します。

STEP
LCELでRAGチェーンを組み立てる

LangChain Expression Languageを使って、検索結果をプロンプトに渡すチェーンを定義します。

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

prompt = ChatPromptTemplate.from_template(
    "以下のコンテキストだけを根拠に質問へ回答してください。\n\nコンテキスト:\n{context}\n\n質問:\n{question}"
)

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)
いずみ

パイプ演算子でRetriever・プロンプト・モデルをつなげられるのが、LCELの書きやすいところです。

STEP
質問を投げて回答を得る

組み立てたチェーンに質問を渡すだけで、ドキュメントの内容を根拠にした回答が返ります。

answer = rag_chain.invoke("返品ポリシーについて教えてください")
print(answer)

ドキュメントに書かれていない内容を聞かれた場合は、根拠がない旨を回答するようプロンプトで指示しておくと安心です。

回答精度を上げるコツ

単純な類似度検索だけでは、関連度の低いチャンクが検索結果に混ざることがあります。

  • チャンクサイズとオーバーラップ幅を調整し、文脈が途切れないようにする
  • キーワード検索とベクトル検索を組み合わせるハイブリッド検索を導入する
  • 検索結果をリランキングし、質問との関連度が高い順に並べ替える
  • プロンプトで、コンテキストにない内容は回答しないよう明示する
いずみ

まずはシンプルな実装で動かしてみて、回答の精度に不満が出てきたタイミングで検索方法を見直すくらいがちょうどいいペースです。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

LangChainのバージョンが変わるとコードは動かなくなりますか?

LangChainはモジュール分割が進んでおり、バージョンによってインポート元のパッケージ名が変わることがあります。

公式ドキュメントで最新のインポートパスを確認しながら実装するのがおすすめです。

ベクトルストアはChroma以外も使えますか?

FAISSやPinecone、Qdrantなど、LangChainが対応する他のベクトルストアに置き換え可能です。

用途に応じて、ローカル完結型かマネージドサービス型かを選んでください。

OpenAI以外のモデルでもRAGを実装できますか?

langchain_openaiの部分を、他ベンダーのモデルやローカルLLM用の連携パッケージに差し替えれば、同じ構成でRAGを実装できます。

Retrieverとチェーンの組み立て方自体は、モデルの種類に関わらず共通です。

まとめ

今回は、PythonのLangChainでRAGを実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • LangChainを使うと、ドキュメントを検索してから回答させるRAGを少ないコードで構築できる。
  • チャンク分割・ベクトル化・Retriever・LCELチェーンの4ステップで実装できる。
  • 回答精度が不足する場合は、チャンクサイズの調整やハイブリッド検索の導入で改善できる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次