零基础上手:基于 Python 和 LangChain 构建你的第一个 RAG(检索增强生成)智能问答系统

举报
cl16315 发表于 2026/10/29 08:14:41 2026/10/29
【摘要】 大模型(LLM)虽然强大,但在处理企业内部私有数据或特定领域知识时,常常会遇到“幻觉”或知识盲区。本文将带你从零开始,使用 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 开发有所帮助!如果你在配置过程中遇到问题,欢迎在评论区留言讨论。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。