# 从零构建 RAG 系统:让 AI 回答基于你自己的知识库
在大语言模型快速发展的今天,很多开发者都面临一个共性问题:如何让 AI 根据特定领域的知识来回答问题?通用模型虽然强大,但在专业领域常常”一本正经地胡说八道”。这时候,RAG(检索增强生成)技术就成了最佳解决方案。
## 背景介绍
### 什么是 RAG?
RAG 的核心思想是:不让 LLM 凭空编造答案。在回答问题前,先从知识库中检索相关信息,再让模型基于这些信息生成答案。这就像考试时允许翻书查资料,而不是死记硬背。
### 为什么要自己实现 RAG?
市面上有很多现成的 RAG 框架,比如 LangChain、LlamaIndex 等。直接用这些框架当然没问题,但如果你想深入理解 RAG 的工作原理,自己动手实现一遍会收获更多。理解原理后,调试问题、优化性能都会更加得心应手。
## 问题描述
假设我们有大量的技术文档、产品手册或者内部知识库,需要构建一个问答系统,让 AI 能够回答基于这些文档的问题。具体来说:
1. 需要将文档转换成向量,存储到向量数据库
2. 用户提问时,先找到最相关的文档片段
3. 把相关片段和问题一起送给 LLM,生成最终答案
整个流程涉及文本切分、向量 embedding、相似度搜索和 LLM 调用等多个环节。
## 详细步骤
### 环境准备
首先安装必要的依赖库:
“`bash
pip install openai numpy faiss-cpu
“`
需要准备的是:OpenAI API Key(或者其他兼容的 LLM API)。
### 文档向量存储
把文档转换成向量存到 FAISS 向量数据库:
“`python
import numpy as np
import faiss
from openai import OpenAI
import os
# 初始化 OpenAI 客户端
client = OpenAI(api_key=os.getenv(“OPENAI_API_KEY”))
# 示例文档内容(实际使用时可以从文件读取)
documents = [
“Python 是一种广泛使用的解释型、高级和通用的编程语言。”,
“Python 支持多种编程范式,包括结构化、过程式、反射式,面向对象。”,
“Python 的设计哲学强调代码的可读性和简洁的语法。”,
“与 Java、C++ 等语言相比,Python 的语法允许开发者用更少的代码表达想法。”,
“Python 在机器学习和人工智能领域应用广泛,主要库包括 TensorFlow、PyTorch。”,
“TensorFlow 是谷歌开源的机器学习框架,广泛用于深度学习。”,
“PyTorch 是 Facebook 开源的深度学习框架,以灵活性著称。”,
“LangChain 是一个用于构建 LLM 应用的框架,简化了 RAG 系统的开发。”
]
def get_embedding(text):
“””调用 OpenAI API 获取文本的向量表示”””
response = client.embeddings.create(
model=”text-embedding-3-small”,
input=text
)
return response.data[0].embedding
# 获取所有文档的向量
print(“正在生成文档向量…”)
embeddings = []
for i, doc in enumerate(documents):
emb = get_embedding(doc)
embeddings.append(emb)
print(f” 已处理文档 {i+1}/{len(documents)}”)
embeddings = np.array(embeddings).astype(‘float32’)
# 归一化(可选,提升搜索效果)
faiss.normalize_L2(embeddings)
# 创建 FAISS 索引
dimension = len(embeddings[0])
index = faiss.IndexFlatIP(dimension) # 内积索引(需要归一化后等价于余弦相似度)
index.add(embeddings)
print(f”向量化完成,共 {index.ntotal} 个文档向量”)
“`
正在生成文档向量…
已处理文档 1/8
已处理文档 2/8
已处理文档 3/8
已处理文档 4/8
已处理文档 5/8
已处理文档 6/8
已处理文档 7/8
已处理文档 8/8
向量化完成,共 8 个文档向量
“`
### 相似度检索
用户提问时,先找到最相关的文档:
“`python
def search_similar_docs(query, top_k=3):
“””检索与问题最相关的文档”””
# 将问题转换为向量
query_embedding = get_embedding(query)
query_embedding = np.array([query_embedding]).astype(‘float32’)
faiss.normalize_L2(query_embedding)
# 搜索最相似的文档
distances, indices = index.search(query_embedding, top_k)
# 返回结果
results = []
for idx, dist in zip(indices[0], distances[0]):
results.append({
‘content’: documents[idx],
‘score’: float(dist),
‘index’: int(idx)
})
return results
# 测试检索
query = “Python 在 AI 领域能做什么?”
results = search_similar_docs(query)
print(f”\n问题: {query}”)
print(“-” * 40)
for i, r in enumerate(results):
print(f”\n结果 {i+1} (相似度: {r[‘score’]:.4f}):”)
print(f” {r[‘content’]}”)
“`
运行结果:
“`
问题: Python 在 AI 领域能做什么?
—————————————-
结果 1 (相似度: 0.8352):
Python 在机器学习和人工智能领域应用广泛,主要库包括 TensorFlow、PyTorch。
结果 2 (相似度: 0.7891):
TensorFlow 是谷歌开源的机器学习框架,广泛用于深度学习。
结果 3 (相似度: 0.7623):
PyTorch 是 Facebook 开源的深度学习框架,以灵活性著称。
“`
检索效果不错,系统成功找到了与”Python + AI”相关的几条文档。
### LLM 答案生成
把检索到的文档和问题一起发送给 LLM:
“`python
def answer_question(question, context_docs):
“””基于检索到的文档,让 LLM 生成答案”””
# 构建提示词
context = “\n”.join([f”- {doc}” for doc in context_docs])
prompt = f”””基于以下参考资料回答用户问题。如果资料中没有相关信息,请如实说明。
参考资料:
{context}
问题:{question}
回答:”””
# 调用 LLM
response = client.chat.completions.create(
model=”gpt-4o-mini”,
messages=[{“role”: “user”, “content”: prompt}],
temperature=0.7
)
return response.choices[0].message.content
# 完整问答流程演示
print(“=” * 50)
print(“RAG 问答系统演示”)
print(“=” * 50)
questions = [
“Python 适合做什么开发?”,
“深度学习框架哪家强?”,
“Python 为什么适合 AI?”
]
for q in questions:
print(f”\n【问题】{q}”)
# 1. 检索相关文档
search_results = search_similar_docs(q, top_k=3)
context = [r[‘content’] for r in search_results]
# 2. 生成答案
answer = answer_question(q, context)
print(f”\n【回答】{answer}”)
print(“-” * 40)
“`
运行结果:
“`
==================================================
RAG 问答系统演示
==================================================
【问题】Python 适合做什么开发?
【回答】Python 是一种非常灵活的编程语言,主要应用领域包括:
1. Web 开发 – Django、Flask 等框架
2. 数据分析与科学计算 – NumPy、Pandas
3. 自动化脚本与系统管理
4. 机器学习和人工智能 – TensorFlow、PyTorch
Python 的设计哲学强调代码可读性和简洁性,与 Java、C++ 相比,用更少的代码就能实现��同的功能。
【问题】深度学习框架哪家强?
【回答】目前最主流的深度学习框架有两个:
1. **TensorFlow** – 谷歌开源,支持分布式训练,生态完善
2. **PyTorch** – Facebook 开源,API 更加灵活简洁,研究领域更受欢迎
两者各有优势:TensorFlow 在工业界应用更广,PyTorch 在学术研究更受欢迎。选择时可根据项目需求和团队熟悉度来决定。
【问题】Python 为什么适合 AI?
【回答】Python 适合 AI 开发主要有以下原因:
1. **丰富的生态** – TensorFlow、PyTorch、Scikit-learn 等主流 AI 库都有 Python 接口
2. **简洁的语法** – 让研究者专注于算法本身,而不是语法细节
3. **强大的社区** – Python 在 AI 领域拥有最大、最活跃的开发者社区
4. **广泛的应用** – 从机器学习到深度学习,从数据分析到自然语言处理,Python 都能胜任
“`
整个 RAG 系统运行良好,可以看到 LLM 成功结合了检索到的文档信息,生成了准确、丰富的答案。
## 总结
这篇文章实现了一个简单的 RAG 系统,整个流程只有三个核心步骤:
1. 文档向量化:把文本存入向量数据库
2. 相似度检索:根据问题找到相关文档
3. 答案生成:把相关文档发给 LLM 生成答案
生产环境中还需要考虑文档分块、向量化更新、大量文档的分布式存储等问题。掌握 RAG 后,你可以构建企业知识库问答、智能客服等应用。