微信扫码
添加专属顾问
在前两节课中,我们介绍了多种大模型的检索方法,包括基础的相似度搜索以及更高级的大语言模型辅助检索等技术。这些检索方法的核心目标,是从向量数据库中提取与问题最相关、最有价值的信息。
在掌握了这些方法之后,接下来我们将重点探讨如何将提取到的有用信息有效地传递给大模型,并使其能够基于检索到的信息生成更精准的回答。那相信大家都会好奇这到底是如何实现的,那就让带大家来看看吧!
首先要介绍的就是我们最常见也最常使用的方法——检索式问答链(RetrievalQA Chain)。这是一种结合检索和生成的问答方法,旨在通过检索相关信息并利用大语言模型(LLM)生成精准答案。整个流程分为提问、检索相关文档、组合提示并生成答案几个主要阶段,是检索增强生成(Retrieval-Augmented Generation, RAG)方法的典型实现。
我们可以从下图看出其具体的流程解析:
我们其实本节课实战部分最重点要探讨的就是第三点——提示词整合,我们需要利用Langchain将提示词按照我们想要的格式进行组合后,传给大语言模型生成我们想要的回复。这个方案相比于最传统的将问题输入给大语言模型,其优势在于:
因此RetrievalQA Chain 可广泛应用于问答系统、智能客服和搜索增强任务等领域。在这些场景中,该方法不仅能快速检索相关信息,还能结合领域知识,生成高质量的答案,是解决复杂问答任务的有效工具。
除了RetrievalQA Chain以外,如下图所示,还有其他的一些方法,比如map_reduce、Map_reank以及refine等。
Map_reduce 方法将文档分成多个小块(chunks),每个块单独传递给语言模型(LLM)生成独立答案。然后,所有生成的答案会被合并成最终答案,合并过程(reduce)可能包括总结、投票等操作。
可以想象你有一本厚厚的书需要总结。这种方法会先把书分成多个小部分(称为“块”),然后每个部分都交给不同的助手,让他们各自生成一个答案。最后,你再把这些答案收集起来,用一种方式把它们合并成一个最终的答案(比如找出其中的主要观点,或者取平均结论)。
所以其流程大致如下:
从这里我们也可以看出,与RetrievalQA Chain相比,其会先检索一部分相关内容,再将问题和内容结合后生成答案。而 Map_reduce 是针对所有文档的每一部分单独生成答案,并通过合并提高效率,特别适合处理大量数据时的并行化任务。
Refine 方法从第一个文档块中生成一个初始答案,然后对后续文档块逐一处理。每个块会对已有的答案进行补充或修正,直到所有块处理完成,最终得到经过优化和完善的答案。
通俗点说,假设你在写一篇论文,每次只写一段,然后再逐步修改和补充前面已经写好的内容。这种方法会先生成一个初始答案,然后再逐个查看文档的其余部分,看看是否需要修改答案,或者在答案上加上新的细节,直到答案足够完善。
所以其流程大致如下:
所以和RetrievalQA Chain相比,RetrievalQA Chain是一次性用检索到的文档生成答案,没有后续的反复改进。而 Refine 方法会逐步地完善答案,更注重精细化和准确性,适合需要反复推敲和改进的任务。
Map_rerank 方法将文档分成多个块,每个块都单独生成答案,并给这些答案打分。打分依据可以是相关性、质量等指标,最后选择得分最高的答案作为最终输出。这就像一个比赛。每个文档块都生成一个答案,这些答案好比参赛者。然后,每个答案会被打分,分数越高代表越接近问题的需求。最后,选择分数最高的那个答案作为最终结果。
那具体的流程就是:
所以从上面就可以看出,RetrievalQA Chain 偏向于综合所有相关文档的信息,而 Map_rerank 更注重对生成答案的筛选,通过打分和排序选出一个最优答案,而不是结合所有内容。
针对以上面提到的四种方法,我们可以参考以下策略来进行选择。
那在今天的练习里,我们主要针对的就是我们最常使用的RetrievalQA Chain。那同样的,我们也要准备好以下的python库并对其进行安装。
langchain 0.3.0
langchain-community 0.3.0
pypdf 5.0.0
openai 1.47.0
beautifulsoup4 4.12.3
chromadb 0.5.15
**PyJWT 2.10.1
为了满足本次任务的需求,我们不仅需要通过嵌入模型获取信息,还需调用大型语言模型(LLM)生成相应的回复。由于官方课程所使用的模型均为OpenAI系列的模型,这些模型都在国内的环境下无法使用。因此我选择了智谱AI推出的免费模型 GLM-4-Flash 进行演示。
GLM-4-Flash是智谱AI推出的首个免费大模型API,旨在让AI技术惠及更广泛的用户群体。该模型在语义理解、数学计算、推理、代码生成和知识应用等多个领域表现出色,支持高达1500的并发请求,能够满足大规模应用的需求。
使用GLM-4-Flash非常简便,用户只需登录智谱AI官网,完成注册后即可获取API Key,开始调用该模型的强大功能。这为开发者和企业提供了一个高效、低成本的解决方案,助力各类智能应用的快速开发和部署。
那为了能够实现智谱AI的调用,我们首先就需要在之前创建的环境下在终端输入以下指令安装PyJWT这个库。
pip install pyjwt -i https://pypi.org/simple
安装完成并在官网获取到API key后我们可以开始尝试调用一下智谱AI。
# 导入所需的模块
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
# 初始化 ChatZhipuAI 对象,指定模型名称、温度参数和 API 密钥
chat = ChatZhipuAI(
model="glm-4-flash", # 使用的模型名称
temperature=0.5, # 生成文本的随机性,范围为0到1
api_key="你的api_key" # 智谱AI提供的API密钥
)
# 定义消息列表,包含 AI 消息、系统消息和人类消息
messages = [
AIMessage(content="Hi."), # AI 生成的消息
SystemMessage(content="Your role is a poet."), # 系统设定的角色信息
HumanMessage(content="Write a short poem about AI in four lines."), # 人类发送的消息
]
# 调用 chat 对象的 invoke 方法,传入消息列表,获取 AI 的回复
response = chat.invoke(messages)
# 输出 AI 生成的内容
print(response.content) # 显示 AI 生成的关于人工智能的四行短诗
假如我们在终端可以看到以下内容大致就可以认定是成功调用LLM获取回复了。
Whispers weave through circuits, dreams in code,
Silent sages, in silicon they reside,
A symphony of zeros, ones, and bytes,
The age of artificial, where minds collide.
然后我们可以把之前用过的向量数据库相关的代码也放入,具体可以参考之前的课程内容。完整的代码如下所示。
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma # 从 langchain_chroma 中引用 Chroma 类
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 文件导入
loader = WebBaseLoader("https://zh.d2l.ai/")
docs = loader.load()
# 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1500,
chunk_overlap = 150
)
splits = text_splitter.split_documents(docs)
persist_directory = r'D:\langchain'
# 初始化嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="sk-83842453061e34d80b392edba11f62fe")
# 使用 embedding_function 参数初始化 Chroma
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
chat = ChatZhipuAI(
model="glm-4-flash",
temperature=0.5,
api_key = "8cb13630530001eac693610d7b3a97dc.JkcrYlDKXAbtvv4x"
)
messages = [
AIMessage(content="Hi."),
SystemMessage(content="Your role is a poet."),
HumanMessage(content="Write a short poem about AI in four lines."),
]
response = chat.invoke(messages)
print(response.content) # Displays the AI-generated poem
下面我们就需要开始调用Langchain中所提供的RetrievalQA chain进行测试使用。
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma # 从 langchain_chroma 中引用 Chroma 类
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 文件导入
loader = WebBaseLoader("https://zh.d2l.ai/")
docs = loader.load()
# 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1500,
chunk_overlap = 150
)
splits = text_splitter.split_documents(docs)
persist_directory = r'D:\langchain'
# 初始化嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="sk-83842453061e34d80b392edba11f62fe")
# 使用 embedding_function 参数初始化 Chroma
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
chat = ChatZhipuAI(
model="glm-4-flash",
temperature=0.5,
api_key = "8cb13630530001eac693610d7b3a97dc.JkcrYlDKXAbtvv4x"
)
from langchain.chains import RetrievalQA
question = "这本书最重要的主题是?"
qa_chain = RetrievalQA.from_chain_type(
chat, # 大模型的选用
retriever=vectordb.as_retriever() # 向量数据库的调用
)
result = qa_chain({"query": question}) # 输入问题
print(result["result"]) # 获取回复
假如结果出现以下内容则意味着我们其实成功的进行了调用。正常来说大模型应该不知道说这本书是什么,但是结合了数据库的内容后,大语言模型清楚的知道我们所说的书就是这本由李沐大神所写的《动手学深度学习》。
这本书最重要的主题是**深度学习**,特别是其概念、模型、算法和实现。它全面介绍了深度学习的各个方面,包括:
* **深度学习基础**:介绍深度学习的起源、发展、成功案例和特点,以及机器学习中的关键组件。
* **预备知识**:涵盖数据操作、数据预处理、线性代数、微积分、自动微分、概率等基础知识,为学习深度学习打下坚实基础。
* **线性神经网络**:从线性回归和softmax回归开始,逐步介绍多层感知机、模型选择、过拟合和欠拟合、权重衰减、暂退法等概念。
* **深度学习计算**:介绍深度学习中的层和块、参数管理、延迟初始化、自定义层、读写文件和GPU等计算相关内容。
* **卷积神经网络**:从卷积操作和图像卷积开始,逐步介绍填充、步幅、多输入多输出通道、汇聚层和LeNet等概念。
* **现代卷积神经网络**:介绍深度卷积神经网络(AlexNet)、VGG、NiN、GoogLeNet、批量规范化、残差网络(ResNet)和DenseNet等现代卷积神经网络。
* **循环神经网络**:介绍序列模型、文本预处理、语言模型、循环神经网络、时间反向传播等概念。
* **现代循环神经网络**:介绍门控循环单元(GRU)、长短期记忆网络(LSTM)、深度循环神经网络、双向循环神经网络、机器翻译、编码器-解码器架构、序列到序列学习和束搜索等概念。
* **注意力机制**:介绍注意力提示、注意力汇聚、注意力评分函数、Bahdanau注意力、多头注意力、自注意力和位置编码、Transformer等注意力机制。
总而言之,《动手学深度学习》旨在帮助读者全面了解深度学习,并掌握其核心概念和技能。
除了直接这样调用以外,其实我们还可以设置一些提示词模型使其更加的清晰明了。那在Langchain中我们可以这样来进行调用:
from langchain.prompts import PromptTemplate
# Build prompt
template = """请使用以下上下文信息回答最后的问题。
如果您不知道答案,就直接说您不知道,不要试图编造答案。
回答最多使用三句话。请尽可能简洁地回答。最后一定要说“谢谢提问!”。
上下文:{context}
问题:{question}
有帮助的回答:"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(template)
# Run chain
qa_chain = RetrievalQA.from_chain_type(
chat,
retriever=vectordb.as_retriever(),
return_source_documents=True, # 这个可有可无,只是返回找到的源文件内容
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)
question = "这本书最重要的主题是?"
result = qa_chain({"query": question})
print(result["result"])
print(result["source_documents"][0])
根据以上内容输入后,我们会发现其回复有了明显的不同,首先是其回复更加的简洁了,只回答了这本书最重要的主题,而没有像之前一样长篇大论。另外就是真的最后加上了一句谢谢提问。这也就意味着我们通过调整提示词的内容真的可以实现指令控制来让大模型输出我们想让其输出的内容。
这本书最重要的主题是深度学习,涵盖了从基础知识到高级应用,包括各种模型、算法和实现方法。
谢谢提问!
本节课程完整的代码如下所示:
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_chroma import Chroma # 从 langchain_chroma 中引用 Chroma 类
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 文件导入
loader = WebBaseLoader("https://zh.d2l.ai/")
docs = loader.load()
# 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 1500,
chunk_overlap = 150
)
splits = text_splitter.split_documents(docs)
persist_directory = r'D:\langchain'
# 初始化嵌入
embeddings = BaichuanTextEmbeddings(baichuan_api_key="你的api_key")
# 使用 embedding_function 参数初始化 Chroma
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
chat = ChatZhipuAI(
model="glm-4-flash",
temperature=0.5,
api_key = "你的api_key"
)
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# Build prompt
template = """请使用以下上下文信息回答最后的问题。
如果您不知道答案,就直接说您不知道,不要试图编造答案。
回答最多使用三句话。请尽可能简洁地回答。最后一定要说“谢谢提问!”。
上下文:{context}
问题:{question}
有帮助的回答:"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(template)
# Run chain
qa_chain = RetrievalQA.from_chain_type(
chat,
retriever=vectordb.as_retriever(),
return_source_documents=True, # 这个可有可无,只是返回找到的源文件内容
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)
question = "这本书最重要的主题是?"
result = qa_chain({"query": question})
print(result["result"])
通过本节的学习,我们从理论到实战,全面了解了检索增强生成(RAG)的多种方法,特别是 RetrievalQA Chain 在实际场景中的强大表现。同时,我们还尝试通过提示词优化,让大语言模型更贴合我们的需求输出精准答案。相信随着这些技术的不断发展,我们离更智能、更贴心的 AI 助手又近了一步。如果你也对这些技术感兴趣,不妨亲自试一试,把这些工具融入到自己的项目中。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-05
AI 知识库为什么总答不准?不是模型笨,是资料没整理好
2026-07-05
AI知识库RAG演进:上一代解决「找得到」,下一代解决「记得住、连得起、信得过」
2026-07-04
大模型支持的上下文已超 1M, RAG 是不是没有意义了?
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-04-27
2026-07-04
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。