[LLM] 社内データを活用したQAシステム

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)