微信扫码
与创始人交个朋友
我要投稿
经过了之前所有课程的学习,我们已经对数据处理和智能检索的全流程有了一个全面的了解。从海量信息中提取有价值的内容,这似乎是一件复杂而高深的事情,但其实背后的原理却有迹可循。这张图直观地呈现了整个流程:从文档加载到切分存储,再到高效检索和最终输出答案,每一步都环环相扣,缺一不可。
在课程中,我们不仅学会了如何从多种数据源获取文档,还掌握了切分文档的策略,以及向量化存储的核心技术。更重要的是,我们深入探索了如何通过精准的检索算法快速获取所需内容,并利用大型语言模型(LLM)生成高质量的答案。这些知识不仅让我们对技术有了更深的理解,也为未来的实际应用打下了坚实的基础。
本节课将带领大家深入探讨 Conversational Retrieval Chain(对话检索链)的技术架构,并通过实际案例演示,展示其如何结合对话历史和智能检索能力,动态地从知识库中提取与用户问题相关的信息,并通过大型语言模型生成准确的答案。这也是langchain正课中最后的一节课了,后续的课程中我们将会深入的探讨langchain的具体使用方式以及其局限性,从而更好的帮助我们进行大模型的开发工作。
Conversational Retrieval Chain 是一种结合对话历史和智能检索能力的技术架构,用于动态地从知识库中提取与用户问题相关的信息,并通过大型语言模型(LLM)生成准确的答案。其主要目标是让用户可以在自然对话中获得准确、上下文相关的回答。
我们可以从下图看出其整体的流程:
相比起上节课我们学习到的RetrievalQA Chain(吴恩达DeepLearning.AI课程系列 - 大模型检索增强生成(六):问题回复),其最大的差异在于Chat History的使用。假如没有聊天记录的存在,我们每次与大语言模型的对话都是全新的对话。大语言模型不知道我们之前说过什么,因此每次的回复都是依靠着其本能进行回复。而假如我们加上了聊天记录,那么我们之前给他们设定的角色提出的要求就能够保留在记忆里,下次再问到的时候就不再需要重新进行调教了。
类似的,其实我们这节课一直以来强调的检索增强其实也是某种意义上的“历史记录”。向量数据库中记录的是之前或者说我们希望大模型知道的相关知识,而这些知识的提供同样能够让大模型摆脱单纯对于自身本能的依赖,进而能够借助更多的知识提供更全面更符合我们想法的回复。
那下面就让我们一起来看看这神奇的”聊天记录“是怎么样具体在代码层面上来操作的吧!
那在今天的练习里,我们也要准备好以下的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
上节课我们使用的完整代码如下所示。
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"])
在langchian中提供了一个简便的记忆力工具ConversationBufferMemory,我们可以直接导入进来代码之中。ConversationBufferMemory
是 LangChain
框架中的一个内存模块,用于管理对话历史记录。它的主要功能是以缓冲区的形式存储用户和 AI 之间的对话内容,并在需要时返回这些记录,从而使模型能够在上下文一致的情况下生成响应。
memory_key
:用于指定存储对话历史记录的键名。这个键名可以在其他模块(如链或工具)中引用。return_messages
**:如果设置为 True
,返回的对话历史记录是一个消息对象列表(如用户消息和 AI 消息对象)。如果设置为 False
,返回的是一个字符串,将所有消息拼接成一个文本块。from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
然后我们还需要注释掉原本RetrievalQA后,将我们这节课所需要使用的ConversationalRetrievalChain也同样进行导入,并为其进行基础的配置。
from langchain.chains import ConversationalRetrievalChain
retriever=vectordb.as_retriever()
qa = ConversationalRetrievalChain.from_llm(
chat,
retriever=retriever,
memory=memory
)
然后我们就可以传入我们的问题进行尝试了。
# 第一次提问,明确告诉模型要记住的信息
question = "这本书有讲到关于计算机视觉的内容吗?不超过100字。"
result = qa.invoke({"question": question})
print(result['answer'])
# 第二次提问,模型会基于记忆回答
question = "请用几句话介绍一下这个主题可以吗?不超过100字。"
result = qa.invoke({"question": question})
print(result['answer'])
然后运行代码我们就能看到以下的回复:
# 第一次问题的回复
是的,这本书涵盖了计算机视觉的内容,包括图像增广、微调、目标检测、语义分割、风格迁移等,并介绍了R-CNN系列、SSD、全卷积网络等模型。
# 第二次问题的回复
根据目录,这本书涵盖了以下计算机视觉相关内容:
**1. 计算机视觉基础**:
* 图像增广
* 微调
* 目标检测和边界框
* 锚框
* 多尺度目标检测
* 目标检测数据集
* 单发多框检测(SSD)
* 区域卷积神经网络(R-CNN)系列
* 语义分割和数据集
* 转置卷积
* 全卷积网络
* 风格迁移
**2. 实战案例**:
* 实战 Kaggle 比赛:图像分类 (CIFAR-10)
* 实战Kaggle比赛:狗的品种识别(ImageNet Dogs)
**3. 相关技术**:
* 卷积神经网络(CNN)
* 目标检测
* 语义分割
**4. 应用领域**:
* 图像分类
* 目标检测
* 语义分割
* 风格迁移
**总结**:
这本书提供了计算机视觉领域的全面概述,包括基础知识、关键技术、实战案例和应用领域,适合不同层次的读者 学习和了解计算机视觉。
可以看出,在增加了memory功能后,上一次的问题和回复就会被加入到下一次问题的对话当中了,模型也记住我们上面问的主题是“计算机视觉”,然后在后面给的也是和“计算机视觉”相关的回复了。
完整代码如下所示:
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
from langchain_community.document_loaders import WebBaseLoader, PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
# 文件导入
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")
vectordb = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
# 初始化聊天模型
chat = ChatZhipuAI(
model="glm-4-flash",
temperature=0.5,
api_key="8cb13630530001eac693610d7b3a97dc.JkcrYlDKXAbtvv4x"
)
# 初始化内存
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 创建 ConversationalRetrievalChain
retriever = vectordb.as_retriever()
qa = ConversationalRetrievalChain.from_llm(
chat,
retriever=retriever,
memory=memory
)
# 第一次提问,明确告诉模型要记住的信息
question = "这本书有讲到关于计算机视觉的内容吗?不超过100字。"
result = qa.invoke({"question": question})
print(result['answer'])
# 第二次提问,模型会基于记忆回答
question = "请用几句话介绍一下这个主题可以吗?不超过100字。"
result = qa.invoke({"question": question})
print(result['answer'])
总的来说,本课程深入探讨了数据处理与智能检索技术。我们学习了完整的处理流程,包括文档加载、切分存储、精准检索,以及利用大语言模型生成答案。相比传统的 RetrievalQA Chain,Conversational Retrieval Chain 通过融合对话历史与智能检索功能,能够更好地理解上下文,提供连贯且高质量的回应。在实践环节,我们配置了必要的 Python 库,完成了从文档处理到问答链的构建。通过引入 ConversationBufferMemory 实现对话记忆功能,我们成功展示了模型如何准确理解上下文并做出恰当回应。
到这里,我们的"Langchain:Chat With Data"课程圆满结束了!在这门课程中,我们深入探讨了RAG技术的核心概念和应用,不仅掌握了检索增强生成的基本原理,还学习了多种实现方法和技术框架。通过实践,我们了解了从文档处理到智能对话的完整流程,以及如何运用不同的工具和策略来优化检索效果。这些知识将为我们未来开发更智能的数据交互系统打下坚实的基础。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-01-06
探索AI Agent工作流设计模式:构建智能任务协作的未来
2025-01-04
2024年AI Agents发展现状:机遇与挑战并存
2024-12-26
开发者的选择越来越多了,又一个AI智能体框架玩家:PydanticAI
2024-12-25
2025年,拥抱AI Agent!
2024-12-25
基于LangChain构建安全Agent应用实践(含代码)
2024-12-22
ANTHROPIC:高端的食材往往需要最朴素的烹饪方法: prompt, workflow, agent
2024-12-21
用LangChain教AI模仿你的写作风格:详细教程
2024-12-18
一站式 LLM 工程观测平台:Langfuse,让所有操作可观测
2024-04-08
2024-08-18
2024-10-10
2024-06-03
2024-04-08
2024-04-17
2024-09-04
2024-06-24
2024-07-13
2024-04-11
2024-12-02
2024-11-25
2024-10-30
2024-10-11
2024-08-18
2024-08-16
2024-08-04
2024-07-29