模型调用的准备工作
一张老图看大模型的调用
在LangChain v0.3版本中,提到了 Model I/O,包括输入提示(Format)、调用模型(Predict),输出解析(Parse)。分别对应着Prompt Template,Model 和 Output Parser
认识消息
大模型没有记忆,它的输出只和输入模型的内容有关(上下文)。很多大模型API服务也没有在服务端维护会话历史,是”无状态“的。因此,如果应用需要记住对话历史,需要在程序中维护消息列表。
在LangChain中,Message是模型交互的最基本单元。它既代表模型接收到的输入(Input),也代表模型生成的输出(Output)
每一轮与大模型的对话,都由一条或多条Message构成。每个Message不仅包含文字内容,还携带描述上下文状态的元信息(metadata),用于保持对话的一致性和可追踪性。比如,模型在多轮交互中理解”谁在说话“,”说了什么“、”这条信息属于哪一轮对话“
LangChain在1.0中提供了跨模型统一的Message标准,无论你使用的是OpenAI、Anthropic、Gemini还是本地模型,这一标准都能保持一致的行为。
兼容性强 :不同模型的消息格式自动对齐。
可扩展性高 :方便添加多模态内容或自定义字段。
可追踪性好 :为 LangSmith 等调试工具提供一致的上下文数据结构。
消息的内部结构
LangChain的消息(Message)对象包含三种字段
Role:消息所属的角色或类型,如system、user、assistant
Content:消息内容
Metadata:(可选)元数据,存储额外信息。如:消息ID、响应时间、token消耗量、消息标签等
消息的类型
LangChain定义了很多消息类型,通过role区分。常用的有四种。
系统消息
也称为系统提示词,用于在对话开始时为模型设定角色、行为准则和上下文背景。它像是给AI助手的一份工作说明书,决定了其回答问题的风格、领域和专业范围。
用户消息
也称为用户提示词,在多轮对话中,他表示用户的一次输入。可以包含简单的文本问题,也可以是复杂的多模态内容(如图片、音频、文档等)
助手(AI)消息
代表模型的回复,包括生成的文本、工具调用、元数据等
{"role":"assistant","content":"我也很高兴认识你"}工具调用消息
工具调用结果匹配的消息类型。将此消息返回给模型,让模型基于这个结果继续生成回复。
问题:为什么使用不同的消息类型?
- 明确角色:清晰区分系统提示、用户输入和AI回复
- 控制行为:通过SystemMessage精确控制AI的行为
- 对话历史:构建完整的多轮对话上下文
- 调试友好:更容易追踪和调试对话流程
消息格式
LangChain支持两种消息格式
格式1:JSON格式
系统消息
{"role":"system","content":"你是个善解人意的助手"}用户消息
{"role":"user","content":"你好啊"}助手消息
{"role":"assistant","content":"我也很高兴认识你"}工具调用消息
{"role":"tool","content":"<工具输出>","tool_call_id":"call_00_nUD"}格式2:对象格式
系统消息
SystemMessage(content="你是个善解人意的助手")用户消息
HumanMessage(content="你好啊")助手消息
AIMessage("我也很高兴认识你")工具调用消息
ToolMessage(content="<工具输出>", tool_call_id=""# 一定要和AI消息中的调用ID匹配)小结:
举例:
from langchain.chat_modelsimportinit_chat_model from dotenvimportload_dotenvimportos from langchain_core.messagesimportHumanMessage load_dotenv(override=True)CLOSEAI_API_KEY=os.getenv("CLOSEAI_API_KEY")CLOSEAI_API_BASE=os.getenv("CLOSEAI_API_BASE")model=init_chat_model(model="gpt-6.1-sol", api_key=CLOSEAI_API_KEY, base_url=CLOSEAI_API_BASE,)messages=[{"role":"system","content":"你是一个友好的AI助手"},{"role":"user","content":"1 + 8 = ?"},{"role":"assistant","content":"9"},{"role":"user","content":"我刚才问了什么问题"}]print(model.invoke(messages))