从零构建 RAG 系统:让 AI 回答基于你自己的知识库

# 从零构建 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 后,你可以构建企业知识库问答、智能客服等应用。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇