いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「手元のドキュメントを根拠にAIへ質問できる仕組みを作りたい」とお考えではありませんか?
ChatGPTやClaudeは優秀ですが、社内マニュアルや専門資料の内容までは知りません。
LangChainを使えば、独自のドキュメントを検索させてから回答させるRAGの仕組みを比較的少ないコードで構築可能です。



仕組みさえ理解すれば実装自体はシンプルなので、順番に解説します。
ということで、本記事ではPythonのLangChainでRAGを実装する方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【AI】PythonのLangChainでRAGを実装する方法
早速ですが、PythonのLangChainを使ってRAGを実装する手順を紹介します。
RAGの仕組み
RAGとはRetrieval-Augmented Generationの略称です。
質問に関連するドキュメントをベクトル検索で取得し、取得した内容を根拠として大規模言語モデルに回答を生成させる仕組みです。
大規模言語モデルの学習データに含まれない社内資料や最新情報でも、正確な回答を引き出せる点が利点です。
環境構築
まずは、RAGの実装に必要なライブラリを準備します。
LangChain本体に加え、OpenAIとChromaの連携パッケージをインストールします。
pip install langchain langchain-openai langchain-chroma langchain-community chromadbOpenAIのAPIキーを取得し、環境変数として保存します。
OPENAI_API_KEY="your_api_key"


APIキーはコードに直接書かず、環境変数から読み込むようにしましょう。
ドキュメントの分割とベクトル化
次に、検索対象のドキュメントをチャンクに分割し、ベクトルストアへ保存します。
テキストファイルを読み込み、一定の文字数ごとにチャンクへ分割します。
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)チャンクサイズを小さくしすぎると文脈が失われ、大きくしすぎると検索精度が落ちるため、ドキュメントの内容に合わせて調整してください。
分割したチャンクをベクトル化し、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とチェーンの構築(コード付き)
ベクトルストアの準備ができたら、検索と回答生成をつなぐチェーンを組み立てます。
ベクトルストアからRetrieverを生成します。
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})kの値は、質問に対して何件のチャンクを検索結果として渡すかを表します。
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の書きやすいところです。
組み立てたチェーンに質問を渡すだけで、ドキュメントの内容を根拠にした回答が返ります。
answer = rag_chain.invoke("返品ポリシーについて教えてください")
print(answer)ドキュメントに書かれていない内容を聞かれた場合は、根拠がない旨を回答するようプロンプトで指示しておくと安心です。
回答精度を上げるコツ
単純な類似度検索だけでは、関連度の低いチャンクが検索結果に混ざることがあります。
- チャンクサイズとオーバーラップ幅を調整し、文脈が途切れないようにする
- キーワード検索とベクトル検索を組み合わせるハイブリッド検索を導入する
- 検索結果をリランキングし、質問との関連度が高い順に並べ替える
- プロンプトで、コンテキストにない内容は回答しないよう明示する



まずはシンプルな実装で動かしてみて、回答の精度に不満が出てきたタイミングで検索方法を見直すくらいがちょうどいいペースです。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- 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を実装する方法について解説しました。
以下が本記事のまとめになります。



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。







