在LangChain的ChatPromptTemplate中,System、Human、AI消息角色严格区分。若将翻译指令误放入System会导致失效。正确做法:角色定义放入System,而具体多步任务如改写和目标语言翻译应写入Human模板,确保两者同步准确完成。
本文详解 LangChain 中 ChatPromptTemplate 的消息类型分工,指出原链因混淆 System 与 Human 角色导致翻译失效,并提供结构清晰、可复用的 Prompt 链设计方法,确保改写与目标语言翻译同步准确完成。
在 LangChain 的 ChatPromptTemplate 里,System、Human(或 User)和 AI 这三类消息,扮演着严格区分的语义角色。很多人一开始没太在意这个,结果写出来的链总出各种奇怪的问题。
先理清这三者的职责。System 消息是用来设定模型身份、能力边界和行为准则的——比如“你是一个专业翻译助手”。它不承载具体的任务指令。Human 消息才是触发模型执行动作的核心输入,必须明确、完整地描述待处理任务,例如“请先改写以下文本,再译为德语”。而 AI 消息呢,通常只在少样本示例(Few-shot)场景下才用到,在推理链中一般不会显式出现。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
回到那类常见的错误。原代码的问题根源在于,把关键任务指令(比如“重写并翻译为 {language}”)错误地塞进了 System 消息,而 User 消息里只放了个原始文本 {input}。结果呢?大模型更倾向于把 System 里的内容当作背景约束,而不是可执行的命令。它认认真真地完成了改写——但默认语言是英文,翻译要求被彻底忽略了。
正确的做法其实很直接:把角色定义放在 System,把具体的多步任务明确写入 Human 模板。下面是优化后的链实现:
# 正确定义 System + Human 双消息结构
system_message = "You are a professional linguistic assistant skilled in paraphrasing technical documents and translating them accurately across European languages."
human_template = """
Your task has two mandatory steps:
1. Rephrase the following text clearly and professionally, preserving all factual details and technical terms: {input}
2. Translate the rephrased version into {language}.
Do NOT output anything other than the final translated text.
"""
chat_prompt = ChatPromptTemplate.from_messages([
("system", system_message),
("human", human_template),
])
# 绑定 LLM 与输出解析器
chain = chat_prompt | llm | StrOutputParser()
# 调用时传入用户输入和目标语言(注意:此处应传 language_code,如 "cs",而非显示标签 "Czech (CZ)")
answer = chain.invoke({
"input": user_input,
"language": selected_label # ← 关键修正:使用字典键(如 "cs")而非值(如 "Czech (CZ)")
})
说到底,只要严格遵循消息角色的分工,把任务逻辑完整地写在 Human 模板里,就能构建出可靠、可维护、符合预期的 Prompt Chain。这个思路一旦固定下来,后面再复杂的多步任务也都好办了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述