零基础上手:基于 Python 和 LangChain 构建你的第一个 RAG(检索增强生成)智能问答系统
一、 前言
随着 ChatGPT、Claude 以及华为云盘古等大语言模型的爆发,AI 正在重塑各行各业的软件开发模式。然而,在实际落地中,开发者们普遍面临两大痛点:
1. 知识时效性:大模型的训练数据有截止日期,无法获取实时或最新的私有数据。
2. 知识私密性与幻觉:直接将企业核心文档喂给通用大模型存在安全隐患,且大模型在不熟悉领域容易“一本正经地胡说八道”。
为了解决这些问题,RAG(Retrieval-Augmented Generation,检索增强生成) 技术应运而生。简单来说,它就像是给大模型外挂了一个“专属知识库开卷考试”。
今天,我们就用最通俗的代码,来实现一个基础的 RAG 系统。
────────────────────────────────────
二、 技术方案与架构
一个标准的 RAG 系统主要包含两个核心阶段:
1. 离线入库阶段(Indexing):
加载文档 $\rightarrow$ 文本切分(Splitting) $\rightarrow$ 向量化(Embedding) $\rightarrow$ 存入向量数据库(Vector Store)。
1. 在线检索与生成阶段(Retrieval & Generation):
用户提问 $\rightarrow$ 问题向量化 $\rightarrow$ 在向量数据库中检索最相关的知识片段 $\rightarrow$ 将“问题 + 检索到的上下文”拼接后发给大模型 $\rightarrow$ 大模型生成准确回答。
────────────────────────────────────
三、 环境准备
在开始写代码前,请确保您的 Python 环境在 3.8 或以上。我们需要安装以下核心依赖包:
pip install langchain openai chromadb tiktoken
*提示:如果在国内网络环境安装较慢,可以使用国内镜像源,例如 -i https://pypi.tuna.tsinghua.edu.cn/simple。*
────────────────────────────────────
四、 核心代码实战
以下是一个精简的 Python 实现脚本,模拟了从加载文档到问答的全过程:
import os
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
# 1. 设置 API Key(此处以 OpenAI 兼容接口为例,亦可替换为华为云 ModelArts 提供的端点)
os.environ["OPENAI_API_KEY"] = "您的-API-KEY"
# 2. 准备本地知识库文档(创建一个名为 knowledge.txt 的文件)
# 假设内容为:“华为云 ModelArts 是一站式 AI 开发平台,支持大模型训练与推理。”
with open("knowledge.txt", "w", encoding="utf-8") as f:
f.write(
"华为云 ModelArts 是一站式 AI 开发平台,支持大模型训练与推理。开发者可以通过可视化界面或 SDK 快速构建 AI 应用。"
)
# 3. 加载文档
loader = TextLoader("knowledge.txt", encoding="utf-8")
documents = loader.load()
# 4. 文本切分(将长文档切分为适合向量化的小段落)
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_size_increment=0)
docs = text_splitter.split_documents(documents)
# 5. 向量化并存入 Chroma 向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
# 6. 构建检索问答链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_kwargs={"k": 1}
), # 返回最相关的一条
)
# 7. 开始提问测试
query = "华为云 ModelArts 是什么?"
response = qa_chain.run(query)
print(f"用户提问: {query}")
print(f"AI 回答: {response}")
────────────────────────────────────
五、 运行结果与原理解析
运行上述代码后,你会发现大模型能够精准地从我们本地的 knowledge.txt 中提取信息并回答,而不会像未接入知识库那样回答“我不知道”。
TextLoader & CharacterTextSplitter:负责把大段文本“化整为零”,因为大模型的上下文窗口和注意力机制对短文本更友好。
Embedding(向量嵌入):将文字转化成计算机能理解的高维数学向量,语义相近的词在向量空间中距离更近。
Chroma 向量数据库:专门用来高效检索这些高维向量的数据库。
────────────────────────────────────
六、 总结与进阶展望
通过上面的代码,我们已经成功跑通了 RAG 的核心流程。在实际的企业级应用中,我们通常会做以下升级:
1. 替换大模型底层:将 OpenAI 替换为华为云 ModelArts 托管的开源大模型(如 Llama3、Qwen)或直接调用 华为云盘古大模型 API。
2. 更强大的文档加载器:支持 PDF、Word、Markdown 甚至是网页内容的解析。
3. 更高级的检索策略:引入混合检索(关键词 + 向量检索)和重排(Rerank)模型,大幅提升准确率。
希望这篇文章对你理解和上手大模型 RAG 开发有所帮助!如果你在配置过程中遇到问题,欢迎在评论区留言讨论。
- 点赞
- 收藏
- 关注作者
评论(0)