1. 构建基于LangGraph的诗歌翻译Agent:从状态图到执行流程
作为一名长期从事AI应用开发的工程师,我最近深入研究了LangGraph框架,并实现了一个将英文诗歌翻译成中国古典诗词的Agent。这个项目展示了如何利用状态图和条件分支来构建复杂的AI处理流程。下面我将详细拆解整个实现过程,分享其中的技术细节和实战经验。
2. 项目架构设计
2.1 状态图与Agent的关系
LangGraph的核心思想是将复杂任务分解为多个节点,通过状态图来定义执行流程。在这个诗歌翻译项目中,我们构建了一个包含两个主要节点(翻译和重翻译)的状态图,并通过条件判断决定执行路径。
状态图编译后生成的CompiledStateGraph对象实际上是一个基于Actor模型的Pregel实现。这种设计有几个关键优势:
- 模块化:每个节点可以独立开发和测试
- 可组合性:Agent本身可以作为更大状态图的节点
- 灵活性:通过条件边实现动态流程控制
2.2 诗歌翻译流程设计
我们的翻译Agent采用两阶段设计:
- 初步翻译:直接调用LLM进行初次翻译
- 质量评估:自动检查翻译质量,不合格则触发二次翻译
- 二次翻译:提供示例的少样本翻译,提高质量
这种设计确保了最终输出质量,同时保持了流程的简洁性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
3. 核心实现细节
3.1 状态类型定义
我们首先定义了状态Schema,使用Python的TypedDict来确保类型安全:
python复制class PoemTranslationState(TypedDict):
original_poem: str # 原始英文诗歌
first_translation: str # 第一次翻译结果
second_translation: str # 第二次翻译结果
这种强类型定义在复杂流程中尤为重要,可以避免许多运行时错误。
3.2 模型与提示词配置
我们使用ChatOpenAI作为基础模型,并配置了专门的系统提示词:
python复制model = ChatOpenAI(model="gpt-5.2-chat")
system_prompt = SystemMessage(
content="你是一位精通中英双语的文学教授,擅长将西方近现代诗歌意蕴转化为中国古典诗词。"
)
关键点:
- 选择适合创意写作的模型版本
- 系统提示词明确角色定位和专业要求
- 温度参数保持默认以获得稳定性
3.3 翻译节点实现
初步翻译节点
python复制def translate(state: PoemTranslationState):
query = HumanMessagePromptTemplate.from_template(
"请将以下英文诗翻译成中文古诗(如五言律诗、七言绝句或宋词格式):{original_poem}"
).format_messages(original_poem=state["original_poem"])
result = model.invoke([system_prompt, *query])
return {"first_translation": result.content}
技术细节:
- 使用
HumanMessagePromptTemplate构建用户消息 - 将系统提示词和用户消息组合传入模型
- 结果存入状态的
first_translation字段
二次翻译节点
二次翻译采用了少样本提示技术:
python复制def retranslate(state: PoemTranslationState):
examples = [
{
"original":"The woods are lovely, dark and deep...",
"translation":"幽林深处影重重,诺重难酬信必从..."
},
# 更多示例...
]
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=PromptTemplate.from_template("原文: {original}\n翻译: {translation}"),
prefix="请按照要求将英文诗歌翻译成中文古诗:",
suffix="原文: {original}\n翻译:",
input_variables=["original"],
example_separator="\n"
)
query = HumanMessage(content=prompt.format(original=state["original_poem"]))
result = model.invoke([system_prompt, query])
return {"second_translation": result.content}
为什么使用少样本提示:
- 提供具体翻译示例作为参考
- 引导模型遵循特定格式和风格
- 相比零样本提示,输出质量更稳定
3.4 评估机制实现
评估函数决定是否需要进行二次翻译:
python复制def evaluate(state: PoemTranslationState) -> Literal["retranslate", "__end__"]:
template = """评估要求:
- 意象对等:转化为中国古典意象
- 格律要求:平仄协调,押韵规范
- 意境重塑:保留原作灵魂
- 双语对照:提供直译和成品
原文:{original_poem}
翻译:{translated_poem}
符合要求回复1,否则回复0。并附理由"""
query = HumanMessagePromptTemplate.from_template(template).format_messages(
original_poem=state["original_poem"],
translated_poem=state["first_translation"])
result = model.invoke([system_prompt, *query])
return END if result.content.startswith("1") else "retranslate"
评估标准设计:
- 意象转换的恰当性
- 古典诗词格律符合度
- 原诗意境保留程度
- 输出格式规范性
注意事项:
- 评估提示词要具体明确
- 输出格式标准化便于解析
- 评估标准应与最终目标一致
4. 状态图构建与编译
4.1 图的构建过程
python复制builder = (
StateGraph(PoemTranslationState)
.add_node("translate", translate)
.add_node("retranslate", retranslate)
.add_edge(START, "translate")
.add_edge("retranslate", END)
.add_conditional_edges("translate", evaluate)
)
节点与边说明:
translate:入口节点,执行初次翻译retranslate:二次翻译节点START → translate:初始边retranslate → END:完成边- 条件边:根据评估结果决定路径
4.2 图的可视化
我们可以生成状态图的可视化表示:
python复制agent = builder.compile()
payload = agent.get_graph().draw_mermaid_png()
PILImage.open(io.BytesIO(payload)).show()
可视化有助于:
- 验证流程设计是否符合预期
- 调试复杂的状态转换
- 向团队成员解释系统架构
4.3 图的编译原理
StateGraph编译为CompiledStateGraph的过程实际上是:
- 将节点映射为Actor
- 边转换为消息传递路径
- 条件边实现为决策Actor
- 状态管理由框架自动处理
这种编译过程使得我们可以用声明式的方式定义复杂流程,而运行时则能高效执行。
5. Agent执行与结果分析
5.1 调用示例
python复制result = agent.invoke({
"original_poem": "I love thee to the depth and breadth and height..."
})
print(f"第一次翻译:\n{result['first_translation']}")
print(f"\n第二次翻译:\n{result['second_translation']}")
5.2 典型输出分析
第一次翻译输出:
code复制爱汝情深遍四维,
心魂所至尽高卑。
量天量地犹嫌浅,
一念绵绵到太微。
评估反馈:
code复制0
评估理由:
1. 意象对等:较好,但"太微"略显晦涩
2. 格律要求:第二、四句未严格押韵
3. 意境重塑:成功表达了原诗情感
4. 双语对照:缺少直译部分
第二次翻译输出:
code复制爱君至情无尽量,
深阔高长任我量。
魂魄所能皆可至,
天地同证此衷肠。
质量对比:
- 第二次翻译在押韵上更规范
- 用词更通俗易懂
- 保持了原诗的深情意境
5.3 性能优化技巧
- 缓存机制:对相同输入缓存翻译结果
- 批量处理:同时处理多首诗歌提高吞吐量
- 模型选择:对评估使用较小模型降低成本
- 超时控制:设置每个节点的最大执行时间
6. 扩展与改进方向
6.1 支持更多诗歌形式
可以扩展支持:
- 词牌(如《水调歌头》《浣溪沙》)
- 元曲形式
- 现代白话诗体
6.2 增强评估机制
改进方向包括:
- 多维度评分体系
- 多个模型交叉验证
- 人工评估反馈循环
6.3 集成到更大系统
这个Agent可以作为:
- 诗歌教学系统的组件
- 多语言文学创作平台的一部分
- 跨文化交流工具的翻译模块
7. 常见问题与解决方案
问题1:翻译不符合格律要求
- 解决:在少样本提示中提供更严格的格律示例
- 解决:添加后处理校验步骤
问题2:评估结果不稳定
- 解决:使用更结构化的评估输出
- 解决:引入多数表决机制
问题3:处理长诗歌时质量下降
- 解决:分段翻译再组合
- 解决:使用更大上下文窗口的模型
8. 实战经验分享
在实际开发中,有几个关键点值得注意:
-
提示词工程:翻译质量很大程度上取决于提示词设计,需要反复测试调整
-
评估标准:明确的评估标准比模糊的"质量好/坏"更有效
-
错误处理:要考虑网络问题、模型超时等各种异常情况
-
可观测性:添加日志记录每个节点的输入输出,便于调试
-
版本控制:对提示词和示例进行版本管理,方便回溯和比较
这个项目展示了如何利用LangGraph构建复杂的AI工作流。通过状态图的方式,我们实现了灵活可控的诗歌翻译流程,既保证了基础功能的简洁性,又为后续扩展留下了空间。
