本地大模型编程实战(09)自制聊天机器人(3)


本文将实现一个比较完善的聊天机器人的主要功能。包括:

  • 使用 LangGraph 构建聊天机器人
  • 自动裁剪聊天历史
  • 管理聊天会话的方法
  • 以流的方式输出回复

我们将同时使用 llama3.1deepseek 做演示。由于 langchain 可能对不同大模型支持程度不同以及其它限制,所以这个对比并不能说明哪个模型更好。

准备

在正式开始撸代码之前,需要准备一下编程环境。

  1. 计算机
    本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:

    • CPU: Intel i5-8400 2.80GHz
    • 内存: 16GB
  2. Visual Studio Code 和 venv
    这是很受欢迎的开发工具,相关文章的代码可以在 Visual Studio Code 中开发和调试。 我们用 pythonvenv 创建虚拟环境, 详见:
    在Visual Studio Code中配置venv

  3. Ollama
    Ollama 平台上部署本地大模型非常方便,基于此平台,我们可以让 langchain 使用 llama3.1qwen2.5 等各种本地大模型。详见:
    在langchian中使用本地部署的llama3.1大模型

自动裁剪聊天历史

我们知道,LangGraph 构建的聊天机器人可以基于 State 自动记录聊天历史,这样大模型可以了解会话上下文,聊天的体验更好。
显然,由于大模型token大小限制以及内存限制,我们不可能每次把所有的聊天历史都发给大模型。
Langchain 提供了 trim_messages 方法,可以利用大模型的能力,智能裁剪聊天历史。
我们先定义裁剪聊天历史的方法:

def get_trimmer(model_name,max_tokens):
    """
    重要:请务必在在加载之前的消息之后,并且在提示词模板之前使用它。
    """
    model = ChatOllama(model=model_name,temperature=0.3,verbose=True)
    trimmer = trim_messages(
        max_tokens=max_tokens,  #设置裁剪后消息列表中允许的最大 token 数量
        strategy="last",        #指定裁剪策略为保留最后的消息,即从消息列表的开头开始裁剪,直到满足最大 token 数量限制。
        token_counter=model,    #通过model来计算消息中的 token 数量。
        include_system=True,    #在裁剪过程中包含系统消息(SystemMessage)
        allow_partial=False,    #不允许裁剪出部分消息,即要么保留完整的消息,要么不保留,不会出现只保留消息的一部分的情况。
        start_on="human",   #从人类消息(HumanMessage)开始进行裁剪,即裁剪时会从第一个HumanMessage开始计算 token 数量,之前的系统消息等也会被包含在内进行整体裁剪考量。
    )
    return trimmer

通过查看代码注释,我们可以发现这种裁剪方式很智能。
下面我们初始化一个消息列表,对它进行一下裁剪测试:

messages = [
    SystemMessage(content="你是个好助手"),
    HumanMessage(content="你好,我是刘大钧"),
    AIMessage(content="你好"),
    HumanMessage(content="我喜欢香草冰淇淋"),
    AIMessage(content="很好啊"),
    HumanMessage(content="3 + 3等于几?"),
    AIMessage(content="6"),
    HumanMessage(content="谢谢"),
    AIMessage(content="不客气"),
    HumanMessage(content="和我聊天有意思么?"),
    AIMessage(content="是的,很有意思"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值