Abstract

messages是LangChain中模型上下文的基本单元。它们代表了模型的输入和输出,承载着与LLM交互时所需的内容和表示对话状态的元数据。

结构

messages一般包含3个部分

  • role(角色):消息的类型
    • System(系统):用来设置llm的整体行为,比如身份,回答的规范
    • User/Human(用户):表示输入内容
    • Assistant/AImesage:llm的回答内容,在多轮回答中作为上下文使用
    • Tool:工具调用的内容
  • content(内容):消息的实际内容,有文本,图片,声音,文档
  • Metadata(元数据):消息的一些属性,比如:token使用量,id,llm的名字,处理的时间等等

使用

  1. 定义message对象:SystemMessage(“”);HumanMessage(“”);AIMessage()
  2. 定义字典:{"role":"system/user/assistant","content":""}
  3. llm接受消息数组,并做出响应,model.invoke(消息数组)
  4. 简单的代码
# 对象
r=model.invoke([
	SystemMessage("你是一个专业的数学老师"),
	HumanMessage("小学数学问题:1+1等于几")
])

# 字典
r=model.invoke([
	{"role":"system","content":"你是一个专业的数学老师"},
	{"role":"user","content":"1+1等于几"}
])
  1. 在4中r为AIMessage,为llm的输出,也可以定义一个AIMessage,再次给llm进行多轮问答
r=model.invoke([
	SystemMessage("你是一名小学数学老师,回答用户的数学问题"),
	HumanMessage("小学数学问题:1+1等于几")
])

fr=model.invoke([
	r,
	HumanMessage("用户提了什么问题,答案是什么")
])
  • 输出内容:
    1. 第一轮回答:1+1等于2。这是最基本的加法运算,通常在小学一年级数学课程中学习。为了帮助孩子理解,可以借助实物(如苹果、积木)或图形来演示:比如,把1个苹果和另一个苹果放在一起,数一数总共有几个,就能直观地看到结果是2。这样的方法能让孩子更好地掌握加法的含义。
    2. 第二轮回答:用户的问题是:“1+1等于2。这是最基本的加法运算,通常在小学一年级数学课程中学习。” 答案是:通过实物(如苹果、积木)或图形演示,帮助孩子直观理解加法的含义,例如将1个苹果和另一个苹果放在一起,数一数总共有几个,从而得出结果是2。
  1. tool消息,llm根据提供的工具函数,生成工具调用的字典数据,使用这个字典数据调用工具函数
# 添加一个工具函数
model_tools=model.bind_tools([tool_add])
# 调用
r=model_tools.invoke([
	SystemMessage("你是一名小学数学老师,回答用户的数学问题"),
	HumanMessage("小学数学问题:1+1等于几"),
])

# 工具函数
def tool_add(a:int,b:int)->int:
	"""
	加法工具函数
	:param a: 第一个整数
	:param b: 第二个整数
	:return: 两个整数的和
	"""
	return a+b
  • 输出内容
	content='<think>\n好的,用户问的是小学数学问题,1加1等于几。这个问题看起来很简单,但作为老师,我需要确保正确引导学生理解加法的基本概念。首先,我应该确认用户是否真的需要直接的答案,还是希望得到更详细的解释。不过根据问题本身,用户可能只是想验证基本的加法知识。\n\n接下来,我需要考虑是否需要使用提供的工具函数来计算。工具函数tool_add可以处理两个整数的加法,这里1和1相加,结果应该是2。不过,用户是小学生,可能刚开始学习加法,所以直接给出答案可能不够,但问题本身非常基础,可能用户只是测试工具的使用。\n\n但根据用户的指示,如果问题可以通过工具解决,我应该调用工具。所以这里应该使用tool_add函数,参数a和b都是1。然后返回结果。不过,也有可能用户希望得到更详细的解释,比如用实物举例,比如一个苹果加一个苹果等于两个苹果。但根据工具的使用要求,可能需要直接调用函数。\n\n不过,用户的问题可能只是简单的计算,所以直接调用工具函数是正确的做法。确保参数正确,然后返回结果。因此,正确的工具调用应该是name为tool_add,参数a=1,b=1。\n</think>\n\n' tool_calls=[{'name': 'tool_add', 'args': {'a': 1, 'b': 1}, 'id': '605dfa0d-2ccd-4894-801b-6b9790e47918', 'type': 'tool_call'}] 
  • 提取llm生成的tool_message
tool_calls=[{'name': 'tool_add', 'args': {'a': 1, 'b': 1}, 'id': '605dfa0d-2ccd-4894-801b-6b9790e47918', 'type': 'tool_call'}]
  1. message内容
    1. 文本
    2. 混合内容
message={
	"content":[
		{"type":"text","text":""},
		{"type":"image","url":""},
		{"type":"image","base64":"","mime_type":"image/jpeg"},
	]
}
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐