1. 導入
エンジニアにとって、社内の複雑な仕様書や古いWikiから必要な情報を探し出すのは一苦労です。特にデプロイ手順や過去のトラブル対応策が散逸していると、開発効率は大きく低下します。この課題を解決するのがRAG(Retrieval-Augmented Generation)です。RAGを導入することで、LLM(大規模言語モデル)に社内の専門知識を「参照」させ、嘘のない正確な回答を得る社内専用のAIアシスタントを構築できます。
2. 基礎知識
RAGは、以下の3つのステップで動作します。
・エンベディング:ドキュメントを数値ベクトルに変換し、意味的な近さを計算可能にする技術。
・ベクトルデータベース:変換したベクトルを保存し、検索を高速に行うための専用DB(PineconeやChromaなど)。
・検索と生成:ユーザーの質問に関連するドキュメントをDBから検索し、その内容をコンテキストとしてLLMに渡し、回答を生成させます。
これにより、LLMが学習していない「社外秘情報」を扱うことが可能になります。
3. 実装/解決策
PythonのライブラリであるLangChainを用いると、効率的に実装できます。基本的なフローは「ドキュメントの読み込み」→「分割(Chunking)」→「ベクトル化」→「検索・回答生成」です。特に「分割」は、ドキュメントの文脈を壊さないように適切なサイズで行うことが精度向上の肝となります。
4. サンプルプログラム
以下のコードは、LangChainとOpenAI APIを使用したシンプルなRAGの例です。
必要なライブラリをインポート
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
1. ベクトルデータベースの準備(例:ドキュメントからインデックス作成)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(["デプロイ手順はJenkinsのjobAを実行することです"], embeddings)
2. 回答生成用モデルの設定
llm = ChatOpenAI(model="gpt-4o")
3. 検索チェーンの構築
vectorstore.as_retriever()で検索機能を定義
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
4. 質問の実行
query = "社内システムのデプロイ手順を教えてください"
result = qa_chain.invoke(query)
回答の表示
print(result["result"])
5. 応用・注意点
現場で活用する際のポイントは以下の通りです。
・チャンクサイズとオーバーラップ:ドキュメントを分割する際、文脈が切れないよう「オーバーラップ(重なり)」を持たせることが重要です。
・ハルシネーション対策:LLMが「わかりません」と正しく答えられるよう、プロンプトに「検索結果に情報がない場合は、勝手に推測せず、わからないと答えてください」と明記しましょう。
・情報の鮮度管理:社内ドキュメントは日々更新されます。CI/CDパイプラインに「ドキュメント更新時にベクトルDBを再構築する」フローを組み込むことで、常に最新のナレッジをAIに反映させることが可能です。

コメント