AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


吴恩达DeepLearning.AI课程系列 - 大模型检索增强生成(七):对话
发布日期:2025-01-04 18:02:00 浏览次数: 1587 来源:机智流



1. 前言

经过了之前所有课程的学习,我们已经对数据处理和智能检索的全流程有了一个全面的了解。从海量信息中提取有价值的内容,这似乎是一件复杂而高深的事情,但其实背后的原理却有迹可循。这张图直观地呈现了整个流程:从文档加载到切分存储,再到高效检索和最终输出答案,每一步都环环相扣,缺一不可。

在课程中,我们不仅学会了如何从多种数据源获取文档,还掌握了切分文档的策略,以及向量化存储的核心技术。更重要的是,我们深入探索了如何通过精准的检索算法快速获取所需内容,并利用大型语言模型(LLM)生成高质量的答案。这些知识不仅让我们对技术有了更深的理解,也为未来的实际应用打下了坚实的基础。

本节课将带领大家深入探讨 Conversational Retrieval Chain(对话检索链)的技术架构,并通过实际案例演示,展示其如何结合对话历史和智能检索能力,动态地从知识库中提取与用户问题相关的信息,并通过大型语言模型生成准确的答案。这也是langchain正课中最后的一节课了,后续的课程中我们将会深入的探讨langchain的具体使用方式以及其局限性,从而更好的帮助我们进行大模型的开发工作。

2. Conversational Retrieval Chain

Conversational Retrieval Chain 是一种结合对话历史和智能检索能力的技术架构,用于动态地从知识库中提取与用户问题相关的信息,并通过大型语言模型(LLM)生成准确的答案。其主要目标是让用户可以在自然对话中获得准确、上下文相关的回答。

我们可以从下图看出其整体的流程:

  1. 对话历史(Chat History): 系统会记录用户的对话上下文,作为后续问题处理的重要输入。
  2. 问题输入(Question): 用户提出的问题被发送到检索模块。
  3. 检索器(Retriever): 系统通过检索器从向量数据库中提取与问题相关的内容(Relevant Splits)。
  4. 上下文结合(System & Human): 系统将用户问题和提取的相关信息整合到 Prompt 中,为语言模型提供结构化输入。
  5. 大型语言模型(LLM): LLM 基于上下文生成答案,并返回给用户。

相比起上节课我们学习到的RetrievalQA Chain(吴恩达DeepLearning.AI课程系列 - 大模型检索增强生成(六):问题回复),其最大的差异在于Chat History的使用。假如没有聊天记录的存在,我们每次与大语言模型的对话都是全新的对话。大语言模型不知道我们之前说过什么,因此每次的回复都是依靠着其本能进行回复。而假如我们加上了聊天记录,那么我们之前给他们设定的角色提出的要求就能够保留在记忆里,下次再问到的时候就不再需要重新进行调教了。

类似的,其实我们这节课一直以来强调的检索增强其实也是某种意义上的“历史记录”。向量数据库中记录的是之前或者说我们希望大模型知道的相关知识,而这些知识的提供同样能够让大模型摆脱单纯对于自身本能的依赖,进而能够借助更多的知识提供更全面更符合我们想法的回复。

那下面就让我们一起来看看这神奇的”聊天记录“是怎么样具体在代码层面上来操作的吧!

3. 实操演示

3.1. 环境准备

那在今天的练习里,我们也要准备好以下的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

3.2. 过去代码

上节课我们使用的完整代码如下所示。

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"])

3.3 Memory

在langchian中提供了一个简便的记忆力工具ConversationBufferMemory,我们可以直接导入进来代码之中。ConversationBufferMemoryLangChain 框架中的一个内存模块,用于管理对话历史记录。它的主要功能是以缓冲区的形式存储用户和 AI 之间的对话内容,并在需要时返回这些记录,从而使模型能够在上下文一致的情况下生成响应。

  • 该模块主要参数和功能
  1. memory_key用于指定存储对话历史记录的键名。这个键名可以在其他模块(如链或工具)中引用。
  2. **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'])

4. 总结

总的来说,本课程深入探讨了数据处理与智能检索技术。我们学习了完整的处理流程,包括文档加载、切分存储、精准检索,以及利用大语言模型生成答案。相比传统的 RetrievalQA Chain,Conversational Retrieval Chain 通过融合对话历史与智能检索功能,能够更好地理解上下文,提供连贯且高质量的回应。在实践环节,我们配置了必要的 Python 库,完成了从文档处理到问答链的构建。通过引入 ConversationBufferMemory 实现对话记忆功能,我们成功展示了模型如何准确理解上下文并做出恰当回应。

到这里,我们的"Langchain:Chat With Data"课程圆满结束了!在这门课程中,我们深入探讨了RAG技术的核心概念和应用,不仅掌握了检索增强生成的基本原理,还学习了多种实现方法和技术框架。通过实践,我们了解了从文档处理到智能对话的完整流程,以及如何运用不同的工具和策略来优化检索效果。这些知识将为我们未来开发更智能的数据交互系统打下坚实的基础。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询