AIが社内データから答えを探して答える —
というのが「社内QAシステム」です。
⚙️ 仕組み(RAG:検索拡張生成)
1️⃣ 社内データを集める
例:マニュアル、議事録、FAQ、Slackログ、PDF資料などを収集
2️⃣ ベクトル化(Embedding)
→ テキストを「意味の近さ」で比較できる数値ベクトルに変換します
(例: OpenAI の text-embedding-3-small など)
3️⃣ 検索(Retrieval)
→ ユーザーの質問も同じようにベクトル化し、
「最も意味が近い文書」を検索します
(例: FAISS, Chroma, Weaviate などを利用)
4️⃣ 生成(Generation)
→ 検索した文書をLLM(GPTなど)に渡し、
「この情報に基づいて答えて」と指示して回答を生成
🏢 実際の構成イメージ
[社員の質問]
↓
[Embedding検索]
↓
[社内ナレッジDB(PDF, Word, Wiki…)]
↓
[関連情報を抽出]
↓
[LLM(GPTやGeminiなど)が回答生成]
↓
[自然な日本語で答えを返す]
✅ メリット
メリット 内容
情報探索の効率化 社員がFAQや文書を探さずに即回答を得られる
ナレッジの再利用 社内に散らばった文書を有効活用できる
属人化の解消 ベテラン社員の知識もシステムに蓄積可能
社内チャット連携 Slack / Teamsボットとして導入しやすい
⚠️ 注意点
課題 対策
機密情報の扱い オンプレ・プライベートクラウドで構築する
検索精度の低下 文書構造化・適切な分割(chunking)が重要
更新管理 ナレッジDBを定期的に再インデックス化する
Rag
import os import numpy as np import faiss from openai import OpenAI # === APIキー === client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # === 社内文書(例) === docs = [ "有給休暇の申請は人事システムから行います。", "出張申請は上長の承認を経て経理部に提出してください。", "経費精算は翌月10日までにシステムへ登録してください。", "社内Wi-Fiは社員IDとパスワードで接続できます。", ] # === 文書を埋め込み(ベクトル化) === print("🔹 Generating embeddings...") embs = [client.embeddings.create(model="text-embedding-3-small", input=d).data[0].embedding for d in docs] dim = len(embs[0]) # === ベクトルDB(FAISS)を作成 === index = faiss.IndexFlatL2(dim) index.add(np.array(embs).astype("float32")) # === 質問 === query = "経費はいつまでに提出する必要がありますか?" q_emb = client.embeddings.create(model="text-embedding-3-small", input=query).data[0].embedding # === 類似文書を検索 === k = 1 # 上位1件を取得 D, I = index.search(np.array([q_emb]).astype("float32"), k) context = docs[I[0][0]] print(f"\n📝 検索された文書: {context}") # === LLMで回答生成 === prompt = f"次の社内資料を参考に質問に答えてください。\n\n資料:\n{context}\n\n質問:\n{query}" response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], ) print("\n💬 回答:") print(response.choices[0].message.content)