从零开始构建RAG检索增强生成流水线
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
网络上关于RAG的教程往往一上来就引入LangChain或LlamaIndex等庞大的框架,甚至强制要求注册各种托管式向量数据库。实际上,要理解检索增强生成(RAG)的核心机制,完全不需要这些复杂的依赖。在本指南中,我们将仅使用三个Python库,在单个脚本中构建一个功能完备的RAG流水线。
什么是RAG?
RAG是一种让大语言模型(LLM)在回答问题时,能够从私有文档库中实时调取相关信息的技术,而不是仅仅依赖模型训练时记忆的内容。对于企业来说,模型无法获知内部文档、产品变更日志或会议纪要,而RAG正是解决这一问题的最佳方案。
RAG的四个核心步骤
无论使用何种框架,任何RAG系统都必须完成以下四个步骤:
- 分块(Chunk):将源文档拆分为更小的段落。
- 嵌入(Embed):将每个分块转换为向量(浮点数列表)。
- 存储(Store):将分块及其向量存入向量数据库。
- 检索与生成(Retrieve + Generate):将用户问题向量化,找出最相关的分块,并将其作为上下文提交给LLM。
实现指南
首先,安装必要的依赖: pip install chromadb sentence-transformers anthropic
我们将使用 chromadb 进行本地存储,sentence-transformers 处理向量化,并使用 anthropic SDK 进行生成。为了确保API调用的高可用性和稳定性,建议通过 n1n.ai 进行接入,这能有效降低延迟并优化请求路由。
1. 分块与向量化
分块的大小至关重要,通常建议每块200到400个单词。代码示例如下:
from sentence_transformers import SentenceTransformer
embedder = SentenceTransformer("all-MiniLM-L6-v2")
docs = ["Aurora API速率限制:每分钟60次请求。", "Aurora认证:使用Bearer令牌。"]
embeddings = embedder.encode(docs).tolist()
2. 存储至ChromaDB
ChromaDB支持内存模式,非常适合开发和测试环境。
import chromadb
client = chromadb.EphemeralClient()
collection = client.create_collection(name="aurora_docs")
collection.add(ids=["doc1", "doc2"], documents=docs, embeddings=embeddings)
3. 检索与生成
在检索时,务必使用与存储时完全相同的嵌入模型,否则向量空间将无法匹配。通过 n1n.ai 提供的稳定API接口,你可以确保LLM推理环节的响应质量。
import anthropic
def answer(question: str):
q_embedding = embedder.encode([question]).tolist()
results = collection.query(query_embeddings=q_embedding, n_results=1)
context = results["documents"][0][0]
llm = anthropic.Anthropic()
reply = llm.messages.create(
model="claude-haiku-4-5-20251001",
messages=[{"role": "user", "content": f"上下文: {context}\n问题: {question}"}]
)
return reply.content[0].text
生产环境建议
- 设置“我不知道”的指令:务必在提示词中明确要求模型:如果上下文中找不到答案,请直接回答“不知道”。这能极大地减少幻觉问题。
- 模型一致性:严禁混用嵌入模型。使用不同的模型会导致向量空间完全错位,检索结果将变成毫无意义的噪音。
- 扩展性考虑:随着数据量的增加,应考虑从
EphemeralClient迁移到持久化的向量数据库。对于需要大规模部署的开发者,n1n.ai 提供了高性能的LLM API聚合服务,能够帮助你轻松应对高并发场景。
通过从零开始构建这个流水线,你不仅能掌握RAG的底层原理,还能在未来更从容地添加重排序(Reranking)、混合搜索和评估框架等高级功能。掌握这个核心循环,你就掌握了构建现代AI应用的基础。
Get a free API key at n1n.ai