消息类型
1. SystemMessage(系统消息)
- 作用:设定 AI 的基础行为模式或对话背景,通常在对话开始时通过此消息定义角色。它对整个对话流程有指导性影响,但不会显式出现在对话历史中。
- 特点:
- 仅有一条生效(如多次发送会覆盖之前的设定)
- 不参与多轮对话的内容传递
2. HumanMessage(用户消息)
- 作用:表示真实用户在对话中的输入内容,是用户与模型交互的直接信息。
- 特点:
- 必须按时间顺序排列
- 内容直接影响模型输出的针对性
3. AIMessage(AI消息)
- 作用:记录AI 历史回复内容,用于保持对话的连续性。模型会根据之前自己的回复调整后续回答。
- 关键点:
- 必须与历史对话的真实回复一致
- 若错误填写会导致上下文逻辑混乱
合理编排这三类消息,可以确保模型准确理解业务场景,生成符合预期的输出。需要根据具体应用场景调整它们的组合方式。
import os
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
from langchain.schema.messages import AIMessage, HumanMessage, SystemMessage
# 加载环境变量(.env文件中需配置OPENAI_API_KEY和MODEL_NAME)
load_dotenv()
# 初始化语言模型(假设.env中MODEL_NAME配置了类似gpt-3.5-turbo的模型)
llm = ChatOpenAI(model_name=os.getenv('MODEL_NAME'))
# ==== 第1部分:直接对话 ====
# 构造包含历史消息的对话列表
messages = [
SystemMessage(content="我是一个情感咨询老师。"), # 设定角色
HumanMessage(content="我是一个单身男性,我叫大壮"), # 用户第一条消息
AIMessage(content='欢迎你'), # 模型之前回复的内容
HumanMessage(content="我是谁?") # 当前提问
]
# 发起对话请求(自动包含上下文)
response_direct = llm.invoke(messages)
print("直接调用结果:", response_direct.content)
# 输出示例:"你是刚刚自我介绍过的单身男性大壮。"
# ==== 第2部分:使用链式调用 ====
# 创建可复用提示模板({input}为占位符)
prompt = ChatPromptTemplate.from_messages([
("system", "我是一个IT课程咨询助理。"), # 系统角色设定
("user", "我是一个在校大学生,我叫刚子"), # 初始化用户信息
("assistant", "欢迎你"), # 模拟历史回复
("user", "{input}") # 占位符替换输入内容
])
# 创建处理链(提示模板 -> 语言模型)
chain = prompt | llm # 类比管道操作,类似Unix的 | 符号
# 正确的参数传递(字典格式必须是 {"input": "..."})
response_chain = chain.invoke({"input": "你是谁"}) # 修正后的参数格式
# 打印响应内容(ChatOpenAI返回的AIMessage对象)
print("链式调用结果:", response_chain.content)
# 输出示例:"我是IT课程咨询助理,随时为刚子同学解答选课疑问。"
输出