社内チャットボットでRAG検索を実装する方法【ナレッジ活用】
社内チャットボットでRAG検索を実装する方法【ナレッジ活用】
社内には膨大なマニュアルやルールが蓄積されているにもかかわらず、必要な情報を探すには「人に聞く」しかない――。そんな課題を解決するのが、**RAG(Retrieval‑Augmented Generation:検索拡張生成)**です。RAGは情報検索と生成AIを組み合わせ、社内のドキュメントから関連情報を取得して正確な回答を生成します。
RAGとは?生成AIとの違い
RAGは、大規模言語モデル(LLM)だけでは補えない情報を外部データベースから取り出し、その情報を基に回答を生成する仕組みです。Microsoft Learnでは、RAGを「ChatGPTなどのチャット補完モデルに情報検索ステップを追加し、企業独自のコンテンツを取り込んで回答を生成するデザインパターン」と説明しています。LLM単体は学習済みデータに頼るため最新情報に弱いのに対し、RAGではユーザーの質問を検索エンジンやベクトルDBに投げ、取得したテキストをLLMに渡すことで正確な回答を生成します。ウィキペディアでも、RAGはLLMが指定したドキュメントに基づいて回答するため、誤情報(ハルシネーション)を減らし、再学習のコストを削減できると述べています。
社内チャットボットにRAGを導入する全体フロー
- ドキュメントの収集
- 社内マニュアル、Googleスプレッドシート、PDFなどのナレッジを収集。
- フォルダー構成や列構成を統一しておくと後の処理が簡単になります。
- 文書の分割とベクトル化
- テキストをチャンクに分割し、OpenAI Embeddings API等で数値ベクトルに変換。
- CSVやテキストを扱う場合、文字コードを統一(UTF‑8なら65001、Shift‑JISなら932)するとデータ化が安定します。
- ベクトルDBに格納
- SQLite、Pinecone、Weaviateなどにベクトルデータを保存。
- 検索効率を高めるため、更新頻度や権限管理を考慮したDB設計が重要です。
- ユーザーの質問をEmbeddingに変換し類似検索を実行
- 問い合わせを同じEmbeddingsモデルでベクトル化し、ベクトルDBで類似検索。
- 検索結果をLLMに渡して回答生成
- 上位数件のドキュメントをChatGPTなどのLLMに提示し、「以下の情報を参考に回答してください」というプロンプトを組む。
Microsoft Learnはこの流れを「ユーザー質問を検索に送り、上位結果をLLMに返し、LLMが回答を生成する」手順として示しています。RAGではモデルを再学習させる必要がないため、導入コストが低く、企業独自のデータをリアルタイムに利用できるのが特徴です。
必要な技術要素
要素 | 候補 | 役割 |
---|---|---|
ベクトル化 | OpenAI Embeddings API, Sentence Transformers | テキストをベクトルに変換 |
ベクトルDB | SQLite, Pinecone, Weaviate | ベクトルデータの保存・類似検索 |
チャットインターフェース | PHP, Node.js, Google Chat API | 質問を送受信する環境 |
回答生成 | GPT‑4, GPT‑4o mini | 検索結果を踏まえて自然文を生成 |
PHPで実装するサンプルコード
以下は、PHPを使ってEmbeddings生成とSQLiteで類似検索を行う簡単な例です。環境に合わせてAPIキーやDB構造を調整してください。
<?php
require_once 'vendor/autoload.php';
// APIキーを設定
$apiKey = "YOUR_API_KEY";
// Embedding生成関数
function createEmbedding($text) {
global $apiKey;
$url = "https://api.openai.com/v1/embeddings";
$data = [
"model" => "text-embedding-3-small",
"input" => $text
];
$options = [
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\nAuthorization: Bearer $apiKey\r\n",
"content" => json_encode($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
$json = json_decode($result, true);
return $json["data"][0]["embedding"];
}
// 類似検索(SQLite利用)
function searchSimilarDocs($embedding, $dbPath = "vector.db") {
$pdo = new PDO("sqlite:" . $dbPath);
$stmt = $pdo->query("SELECT text, embedding FROM docs");
$results = [];
foreach ($stmt as $row) {
$vec = json_decode($row["embedding"], true);
$score = cosineSimilarity($embedding, $vec);
$results[] = ["text" => $row["text"], "score" => $score];
}
usort($results, fn($a, $b) => $b["score"] <=> $a["score"]);
return array_slice($results, 0, 3);
}
// コサイン類似度計算
function cosineSimilarity($a, $b) {
$dot = array_sum(array_map(fn($x,$y) => $x*$y, $a, $b));
$normA = sqrt(array_sum(array_map(fn($x) => $x*$x, $a)));
$normB = sqrt(array_sum(array_map(fn($x) => $x*$x, $b)));
return $dot / ($normA * $normB);
}
?>
このように生成したベクトル検索の結果と質問内容をChatGPT APIに渡せば、社内ナレッジを活用した回答生成が可能です。
運用イメージ
- 社員がチャットで「出張精算ルールは?」と入力
- チャットボットがベクトル検索で関連マニュアルを抽出
- LLMが抽出した情報を基に回答を生成し、引用元リンクも提示
- ユーザーは正確な情報をすぐに取得でき、質問する手間が減る
RAG導入のメリット
- 回答の精度向上とハルシネーション抑制
RAGはLLMが回答する前に必ず社内ドキュメントを参照するため、誤情報を減らし現場に即した回答ができます。 - 再学習コストの削減
新しい情報を取り込む際にモデル全体を再学習する必要がなく、ベクトルDBの更新だけで運用できます。 - 透明性の向上
RAGは回答の根拠となるドキュメントを一緒に提示できるため、回答の信頼性を高めます。 - 拡張性と柔軟性
Microsoft Learnが説明するように、RAGでは情報検索システムの選択が重要です。検索システムは大量のコンテンツをインデックス化でき、埋め込みモデルとの統合やセキュリティ対応が求められます。
まとめ
- RAGは検索(Retrieval)と生成(Generation)を組み合わせた仕組みで、LLM単体の弱点を補い社内ナレッジを有効活用します。
- 実装にはテキストのベクトル化とベクトルDB、LLMが必要です。
- PHPやNode.jsなどのチャットインターフェースを通じて、社員は自然言語で質問し、最新の社内ルールやマニュアルに基づいた回答を得られます。
- RAGにより、チャットボットが業務効率化だけでなくナレッジ共有文化の浸透にも貢献します。
社内のナレッジ活用に課題を感じている方は、まずはドキュメント整理とEmbeddings生成から始め、RAG型チャットボット導入を検討してみてください。