【动手学大模型开发 19】使用LangChian添加历史对话的记忆功能

🌈 嗨,我是青松,很高兴遇到你!

🌟 希望用我的经验,让每个人的AI学习之路走的更容易些~

🔥 专栏:大模型(LLMs)高频面题全面整理(★2025最新版★)

5. 添加历史对话的记忆功能

现在我们已经实现了通过上传本地知识文档,然后将他们保存到向量知识库,通过将查询问题与向量知识库的召回结果进行结合输入到 LLM 中,我们就得到了一个相比于直接让 LLM 回答要好得多的结果。在与语言模型交互时,你可能已经注意到一个关键问题 - 它们并不记得你之前的交流内容。这在我们构建一些应用程序(如聊天机器人)的时候,带来了很大的挑战,使得对话似乎缺乏真正的连续性。这个问题该如何解决呢?

1. 记忆(Memory)

在本节中我们将介绍 LangChain 中的储存模块,即如何将先前的对话嵌入到语言模型中的,使其具有连续对话的能力。我们将使用 ConversationBufferMemory ,它保存聊天消息历史记录的列表,这些历史记录将在回答问题时与问题一起传递给聊天机器人,从而将它们添加到上下文中。

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",  # 与 prompt 的输入变量保持一致。
    return_messages=True  # 将以消息列表的形式返回聊天记录,而不是单个字符串
)Copy to clipboardErrorCopied

关于更多的 Memory 的使用,包括保留指定对话轮数、保存指定 token 数量、保存历史对话的总结摘要等内容,请参考 langchain 的 Memory 部分的相关文档。

2. 对话检索链(ConversationalRetrievalChain)

对话检索链(ConversationalRetrievalChain)在检索 QA 链的基础上,增加了处理对话历史的能力。

它的工作流程是:

  1. 将之前的对话与新问题合并生成一个完整的查询语句。
  2. 在向量数据库中搜索该查询的相关文档。
  3. 获取结果后,存储所有答案到对话记忆区。
  4. 用户可在 UI 中查看完整的对话流程。

这种链式方式将新问题放在之前对话的语境中进行检索,可以处理依赖历史信息的查询。并保留所有信 息在对话记忆中,方便追踪。

接下来让我们可以测试这个对话检索链的效果:

使用上一节中的向量数据库和 LLM !首先提出一个无历史对话的问题“我可以学习到关于提示工程的知识吗?”,并查看回答。

from langchain.chains import ConversationalRetrievalChain

retriever=vectordb.as_retriever()

qa = ConversationalRetrievalChain.from_llm(
    llm,
    retriever=retriever,
    memory=memory
)
question = "我可以学习到关于提示工程的知识吗?"
result = qa({"question": question})
print(result['answer'])Copy to clipboardErrorCopied
是的,您可以学习到关于提示工程的知识。本模块内容基于吴恩达老师的《Prompt Engineering for Developer》课程编写,旨在分享使用提示词开发大语言模型应用的最佳实践和技巧。课程将介绍设计高效提示的原则,包括编写清晰、具体的指令和给予模型充足思考时间等。通过学习这些内容,您可以更好地利用大语言模型的性能,构建出色的语言模型应用。Copy to clipboardErrorCopied

然后基于答案进行下一个问题“为什么这门课需要教这方面的知识?”:

question = "为什么这门课需要教这方面的知识?"
result = qa({"question": question})
print(result['answer'])Copy to clipboardErrorCopied
这门课程需要教授关于Prompt Engineering的知识,主要是为了帮助开发者更好地使用大型语言模型(LLM)来完成各种任务。通过学习Prompt Engineering,开发者可以学会如何设计清晰明确的提示词,以指导语言模型生成符合预期的文本输出。这种技能对于开发基于大型语言模型的应用程序和解决方案非常重要,可以提高模型的效率和准确性。Copy to clipboardErrorCopied

可以看到,LLM 它准确地判断了这方面的知识,指代内容是强化学习的知识,也就 是我们成功地传递给了它历史信息。这种持续学习和关联前后问题的能力,可大大增强问答系统的连续 性和智能水平。

### 关于大模型开发的教程和资源 #### 基础知识获取 对于希望进入大模型领域的人来说,初步了解基础知识至关重要。这可以通过多种途径实现,例如阅读相关书籍、学术论文或是参与在线课程[^1]。 #### 实践平台推荐 为了更好地理解和运用所学到的知识,在学习的过程中应当积极投入实践。建议使用一些流行的开源框架来进行实验,如 TensorFlow 和 PyTorch。这些工具不仅提供了丰富的文档和支持,还有大量的社区贡献案例可供参考。 #### 项目实战经验积累 当具备了一定程度上的理论基础之后,应该寻找机会参与到具体的工程项目当中去。可以选择诸如数据分析、自然语言处理以及计算机视觉等领域内的课题来锻炼自己解决问题的能力。同时也要善于借助互联网的力量——无论是官方文档还是第三方开发者论坛都是很好的求助渠道。 #### 深入研究与持续更新 随着技术的发展变化迅速,定期关注行业前沿进展非常重要。参加专业的研讨会或线上讲座能够帮助个人紧跟潮流;而订阅顶级期刊杂志则有助于深入了解最尖端的研究成果。此外,《动手学大模型应用开发》这本书籍提供了一个从零起步的学习路线图,它专注于培养读者的实际操作能力而非深究复杂的数学推导过程,非常适合初学者快速上手[^2]。 ```python import torch from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('bert-base-uncased') inputs = tokenizer("Hello world!", return_tensors="pt") outputs = model(**inputs) print(outputs.logits) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值