LangChain 实战:消息与提示词

40 阅读3分钟

消息是 LangChain 模型中的基本上下文单位。

它们代表模型的输入和输出,包含与大语言模型交互时所需的内容和元数据,以表示对话状态。

消息包含以下对象:

  • 角色——标识消息类型 (例如系统、用户)
  • Content——表示消息的实际内容 (如文本、图像、音频、文档等)
  • 元数据——可选字段,如响应信息、消息 ID 和令牌使用

一、消息提示词

1.1 Text prompts

文本提示词是字符串——非常适合直接的生成任务。

img

特点及场景:

  • 一个单独的请求
  • 不需要对话历史
  • 想要最小的代码复杂度

1.2 Message prompts

通过提供一个消息对象列表来向模型传递一个消息列表

img

特点及场景:

  • 管理多模态对话
  • 处理多模态内容 (图像、音频、文件)
  • 包含系统说明

1.3 Dictionary format

img

二、消息类型

img

2.1 System message

SystemMessage 代表一组初始指令,用于预设模型的行为。

可以使用系统消息来设定基调、定义模型的角色,并建立响应指南。

system_msg = SystemMessage("你是一位乐于助人的编程助手.")

2.2 Human message

HumanMessage 代表用户输入和交互。

它们可以包含文本、图像、音频、文件以及任何其他多模态内容。

response = model.invoke([
  HumanMessage("What is machine learning?")
])

2.3 AI message

AIMessage 表示模型调用的输出。

它们可以包含多模态数据、工具调用和供应商特定的元数据

img

AIMessage 对象由模型在调用时返回,其中包含响应中所有相关的元数据。

提供商对消息类型的权衡/上下文化方式不同,这意味着有时手动创建一个新的 AIMessage 对象并将其插入消息历史记录中会很有帮助,就像它来自模型一样

2.4 Tool message

对于支持工具调用的模型,AI 消息可以包含工具调用。

工具消息用于将单个工具执行的结果传递回模型。

工具可以直接生成 ToolMessage 对象

def get_weather(city: str) -> str:
    """获取城市的天气"""
    return f"{city} 天气晴朗"


model_with_tools=model.bind_tools([get_weather])

ai_message = AIMessage(
    role= "assistant",
    content=[],
    tool_calls=[{
        "name": "get_weather",
        "args": {"location": "北京"},
        "id": "call_00_jggiuM640K3YPybhdcJa1173"
    }]
)

tool_message = ToolMessage(
    content="北京天气晴朗",
    tool_call_id="call_00_jggiuM640K3YPybhdcJa1173"
)

# Continue conversation
messages = [
    HumanMessage("北京天气怎么样?"),
    ai_message,  # Model's tool call
    tool_message,  # Tool execution result
]
response = model.invoke(messages)  # Model processes the result
rprint(response)

三、其他消息

3.1 Message metadata

name 和id都属于元数据字段,当消息类型相同,对消息进行区分。

但不是所有模型都支持这一功能,是否支持取决于模型供应商,需要查看官方手册

from langchain_core.messages import HumanMessage
human_msg = HumanMessage(
    content="Hello!",
    name="alice",  # 可选:识别不同的用户
    id="msg_123",  # 可选:用于追踪的唯一标识符
)
response=model.invoke([human_msg])
rprint(response)

3.2 Tool calls

img

3.3 Streaming and chunks

在流式传输过程中,可以组合成完整消息对象的 AIMessageChunk 对象

chunks = []
full_message = None
for chunk in model.stream("Hi"):
    chunks.append(chunk)
    print(chunk.text)
    full_message = chunk if full_message is None else full_message + chunk

print(full_message.text)

img