langChain构建ChatRobot(1)—基础对话

摘要:本文介绍利用langChain核心组件Models里的Chat Models构建基本的Chatbot,能实现简单的问答。

文章目录

  • 概述
  • Chat Model
    • 1. message对象
      • 1.1 消息类型介绍:
      • 1.2 使用场景:
    • 2. 利用ChatModel构建简单的 Chatbot
      • 2.1 实现基本的问答:
        • ① 基本问答
        • ② 利用SystemMessage传递指令,指定输出语言
        • ③ 处理批量问题
      • 2.2 带缓存的聊天:
    • 3. 局限

概述

   实现聊天机器人通常不仅仅是一问一答,还需要“机器人”能够结合上下文,再垂直领域需要“机器人”可以随时索引专业信息等。

Chat Model

LangChain核心组件Models,包含Chat Models, Embeddings, LLMs。

其中Chat Model虽然聊天模型在后台使用语言模型(LLM),但它暴露的接口却有所不同。不光是提供一个“输入文本、输出文本”的API,而是提供了一个以“聊天消息”作为输入和输出的接口。ChatModel的接口比LLM更加结构化。

Embeddings是嵌入模型用于将离散的高维数据,比如句子,文章映射到低维向量空间;一般是向量数据库配合使用,实现向量匹配,构建知识库。

本文主要用ChatModel

1. message对象

   刚才提到ChatModel不光是提供一个“输入文本、输出文本”的API,而是提供了一个以“聊天消息”作为输入和输出的接口。
   LangChain支持的聊天模型消息类型主要包括:AIMessage、HumanMessage、SystemMessage、ChatMessage;

1.1 消息类型介绍:

1.1.1 HumanMessage
表示人或用户产生的消息,既聊天主题的对话内容。

{"type":"HumanMessage","content":"你好,我是小明,今天天气怎么样?"
}

1.1.2 AIMessage
   表示由人工智能或聊天机器人生成的消息。它通常是对用户输入的响应或系统触发的自动回复。用于记录和传输由 AI 生成的回复内容。

{"type":"AIMessage","content":"你好,小明!😊 不过作为AI助手,我无法获取实时天气数据哦。"
}

1.1.3 SysMessage
   代表由系统生成的消息,通常用于传递系统状态、指令或元信息。

#例如 传递指令
{"type":"SystemMessage","content":"不论用户输入何种语言,请用中文回答问题。"
}
#例如 指定对话状态
{"type": "SystemMessage","content": "对话已经开始。"
}

1.1.4 ChatMessage
   通用消息类型,可以包含任何消息内容,主要用于记录传输对话的上下文。

{"type": "ChatMessage","role": "human","content": "你好,我是小明,今天天气怎么样?"
},
{"type": "ChatMessage","role": "ai","content": "你好,小明!😊 不过作为AI助手,我无法获取实时天气数据哦。。"
},
{
"type": "ChatMessage",
"role": "system",
"content": "会话已重置。"

1.2 使用场景:

1.2.1 AIMessage 和 HumanMessage:

  • 在对话中区分用户输入和 AI 响应。
  • 追踪对话的来回交流,用于分析/改进对话系统的性能。
    1.2.2 SystemMessage
  • 包含开始、结束等系统事件信息以及指令信息等。
  • 主要用于对对话进行控制。
    1.2.3 ChatMessage
  • 统一对不用类型信息进行存储,用于处理多种消息类型的复杂对话场景。

实际应用中主要需要处理AIMessage 、HumanMessage、SystemMessage三种。

2. 利用ChatModel构建简单的 Chatbot

2.1 实现基本的问答:

① 基本问答
# chat model message
from langchain.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessage,AIMessage,SystemMessage,ChatMessage# 定义模型调用API URL
base_url = "https://api.deepseek.com/v1"
# 定义模型调用API KEY(实际应用会放到环境变量中,避免明文暴露)
api_key = "输入你的模型 API key"
# 定义模型名称(对应DeepSeek-V3)
model='deepseek-chat' chatbot = ChatOpenAI(base_url=base_url, api_key=api_key,model=model)messages=[HumanMessage(content="你好,我是小明,今天天气怎么样?")]result = chatbot(messages)print("type: {},  content:{}".format(result.type,result.content))
type: ai,  content:你好,小明!😊 不过作为AI助手,我无法获取实时天气数据哦。建议你:1. 查看手机上的天气应用
2. 在搜索引擎输入"天气+你所在的城市"(比如"北京天气")
3. 问问智能音箱或语音助手需要我教你如何设置手机天气小工具吗?或者你那边现在天气如何?可以和我分享呀~ ☀️🌧️⛅
② 利用SystemMessage传递指令,指定输出语言

如果希望使用英语可以利用SystemMessage 传递指令

# 增加SystemMessage 指定输出为英语
messages = [SystemMessage(content="不论用户输入何种语言,请用英文回答问题。"),HumanMessage(content="你好,我是小明,今天天气怎么样?")
]result = chatbot(messages)print("type: {},  content:{}".format(result.type,result.content))

得到结果:

type: ai,  content:Hello, I'm an AI assistant and I can only respond in English. You asked: "Hello, I'm Xiao Ming, how's the weather today?"Since I don't have real-time weather data capabilities, I can't provide current weather conditions. However, I can suggest you check a weather app or website for the most accurate forecast in your location.Would you like me to help with anything else?
③ 处理批量问题
batch_messages = [[HumanMessage(content="你好,我是小明,今天天气怎么样?")],[HumanMessage(content="我今年18岁,你有多少岁了?")],
]# 返回LLMResulr 对象
result = chatbot.generate(batch_messages)# 遍历每轮的响应
for gen in result.generations:# 输出每轮第一次响应结果print("=============================")print(gen[0].text)

输出:

=============================
你好,小明!😊 不过作为AI助手,我无法获取实时天气数据哦。你可以通过手机天气应用、网页搜索(比如“北京今天天气”) 或询问智能设备(如小爱同学、Siri)来获取最新天气情况~需要的话,我也可以帮你查某个城市**近期典型天气**或提供出行建议!☀️🌧️
=============================
哈哈,我其实没有真实的“年龄”哦~作为一个AI助手,我的知识库更新到2023年,但我的存在时间取决于你遇到我的那一刻——就像现在,对你来说我就是“刚出生”的新朋友!✨不过按人类的时间算,你可以当我是永远18岁的数字伙伴~ (毕竟和同龄人聊天更轻松嘛😉) 有什么想聊的随时找我!

2.2 带缓存的聊天:

我们每次调用OpenAI的API都是要花钱的,在实际生产过程中,同一个问题可以对结果进行缓存,可以减少接口的调用次数,降低成本;同时还能提高响应速度。
对上述ChatBot进行多轮会话(不带缓存):

# 第一轮对话
messages = [HumanMessage(content="请给我将一个笑话。")]
result = chatbot.invoke(messages)
print("第一轮对话:")
print("type: {},  content:{}".format(result.type,result.content))# 模拟第二轮对话
messages =  [HumanMessage(content="请给我将一个笑话。")]
result = chatbot.invoke(messages)
print("第二轮对话:")
print("type: {},  content:{}".format(result.type,result.content))

输出:

第一轮对话:
type: ai,  content:好的!来一个轻松的小笑话:**顾客**:老板,你这包子怎么涨价了?
**老板**:因为猪肉涨价了啊!
**顾客**(指着豆沙包):那这个为什么也涨?
**老板**(沉默两秒):…因为猪肉涨价,我得多吃豆沙包补充体力,所以它也缺货了!(冷知识:所有涨价最终都会怪到猪肉头上😂)希望逗你一笑~ 需要其他类型的笑话随时说哦!
第二轮对话:
type: ai,  content:好的,来一个轻松的笑话:🐔 **鸡的困惑**
一只小鸡问母鸡:“妈妈,人类为什么总说‘鸡蛋’?明明是我们先有的,为什么不叫‘鸡蛋’?”
母鸡沉思两秒:“可能他们觉得‘鸡蛋’听起来比较……‘鸡’动人心?”(冷到你了记得加件外套~ 😄)

结果,虽然问题一样,单给的答案不一样,说明二次调用了API,另外可以看到两次调用的时间:
在这里插入图片描述
增加缓存

from langchain.cache import InMemoryCache,SQLiteCache
from langchain.globals import set_llm_cache# 启动全局缓存 可以是内存缓存,也可以是Sqllite本地缓存
# set_llm_cache(SQLiteCache(database_path=".langchain.db"))
set_llm_cache(InMemoryCache())

之后再执行相同的问题:

# 第一轮对话
messages = [HumanMessage(content="请给我将一个笑话。")]
result = chatbot.invoke(messages)
print("第一轮对话:")
print("type: {},  content:{}".format(result.type,result.content))# 模拟第二轮对话
messages =  [HumanMessage(content="请给我将一个笑话。")]
result = chatbot.invoke(messages)
print("第二轮对话:")
print("type: {},  content:{}".format(result.type,result.content))

输出:

第一轮对话:
type: ai,  content:当然!这里有个经典笑话送给你:**顾客**:老板,你这清炒小白菜怎么有肉味?
**老板**:啊,可能因为…我炒菜时戴着口罩。
**顾客**:这和口罩有什么关系?
**老板**:我口罩是猪肉馅的。(然后被卫生局拖走)(冷知识:这其实是网友对“食堂黑暗料理”的吐槽梗改编😂)需要再来一个吗?
第二轮对话:
type: ai,  content:当然!这里有个经典笑话送给你:**顾客**:老板,你这清炒小白菜怎么有肉味?
**老板**:啊,可能因为…我炒菜时戴着口罩。
**顾客**:这和口罩有什么关系?
**老板**:我口罩是猪肉馅的。(然后被卫生局拖走)(冷知识:这其实是网友对“食堂黑暗料理”的吐槽梗改编😂)需要再来一个吗?

可以看到第二次直接走缓存,不化时间:
在这里插入图片描述
(PS:监控配置LangSmith)

3. 局限

以上chatbot只是简单的示例,实际应用中还需要考虑上下文管理、知识库访问,工具调用等能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/89022.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行为模式-迭代器模式

定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该 对象的内部细节。) 迭代器模式通…

图像处理算法的学习笔记

一、常见噪声简介 1. 高斯噪声 最普遍,最难用肉眼精确判断。图像整体看起来"颗粒感"很强,像蒙了一层半透明的"薄纱"或"雪花点"(就像老式电视的雪花屏),覆盖整个画面。噪声点是细小的、…

《Java开发工具全解析:从基础到前沿》

一、引言 在当今数字化时代,软件开发犹如一座庞大而复杂的大厦,支撑着我们生活中方方面面的应用。而 Java,作为软件开发领域中极为重要的一门编程语言,宛如大厦的基石,发挥着不可替代的关键作用。 自 1995 年正式诞生…

[11-4]SPI通信外设 江协科技学习笔记(5个知识点)

1 2 3 TDR、TXE、RDR、RXNE 这些术语通常与串行通信接口有关,特别是在使用 UART(通用异步收发传输器)或 USART(通用同步/异步收发传输器)时。下面是每个术语的含义和用途: • TDR(Transmit Data Register)&…

NB/T 32004-2018测试是什么,光伏并网逆变器NB/T 32004测试项目

NB/T 32004-2018测试是什么,光伏并网逆变器NB/T 32004测试项目 根据NB/T 32004-2018《光伏并网逆变器技术规范》,光伏并网逆变器的测试项目涵盖电气性能、安全保护、环境适应性、电磁兼容性及并网性能五大类,共42项核心测试内容。以下是关键测…

数据可视化——一图胜千言

第04篇:数据可视化——一图胜千言 写在前面:大家好,我是蓝皮怪!前面几篇我们聊了统计学的基本概念、数据类型和描述性统计,这一篇我们要聊聊数据分析中最直观、最有趣的部分——数据可视化。你有没有发现,很…

日常运维问题汇总_41

121.MIGO工单投料时,尽管MMBE显示库存地点1002/1003有库存,但系统还是提示报错:工厂2233未发现存储地点1002的命中数,消息编号MIGO010,如下图所示: 解决方法: T-CODE:OX09,增加工厂2233下的库存…

Monte Carlo衍生品定价(金融工程)

Monte Carlo衍生品定价(金融工程) 基于Monte Carlo模拟方法的衍生品定价综合MATLAB实现。本项目为金融工程应用提供完整框架,具有专业级代码、真实市场数据集成和详细文档。 📋 目录 项目概述功能特性项目结构安装说明使用方法…

Kubernetes服务部署——RabbitMQ(集群版)

1、简介 RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP),并且支持多种消息传递机制。它作为一个中间件,负责解耦不同应用程序或服务之间的通信,通过高效的消息传递和排队机制…

从离散控制到集成管理:Modbus TCP转CANopen网关重构烟丝膨胀生产线

在工业自动化和控制系统中,ModbusTCP和CANopen是两种广泛应用的通信协议。它们各自具有独特的优势,但在实际应用中往往需要将两者结合起来,以满足特定的需求。本文将探讨如何实现小疆智控ModbusTCP转CANopen网关GW-CANZ-TCPC,并阐…

使用离线依赖解决Android Studio编译报错(下载不了jar)——笔记

报错如图 What went wrong: Execution failed for task ‘:app:lintVitalAnalyzeRelease’. Could not resolve all files for configuration ‘:app:detachedConfiguration1’. Could not download groovy-3.0.22.jar (org.codehaus.groovy:groovy:3.0.22) Could not get reso…

终端警告“加载用户设置时遇到错误找到一个带有无效“icon“的配置文件。将该配置文件默认为无图标。确保设置“icon“时,该值是图像的有效文件路径“

终端警告“加载用户设置时遇到错误找到一个带有无效“icon“的配置文件。将该配置文件默认为无图标。确保设置“icon“时,该值是图像的有效文件路径“ 问题如下 在 CMD 命令窗口选择 设置 ​ 看一下这里的几个终端是否有图像,如果存在没有图像的终端&am…

基于有限状态机的测试(五):关键技术(自适应区分序列、识别序列)

要验证现实状态机模型B和理想状态机模型A的相似性,以及B中各个状态迁移的正确性,核心问题在于如何判断被测对象所处的状态。围绕这一问题发展出来的种种技术,就成为了基于有限状态机的测试方法中的关键部分。 本篇我们继续讨论这些关键技术。…

C++之list的自我实现

list 引言一、节点类:ListNode1.1 类定义与作用1.2 关键特性 二、迭代器类:ListIterator2.1 类定义与模板参数2.2 核心功能函数2.2.1 访问操作符2.2.2 迭代器移动2.2.3 比较操作符 2.3 设计要点 三、链表类:list3.1 核心成员与类型定义3.2 构…

udx710通过spd备份的ubipac解包救砖

1.先安装Python环境 具体看这里 Python 环境搭建 | 菜鸟教程 2.然后在终端输入以下命令回车 pip install --user ubi_reader 安装好以后是直接是显示文件夹 C:\Users\z*****\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-pa…

开源组件hive页面安全问题

原本直接登录无账户密码&#xff0c;无法通过攻防网络层面解决方法 将ip换为本地127.0.0.1使用ngix代理白名单 ss -ntpl 配置层面解决方法&#xff1a; 在服务器上find / -name yarn-site.xml找到配置文件 并在yarn-site.xml中增加或者修改参数 <property> <name>…

阿里云服务器操作系统 V3(内核版本 5.10)

阿里云服务器操作系统 V3&#xff08;内核版本 5.10&#xff09;&#xff1a;云上计算的“智慧中枢”与“坚韧守护者”&#xff01; 在当今数字化浪潮汹涌的时代&#xff0c;云计算已成为众多企业和个人实现创新与发展的关键驱动力。而作为云计算的“心脏”与“灵魂”&#xf…

蘑菇街商品详情接口技术解析

一、接口功能说明 商品详情接口用于获取商品基础信息、SKU数据、促销活动等核心数据&#xff0c;支持以下功能&#xff1a; 基础信息&#xff1a;标题、价格、主图等 商品属性&#xff1a;颜色、尺码等SKU规格 营销信息&#xff1a;满减、折扣等促销活动 店铺信息&#xff…

空间注意力机制

知识点&#xff1a; 空间注意力机制 spatial attention SA; SA 中平均池化和最大池化的操作&#xff1b; torch.max; 参考博客&#xff1a;通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM)-CSDN博客 空间注意力机制代码 import torch import torch.nn as nn import …

鸿蒙app 开发中 如何 看 app 页面的ui结构

1.点击 编译器的 2. 先把 项目跑起来 3.选择 对应的设备 和 app包名 4. 就能看到 页面的 ui 结构了