2026.05.18 開発ログ

「社内文書をAIに読ませる」
仕組みを作った
— RAG 実装記録

PDFをアップロードするだけで、その内容をAIが答えてくれるシステム。
就業規則に「有給は何日?」と聞いたら、ちゃんと文書を参照して返ってきた。

Python + LangChain + ChromaDB + FastAPI で作り、Railway にデプロイ。
コーポレートサイトへのチャットウィジェット埋め込みまでの記録。

← Blog に戻る

クラウドワークスやランサーズで「社内文書をAI化したい」「FAQ対応をBotに任せたい」という案件が増えている。単価も高い。30〜100万円規模の案件も珍しくない。

その中心にあるのが RAG(Retrieval-Augmented Generation) という仕組みだ。聞き慣れない言葉だが、やっていることはシンプルで、「AIに文書を渡して、その内容だけをもとに答えさせる」というものだ。

RAGとは何か

図書館に例えると分かりやすい。

準備フェーズ:文書を図書館に入れる

PDFを受け取る → テキストを抽出して500字ずつに分割 → 各チャンクを「意味の座標(ベクトル)」に変換 → データベースに保存する。

質問フェーズ:本を調べる

質問を受け取る → 質問もベクトル化して、近い意味のチャンクを検索 → 関連する文章をAIに渡して回答を生成する。

AIは文書を「全部覚えている」わけではない。質問のたびに「関係ありそうな部分」を引っ張り出して、その場で読んで答えている。だから大量の文書でも対応できる。

技術スタック

— Architecture

ベクトル化OpenAI text-embedding-3-small
ベクトルDBChromaDB(ローカル永続化)
RAG処理LangChain(Python)
回答生成GPT-4o-mini
バックエンドFastAPI
デプロイRailway
フロントエンドHTML / CSS / JavaScript

LangChainは「RAG処理の定番ライブラリ」として市場でも広く使われている。クラウドワークスの案件で「LangChain使えますか?」と聞かれることが多いのも、このためだ。

実装の流れ

01
PDFの読み込みとチャンク分割

PyPDFLoaderでPDFをテキスト化し、RecursiveCharacterTextSplitter で300字ずつに分割する。500字より小さくした方が検索ヒット率が上がることを実験で確認した。

02
ベクトル化とChromaDBへの保存

OpenAIの埋め込みモデルで各チャンクを数値ベクトルに変換し、ChromaDBに保存する。意味が近い文章ほど座標が近くなる性質を使って検索する。

03
プロンプトで「一般論を禁止」する

AIはデフォルトで知識から推測して答えようとする。「文書に記載がない場合は、その旨を答えること。推測や一般論は付け加えないこと」とプロンプトに明記することで、文書外の情報が混入しなくなった。

04
FastAPIでAPIサーバーを構築

POST /upload でPDFを受け取り、POST /ask で質問を受け取って回答を返すシンプルな2エンドポイント構成。フロントエンドはJavaScriptで呼び出すだけになる。

05
Railwayにデプロイ

GitHubのリポジトリをRailwayに連携し、環境変数にAPIキーを設定するだけで本番URLが発行された。ProcfileにUvicornの起動コマンドを書くだけでPythonサーバーが動く。

06
コーポレートサイトへのウィジェット埋め込み

JavaScriptで右下に浮かぶチャットボタンを実装し、RailwayのAPIエンドポイントを呼び出す構成にした。静的サイト(Cloudflare Pages)でも、バックエンドを別サービスにすれば問題なく動く。

つまずいたところ

Python 3.14との相性問題。LangChain-Pineconeが依存しているライブラリが最新Pythonに未対応だった。ChromaDB(ローカルで動くベクトルDB)に切り替えることで解決した。ポートフォリオ用のデモなら、Pineconeのようなクラウドサービスを使わなくても十分動く。

「わかりません」の回答が不親切だった。デフォルトでは文書にない質問に対して「申し訳ありませんが、わかりません」と返ってくる。プロンプトに「文書に記載がない場合は『この文書には該当する記載がありませんでした』と答えてください」と入れることで改善した。

ひらがなのクエリがヒットしにくい。「ゆうきゅうきゅうかは?」と聞くと「有給休暇」の文書にヒットしない。埋め込みモデルのベクトル空間では表記ゆれへの対応に限界がある。本番案件では前処理で正規化するか、ユーザーに漢字で入力してもらうUIにするのが現実的だ。

ポートフォリオとして伝えたいこと

このシステムが実用になる場面は多い。就業規則・マニュアル・FAQ・製品仕様書——社内に眠っているPDFをAI化するだけで、「Slackで質問する→同僚に聞く→文書を探す」という手間がなくなる。

技術的な目新しさより、「誰かの仕事を減らせるか」という視点で設計した。クライアントに提案するときも、この軸で話すつもりだ。