目录

一、背景与动机

1.1 工单分拣的业务痛点

1.2 openJiuwen 框架简介

1.3 上下文自演进原理

1.4 本文目标

二、核心技术栈与架构

2.1 核心抽象与组件关系

2.2 工单分拣系统架构

三、核心模块实现详解

3.1 数据集设计

3.2 可演进 Agent 创建

3.3 自定义评估器

3.4 完整训练脚本实现

3.5 Checkpoint 管理

四、效果展示

4.1 运行演示脚本

4.2 演示输出效果

4.2.1 优化前测试

4.2.2 自演进训练过程

4.2.3 优化后测试

4.3 性能提升数据

五、总结

5.1 项目成果

5.2 核心技术总结

5.3 适用场景

5.4 实践建议

5.5 小结

参考资源


一、背景与动机

1.1 工单分拣的业务痛点

企业工单处理是一个典型的业务场景:用户提交的工单需要准确分配到对应的处理部门——技术支持、财务部门、产品部门、客服部门。看起来不复杂,但实际落地时会遇到不少问题。

传统方案各有局限。人工分拣效率低、成本高,难以应对大规模工单。规则系统维护成本高,业务规则一变就要改代码。关键词匹配对复杂语义的理解能力有限。即使使用了 AI 分类,提示词一旦写好就固定了,无法从错误中学习和改进。

这些方案的共同缺陷是缺乏学习能力——没法从历史案例中总结经验、持续优化。

1.2 openJiuwen 框架简介

openJiuwen 是一个开源的 AI Agent 开发框架,提供了 Agent 构建、工作流编排、工具调用、上下文管理等完整能力。框架的核心组件包括:

  • ReActAgent:基于 Reasoning-Acting 范式的智能体
  • Workflow:可视化工作流编排引擎
  • Tool Calling:结构化工具调用机制
  • Context Engine:智能上下文管理
  • Skills:可插拔的技能扩展系统

近期 openJiuwen 发布了上下文自演进特性,解决了一个实际问题:如何让 Agent 自动优化自身的提示词。

1.3 上下文自演进原理

AI Agent 的提示词调优一直是个难题。传统做法是人工反复调试,费时费力,效果也不稳定。上下文自演进的思路是借鉴机器学习的训练范式:提供标注数据,让 Agent 执行任务,根据执行结果自动调整参数。

核心机制是一个"执行 → 评估 → 反馈 → 更新"的闭环流程:

这个机制的几个关键优势:

  • 自动化优化:无需手工调整提示词
  • 可量化评估:有明确的评分标准衡量效果
  • 数据驱动:基于真实业务数据优化
  • 断点续训:支持 Checkpoint 管理,长任务可恢复
  • 生产就绪:优化后的参数可直接部署

1.4 本文目标

本文基于 openJiuwen 的上下文自演进特性,从零构建一个工单智能分拣系统。目标是验证:Agent 能否通过训练数据自动学习到最优的分类策略,无需人工干预提示词的编写和调优。


二、核心技术栈与架构

本章介绍 openJiuwen 自演进框架的核心抽象、关键组件,以及工单智能分拣系统的整体架构。

2.1 核心抽象与组件关系

openJiuwen 自演进框架围绕三个核心抽象构建:

核心组件导入

from openjiuwen.agent_evolving import (
    Trainer,              # 训练协调器
    InstructionOptimizer, # 指令优化器
    SingleDimUpdater,     # 单维度更新器
    BaseEvaluator,        # 评估器基类
    Case, CaseLoader,     # 数据容器
    EvaluatedCase,        # 评估结果容器
)
from openjiuwen.core.single_agent import ReActAgentEvolve  # 可演进 Agent

2.2 工单分拣系统架构

工单智能分拣系统采用模块化设计,各组件职责清晰:


三、核心模块实现详解

本章详细介绍工单智能分拣系统的各个模块实现,包括数据集设计、Agent 创建、评估器实现、训练流程配置等。

3.1 数据集设计

高质量的训练数据是自演进成功的关键。我准备了 26 个工单样本,覆盖四个部门:

# ticket_data.py
from openjiuwen.agent_evolving import Case

TICKET_CLASSIFICATION_CASES = [
    Case(
        inputs={
            "ticket_title": "系统报错 500",
            "ticket_description": "我的应用在调用 API 时频繁返回 500 错误",
            "user_level": "企业用户",
        },
        label={
            "category": "技术支持",
            "reason": "涉及 API 错误和系统故障",
            "priority": "高",
        }
    ),
    Case(
        inputs={
            "ticket_title": "发票申请",
            "ticket_description": "本月的服务费发票在哪里下载?",
            "user_level": "企业用户",
        },
        label={
            "category": "财务部门",
            "reason": "涉及发票申请",
            "priority": "中",
        }
    ),
    # ... 更多样本
]

数据集设计要点:覆盖面(四个部门均衡分布)、真实性(基于实际工单场景)、可评估(包含标准分类和理由)。

3.2 可演进 Agent 创建

使用 ReActAgentEvolve 创建支持自演进的智能体:

# ticket_agent.py
from openjiuwen.core.single_agent import ReActAgentEvolve, ReActAgentConfig, AgentCard

def create_ticket_classifier_agent(
    system_prompt: str,
    agent_id: str = "ticket_classifier",
) -> ReActAgentEvolve:
    agent_card = AgentCard(
        id=agent_id,
        name="工单智能分拣助手",
        description="基于 openJiuwen 自演进框架的工单自动分类智能体",
    )

    config = ReActAgentConfig()
    config.configure_model_client(
        provider="openai",
        api_key=API_KEY,
        api_base=API_BASE,
        model_name=MODEL_NAME,
    )
    config.configure_prompt_template([
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "{{query}}"},
    ])
    config.configure_max_iterations(1)

    agent = ReActAgentEvolve(card=agent_card)
    agent.configure(config)
    return agent

3.3 自定义评估器

工单分类的评估需要综合考虑分类准确性、理由充分性和格式规范性:

# evaluator.py
from typing import Dict, Any
from openjiuwen.agent_evolving import BaseEvaluator, EvaluatedCase, Case

class TicketClassificationEvaluator(BaseEvaluator):
    def __init__(self, category_list: list):
        self.category_list = category_list

    def evaluate(self, case: Case, predict: Dict[str, Any]) -> EvaluatedCase:
        output = str(predict.get("output", ""))
        expected_category = case.label.get("category", "")

        parsed = self._parse_output(output)
        predicted_category = parsed.get("category")

        accuracy_score = self._score_accuracy(predicted_category, expected_category)
        reasoning_score = self._score_reasoning(parsed.get("reason", ""))
        format_score = self._score_format(parsed)

        final_score = accuracy_score * 0.7 + reasoning_score * 0.2 + format_score * 0.1

        return EvaluatedCase(
            case=case,
            answer=predict,
            score=final_score,
            reason=f"预测: {predicted_category}, 期望: {expected_category}"
        )

3.4 完整训练脚本实现

完整的训练脚本 train_ticket_classifier.py 包含以下步骤:

from openjiuwen.agent_evolving import (
    Case, CaseLoader, InstructionOptimizer, SingleDimUpdater,
    Trainer, Progress, Callbacks, EvaluatedCase,
)
from openjiuwen.core.foundation.llm import ModelClientConfig, ModelRequestConfig

# 1. 准备数据
cases_list = list(TICKET_CLASSIFICATION_CASES)
random.shuffle(cases_list)
case_loader = CaseLoader(cases_list)
train_loader, val_loader = case_loader.split(ratio=0.7)

# 2. 创建 Agent
original_agent = create_ticket_classifier_agent(
    system_prompt=INITIAL_SYSTEM_PROMPT,
    agent_id="ticket_classifier_original",
)

# 3. 配置评估器
evaluator = TicketClassificationEvaluator(
    category_list=AVAILABLE_CATEGORIES,
)

# 4. 配置优化器
model_config = ModelRequestConfig(model=MODEL_NAME, temperature=0.3, max_tokens=500)
model_client_config = ModelClientConfig(
    client_provider="openai", api_key=API_KEY, api_base=API_BASE, timeout=120
)
optimizer = InstructionOptimizer(model_config=model_config, model_client_config=model_client_config)
updater = SingleDimUpdater(optimizer)

# 5. 配置训练器
trainer = Trainer(
    updater=updater,
    evaluator=evaluator,
    num_parallel=2,
    early_stop_score=0.85,
    checkpoint_dir=CHECKPOINT_DIR,
)

# 6. 执行训练
evolved_agent = trainer.train(
    agent=original_agent,
    train_cases=train_loader,
    val_cases=val_loader,
    num_iterations=3,
)

# 7. 获取优化后的提示词
operators = evolved_agent.get_operators()
evolved_prompt = operators["react_llm"].get_state()["system_prompt"]

3.5 Checkpoint 管理

训练过程中自动保存 checkpoint,支持从断点恢复:

# 从 checkpoint 恢复
trainer = Trainer(
    updater=updater,
    evaluator=evaluator,
    checkpoint_dir=CHECKPOINT_DIR,
    resume_from=".checkpoints/ticket_classifier/latest.json",
)
evolved_agent = trainer.train(
    agent=agent,
    train_cases=train_cases,
    val_cases=val_cases,
    num_iterations=5,
)

Checkpoint 文件结构:

{
  "agent_id": "ticket_classifier",
  "start_epoch": 2,
  "best_score": 0.9167,
  "operator_states": {
    "react_llm": {
      "system_prompt": "优化后的提示词..."
    }
  },
  "timestamp": "2025-03-01T10:30:00"
}

四、效果展示

4.1 运行演示脚本

本文配套提供了完整的示例代码,位于 examples/ticket_classifier/ 目录下。运行演示脚本:

cd examples/ticket_classifier
python evolve_demo.py

4.2 演示输出效果

4.2.1 优化前测试

4.2.2 自演进训练过程

4.2.3 优化后测试

4.3 性能提升数据

演示脚本结果(4个测试样本)

指标

优化前

优化后

提升

总体准确率

45.0%

100.0%

+122%

案例1(技术支持)

100%

100%

-

案例2(财务部门)

45%

100%

+122%

案例3(产品部门)

45%

100%

+122%

案例4(客服部门)

45%

100%

+122%

完整训练结果(26个训练样本)

指标

优化前

优化后

提升

总体准确率

97.9%

100.0%

+2.1%

技术支持

100.0%

100.0%

-

财务部门

91.5%

100.0%

+4.5%

产品部门

100.0%

100.0%

-

客服部门

100.0%

100.0%

-


五、总结

5.1 项目成果

本文基于 openJiuwen 的上下文自演进特性,构建了一个工单智能分拣系统。实践结果表明:

  • 分类准确率显著提升:从初始的 45% 提升到 100%,提升幅度超过一倍
  • 提示词自动优化:系统自动将简单提示词演进为结构化、专业化的版本
  • 零人工干预:整个训练过程无需人工调整提示词,完全数据驱动

5.2 核心技术总结

技术

作用

ReActAgentEvolve

可演进智能体,通过 get_operators() 暴露可优化参数

BaseEvaluator

评估器基类,自定义评估逻辑需继承此类

InstructionOptimizer

分析错误案例,生成提示词优化建议

SingleDimUpdater

协调优化器,将更新应用到 Operator

Trainer

训练协调器,管理训练循环和 Checkpoint

5.3 适用场景

上下文自演进特性适用于以下场景:

  • 分类任务:文本分类、意图识别、情感分析等
  • 信息抽取:从非结构化文本中提取结构化信息
  • 内容生成:需要特定格式或风格的文本生成
  • 问答系统:领域知识问答、客服机器人等

核心条件是:有明确的评估标准和一定量的标注数据。

5.4 实践建议

基于本次实践,有几点建议:

  1. 数据质量优先:训练数据的覆盖面和标注质量直接决定优化效果
  2. 评估器设计关键:评估维度要贴合业务目标,权重分配要合理
  3. 初始提示词不要太复杂:给优化器留出改进空间
  4. 善用 Checkpoint:长时间训练务必开启 Checkpoint,避免意外中断导致进度丢失

5.5 小结

openJiuwen 的上下文自演进特性提供了一种新的 Agent 优化思路:像训练机器学习模型一样训练 Agent。这种方式把提示词调优从"手艺活"变成了"工程活",降低了 AI 应用落地的门槛。对于有标注数据的场景,值得尝试。

参考资源

Logo

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

更多推荐