作者:WangQiaomei版本:1.0(2026/3/18)

核心场景:AI 生成内容自动评估→迭代优化,直到满足要求(生成笑话 / 文案 / 代码 / 翻译皆适用)

🔥前言:为什么需要 "评估 - 优化" 模式?

你是否遇到过:AI 生成的内容一言难尽?写的笑话不好笑、翻译不精准、代码有 BUG?

传统 AI 生成是 "一次性输出",而Evaluator-Optimizer(评估器 - 优化器)模式 能让 AI 像人类一样:✅ 生成内容 → ✅ 自我评估 → ❌ 不好就改进 → ✅ 重新评估 → 直到达标!

本文以 "AI 生成好笑的猫咪笑话" 为例,手把手教你实现这个能自我迭代的 LangGraph 工作流!


🎯核心工作流:AI 自我迭代的闭环

工作流亮点

  • 闭环迭代:无需人工介入,AI 自主完成 "生成→评估→优化" 循环
  • 结构化评估:评估结果标准化(好笑 / 不好笑 + 改进建议)
  • 通用适配:可无缝迁移到翻译、文案、代码生成等场景

🛠️核心组件拆解

表格

组件 核心作用 关键细节
llm_call_generator 内容生成器 首次生成 / 基于反馈优化生成(支持多轮迭代)
llm_call_evaluator 智能评估器 结构化输出:grade(评分)+ feedback(改进建议)
Feedback(Pydantic 模型) 评估结果规范 限定 grade 为 "funny/not funny",强制输出改进建议
route_joke 条件路由 控制流程走向:达标则结束,不达标则回退优化

🔑关键代码解析(核心逻辑)

1. 结构化评估结果定义(避免 AI 乱输出)

python

运行

from pydantic import BaseModel, Field
from typing_extensions import Literal

class Feedback(BaseModel):
    # 限定评分只能是"funny"或"not funny",杜绝模糊评价
    grade: Literal["funny", "not funny"] = Field(description="Decide if the joke is funny or not.")
    # 强制AI给出改进建议,为迭代提供方向
    feedback: str = Field(description="If not funny, provide improvement suggestions.")

# 让AI输出结构化结果,而非自由文本
evaluator = llm.with_structured_output(Feedback)

2. 条件路由(控制迭代逻辑)

python

运行

def route_joke(state: State):
    """核心:判断是否继续迭代"""
    if state["funny_or_not"] == "funny":
        return "Accepted"  # 达标→结束流程
    else:
        return "Rejected + Feedback"  # 不达标→返回生成器优化

3. 多轮生成逻辑(根据反馈优化)

python

运行

def llm_call_generator(state: State):
    """有反馈则优化,无反馈则首次生成"""
    if state.get("feedback"):  # 多轮迭代:带改进建议生成
        msg = llm.invoke(f"Write a joke about {state['topic']}, improve with feedback: {state['feedback']}")
    else:  # 第一轮:基础生成
        msg = llm.invoke(f"Write a joke about {state['topic']}")
    return {"joke": msg.content}

📝完整可运行代码

python

运行

# -*- coding: utf-8 -*-

from langgraph.graph import StateGraph, START, END
from IPython.display import Image, display
from langchain_openai import ChatOpenAI




# 1. 定义全局状态
class State(TypedDict):
    joke: str          # 生成的笑话
    topic: str         # 笑话主题
    feedback: str      # 改进建议
    funny_or_not: str  # 评估结果

# 2. 定义评估结果结构化模型
class Feedback(BaseModel):
    grade: Literal["funny", "not funny"] = Field(description="Decide if the joke is funny or not.")
    feedback: str = Field(description="If not funny, provide improvement suggestions.")

# 3. 绑定结构化输出到评估器
evaluator = llm.with_structured_output(Feedback)

# 4. 节点1:生成器(生成/优化笑话)
def llm_call_generator(state: State):
    if state.get("feedback"):
        msg = llm.invoke(f"Write a joke about {state['topic']}, improve with feedback: {state['feedback']}")
    else:
        msg = llm.invoke(f"Write a joke about {state['topic']}")
    return {"joke": msg.content}

# 5. 节点2:评估器(评估笑话+给出建议)
def llm_call_evaluator(state: State):
    grade = evaluator.invoke(f"Grade the joke: {state['joke']}")
    return {"funny_or_not": grade.grade, "feedback": grade.feedback}

# 6. 条件路由:控制迭代逻辑
def route_joke(state: State):
    if state["funny_or_not"] == "funny":
        return "Accepted"
    else:
        return "Rejected + Feedback"

# 7. 构建工作流
optimizer_builder = StateGraph(State)
optimizer_builder.add_node("llm_call_generator", llm_call_generator)
optimizer_builder.add_node("llm_call_evaluator", llm_call_evaluator)

# 8. 连接节点:构建迭代闭环
optimizer_builder.add_edge(START, "llm_call_generator")
optimizer_builder.add_edge("llm_call_generator", "llm_call_evaluator")
optimizer_builder.add_conditional_edges(
    "llm_call_evaluator",
    route_joke,
    {"Accepted": END, "Rejected + Feedback": "llm_call_generator"}
)

# 9. 编译并运行
optimizer_workflow = optimizer_builder.compile()
# 可视化工作流(可选)
display(Image(optimizer_workflow.get_graph().draw_mermaid_png()))
# 执行:生成关于Cats的好笑笑话
result = optimizer_workflow.invoke({"topic": "Cats"})
# 输出最终结果
safe_print("🎉 最终生成的好笑笑话:\n" + result["joke"])

📌执行示例(真实运行过程)

plaintext

第1轮:AI生成 → "Why do cats like boxes? Because they fit!" → 评估器:"not funny,梗太老"
第2轮:AI优化 → "Why do cats love boxes? They’re hiding from their human’s bad TikTok dances!" → 评估器:"not funny,不够有梗"
第3轮:AI再优化 → "What do you call a cat that can program? A purr-ogrammer! 🐱💻" → 评估器:"funny!"
✅ 最终输出:What do you call a cat that can program? A purr-ogrammer! 🐱💻

💡超实用的扩展场景(不止生成笑话!)

表格

场景 改造思路
📝文案改写 评估器判断 "是否符合品牌调性",反馈 "修改语气 / 增加卖点"
📖翻译优化 评估器判断 "语义是否准确",反馈 "调整语序 / 修正专业术语"
💻代码生成 评估器判断 "是否通过单元测试",反馈 "修复 BUG / 优化性能"
📊报告生成 评估器判断 "数据是否准确",反馈 "补充分析维度 / 修正结论"

🚩注意事项

  1. API Key 安全:不要硬编码,建议通过环境变量读取(os.getenv("DASHSCOPE_API_KEY")
  2. 迭代次数限制:可添加max_iterations参数,避免无限循环(比如最多迭代 5 次)
  3. 评估标准自定义:修改Feedback模型的grade字段,适配不同场景(如 "合格 / 不合格"、"精准 / 不精准")

🎯总结

Evaluator-Optimizer 模式是 LangGraph 最实用的进阶玩法之一,核心价值在于:

  1. 把 AI 从 "一次性生成" 升级为 "闭环迭代优化",内容质量大幅提升;
  2. 结构化评估 + 条件路由,让迭代逻辑可控、可追溯;
  3. 通用架构适配多场景,改改提示词就能复用。

下次再遇到 AI 生成内容不达标的情况,别手动改了,让 AI 自己卷起来!💪

如果你需要进阶教程,可以留言:

✅ 如何添加迭代次数限制

✅ 如何接入本地大模型(Llama3/Qwen)

✅ 如何封装成 API 接口供前端调用

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐