大模型开发中format_messages、invoke、format三种方法的对比
- 1️⃣ format_messages() - 返回消息对象列表
prompt_value=chat_prompt.format_messages(role="python开发工程师",question="堆排序怎么写")# 返回: [SystemMessage(...), HumanMessage(...)]特点:
返回 List[BaseMessage](消息对象列表)
保留消息结构(system/human/ai)
使用场景:
✅ 需要手动调试查看消息结构
✅ 要自定义拼接消息链
✅ 直接传给支持消息列表的模型接口
- 2️⃣ invoke() - 返回 PromptValue 对象(推荐)
prompt_value2=chat_prompt.invoke({"role":"python开发工程师","question":"堆排序怎么写"})# 返回: StringPromptValue 对象print(prompt_value2.to_string())# 转字符串特点:
返回 PromptValue 对象(可转字符串或消息列表)
可以直接传给 LLM 调用(最常用)
使用场景:
✅ 标准用法,配合 LangChain Chain 使用
✅ 需要灵活转换格式(.to_string() 或 .to_messages())
✅ 直接作为 llm.invoke() 的输入
- 3️⃣ format() - 直接返回字符串
prompt_value3=chat_prompt.format(role="python开发工程师",question="快速排序怎么写")# 返回: 纯字符串特点:
直接返回格式化后的字符串
丢失消息结构(system/human 区分)
使用场景:
✅ 只需要纯文本提示词
✅ 用于打印、日志记录
❌ 不推荐用于聊天模型(会丢失角色信息)
对比总结表:
| 方法 | 返回值 | 保留结构 | 推荐场景 |
|---|---|---|---|
| format_messages() | List[Message] | ✅ 是 | 调试、自定义消息链 |
| invoke() ⭐ | PromptValue | ✅ 是 | 标准用法,配合 LLM |
| format() | str | ❌ 否 | 打印日志、纯文本场景 |
# ✅ 最常用:invoke() 直接调用模型result=llm.invoke(chat_prompt.invoke({"role":"...","question":"..."}))# 🔧 调试时:format_messages() 查看结构messages=chat_prompt.format_messages(role="...",question="...")print(messages)# 📝 简单场景:format() 生成文本text=chat_prompt.format(role="...",question="...")print(text)核心建议:用 invoke() 最安全,既保留结构又能直接传给模型!
