基于RAG的知识库问答系统
基于RAG的知识库问答系统
结合语义检索与大语言模型技术,实现基于私有知识库的智能问答解决方案。采用两阶段处理架构,可快速定位相关文档并生成精准回答。
核心功能
-
知识向量化引擎
- 支持多语言文本嵌入(all-MiniLM-L6-v2模型)
- 自动生成768维语义向量
- 毫秒级相似度匹配(FAISS索引)
-
智能问答引擎
- 上下文感知问答生成
- 知识库内容优先回答策略
- 自动回退通用回答机制
技术架构
数据流架构:
[用户提问] → 向量编码 → FAISS检索 → 上下文构造 → LLM生成 → [结构化回答]
组件栈:
- 语义编码层:Sentence-Transformers
- 向量检索层:FAISS
- 生成层:Deepseek LLM
典型应用场景
- 企业知识库智能客服
- 技术文档即时问答
- 领域专家系统构建
- 教育知识检索辅助
快速开始示例
# 初始化知识库
documents = [
"华为成立于1987年,总部位于深圳",
"深度学习是机器学习的一个子领域",
"TCP/IP协议包含四层网络模型"
]
# 执行问答流程
question = "华为的总部在哪里?"
related_docs = search_knowledge_base(question)
answer = generate_answer_with_openai(question, related_docs)
注意事项
- 知识库更新需重新构建索引
- API密钥需加密存储
- 建议添加结果验证机制
- 文档缺失时的降级处理策略
该解决方案特别适用于需要结合私有知识库与生成式AI的场景,在保证回答准确性的同时提供自然语言交互体验。系统架构支持水平扩展,可轻松应对万级文档规模的业务需求。
Python实现
from openai import OpenAI
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
# 文档集合
documents = [
"The capital of France is Paris.",
"Python is a programming language.",
"The Eiffel Tower is in Paris.",
"The capital of the USA is Washington, D.C.",
"The Eiffel Tower is a famous landmark in Paris.",
]
# 使用 sentence-transformers 获取文档的向量表示
model = SentenceTransformer("all-MiniLM-L6-v2")
doc_embeddings = model.encode(documents)
# 创建 FAISS 索引
doc_embeddings_np = np.array(doc_embeddings).astype("float32")
index = faiss.IndexFlatL2(doc_embeddings_np.shape[1]) # 使用 L2 距离的索引
index.add(doc_embeddings_np) # 将文档向量添加到索引中
# 查询知识库
def search_knowledge_base(query, k=2):
query_embedding = model.encode([query])
query_embedding_np = np.array(query_embedding).astype("float32")
_, indices = index.search(query_embedding_np, 1) # 获取最相似的 k 个文档
return [documents[i] for i in indices[0]]
# 使用 OpenAI API 生成回答
def generate_answer_with_openai(query, retrieved_docs):
input_text = f"根据以下文档内容回答问题:{query}。文档内容如下:\n{retrieved_docs}" # 合并问题和文档
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
base_url="https://api.deepseek.com",
)
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "You are a helpful assistant. Please answer the question based on the provided documents. If the documents do not contain enough information, you can provide a general answer."},
{
"role": "user",
"content": input_text,
}, # 合并问题和文档
],
stream=False,
)
answer = response.choices[0].message.content
return answer
# 示例:生成回答
query = "What is the capital of France?"
retrieved_docs = search_knowledge_base(query) # 查询知识库
answer = generate_answer_with_openai(query, retrieved_docs) # 使用 OpenAI API 生成回答
print('query: ', query)
print('retrieved_docs: ', retrieved_docs)
print("Answer:", answer)