Table of Contents

  1. 一、核心设计理念:双循环架构
    1. 1.1 Inner Loop(内循环):基础执行流程
    2. 1.2 Outer Loop(外循环):自我进化机制
  2. 二、SEED设计:系统的”基因密码”
    1. 2.1 SEED数据结构
    2. 2.2 初始SEED(V1 Baseline)
    3. 2.3 进化后的SEED(V2 Evolved)
  3. 三、多Agent协作架构
    1. 3.1 搜索Agent:信息检索
    2. 3.2 研判Agent:深度分析
    3. 3.3 写作Agent:文档生成
  4. 四、评估与诊断系统
    1. 4.1 五维评估模型
    2. 4.2 诊断Agent:问题溯源
    3. 4.3 架构师Agent:动态提示词生成
  5. 五、流式输出与实时反馈
    1. 5.1 后端流式API
    2. 5.2 前端实时接收
  6. 六、UI设计:可视化进化过程
    1. 6.1 三列布局
    2. 6.2 五维雷达图对比
    3. 6.3 Terminal日志组件
  7. 七、技术栈与依赖
    1. 环境变量配置
  8. 八、核心代码目录结构
  9. 九、实验效果分析
    1. 9.1 典型进化案例
    2. 9.2 进化机制的有效性
  10. 十、技术亮点与创新
    1. 10.1 元学习能力
    2. 10.2 动态提示词工程
    3. 10.3 多模态观测能力
    4. 10.4 真实RAG集成
  11. 十一、局限与改进方向
    1. 11.1 当前局限
    2. 11.2 改进方向
  12. 十二、总结
  13. 附录:完整源码
  14. 联系作者
    1. 如果你有场景和困难, 欢迎找我聊聊AI

示例图

AI系统写完第一版文档后,自己能发现问题、分析原因、调整策略,然后生成更好的第二版。这就是我们今天要介绍的设计方法–自我进化文档生成系统

本文将详细介绍如何构建一个能够自我改进的AI Agent系统,以政府公文写作为例,展示完整的设计思路、架构实现和代码细节。


一、核心设计理念:双循环架构

传统AI应用是”一次性”的:输入→处理→输出。但真正的智能应该具备自我反思持续改进的能力。

1.1 Inner Loop(内循环):基础执行流程

用户输入主题
    ↓
搜索Agent:检索相关资料
    ↓
研判Agent:分析核心要点
    ↓
写作Agent:生成公文
    ↓
输出V1文档

这是标准的RAG(检索增强生成)流程,但这只是第一步。

1.2 Outer Loop(外循环):自我进化机制

V1文档
    ↓
评估Agent:5维度打分 → 找出弱点
    ↓
诊断Agent:分析根本原因
    ↓
架构师Agent:生成新的"基因"(SEED参数)
    ↓
重新执行Inner Loop(用新参数)
    ↓
输出V2文档(进化后的版本)

关键洞察:系统的行为由一组”可变参数”(SEED)控制,通过调整这些参数,我们实现了系统的自我进化。


二、SEED设计:系统的”基因密码”

SEED是整个进化机制的核心,它定义了系统如何搜索、如何分析、如何写作。

2.1 SEED数据结构

// lib/types.ts
export interface GovDocSEED {
  searchDepth: number;              // 搜索深度(5-20)
  sourceWhitelist: string[];        // 信源白名单
  focusDirective: string;           // 研判指令
  writingRequirements: string;      // 写作要求(完整提示词)
}

注意: 后边这个种子GovDocSEED将会被动态调整

2.2 初始SEED(V1 Baseline)

const v1Seed: GovDocSEED = {
  searchDepth: 2,
  sourceWhitelist: ['全网'],
  focusDirective: '通用概述',
  writingRequirements: `写作要求:
1. 结构清晰,逻辑严密
2. 字数控制在800-1200字

请直接输出公文内容,不要额外说明。`
}

这是一个”泛化”的基线配置,故意设置得比较简单,给进化留出空间。

2.3 进化后的SEED(V2 Evolved)

系统根据V1的问题自动调整参数:

// 示例:诊断发现"事实准确性"和"内容深度"不足
const v2Seed: GovDocSEED = {
  searchDepth: 15,                           // 增加搜索深度
  sourceWhitelist: ['政府官网', '统计局', '权威智库', '央媒'],  // 限制权威信源
  focusDirective: '数据驱动+深度问题剖析',     // 更明确的研判方向
  writingRequirements: `写作要求:
1. 必须引用具体数据,标注来源
2. 加强问题分析的深度和逻辑推导
3. 提出的建议需具体可操作,包含实施步骤
4. 字数控制在1000-1500字
5. 论证严谨,无跳跃推理

请直接输出公文内容,不要额外说明。`
}

设计亮点writingRequirements 是动态生成的完整提示词,不是简单的参数拼接,而是由AI根据问题诊断重新设计。


三、多Agent协作架构

系统由6个专业Agent组成,各司其职。

3.1 搜索Agent:信息检索

// lib/agents.ts
export async function searchAgent(
  topic: string,
  seed: GovDocSEED
): Promise<SearchResult[]> {
  const tvly = tavily({ apiKey: process.env.TAVILY_API_KEY });

  // 根据信源白名单调整搜索策略
  let searchQuery = topic;
  if (seed.sourceWhitelist.includes('政府官网')) {
    searchQuery += ' site:.gov.cn OR site:stats.gov.cn';
  }

  const response = await tvly.search(searchQuery, {
    maxResults: seed.searchDepth,
    searchDepth: seed.searchDepth > 10 ? 'advanced' : 'basic',
  });

  // 根据白名单过滤结果
  return filterByWhitelist(response.results, seed.sourceWhitelist);
}

技术细节

  • 使用Tavily API进行真实网页搜索
  • 根据SEED的searchDepthsourceWhitelist动态调整
  • 实现信源过滤(优先政府官网、统计局等权威来源)

3.2 研判Agent:深度分析

这是系统的”大脑”,负责从海量搜索结果中提炼核心观点。

export async function insightAgent(
  topic: string,
  searchResults: SearchResult[],
  seed: GovDocSEED
): Promise<WritingGuidance> {
  const prompt = `你是一个专业的政策研判Agent。基于以下搜索结果,按照指定的研判方向进行深度分析:

主题:${topic}
研判指令:${seed.focusDirective}

搜索结果:
${searchResults.map((r, i) => `[${i + 1}] ${r.title}\n来源:${r.source}\n摘要:${r.snippet}`).join('\n\n')}

请生成结构化的写作指引(JSON格式),包含:
{
  "keyPoints": ["核心观点1", "核心观点2", ...],
  "dataReferences": ["数据引用1", "数据引用2", ...],
  "suggestedStructure": ["段落1主题", "段落2主题", ...],
  "focusAreas": ["重点关注领域1", "重点关注领域2", ...]
}

根据研判指令"${seed.focusDirective}",确保分析深入、有数据支撑、有针对性。`;

  return await callDeepSeekStructured<WritingGuidance>(prompt);
}

提示词设计要点

  1. 明确角色定位:”专业的政策研判Agent”
  2. 注入SEED参数:focusDirective决定分析方向
  3. 结构化输出:强制返回JSON格式,便于后续处理
  4. 上下文丰富:提供完整的搜索结果和来源信息

3.3 写作Agent:文档生成

export async function writerAgent(
  topic: string,
  searchResults: SearchResult[],
  guidance: WritingGuidance,
  seed: GovDocSEED
): Promise<string> {
  const prompt = `你是一个专业的公文写作Agent。请根据以下信息撰写一份政府公文:

主题:${topic}

核心观点:
${guidance.keyPoints.map((p, i) => `${i + 1}. ${p}`).join('\n')}

关键数据:
${guidance.dataReferences.map((d, i) => `${i + 1}. ${d}`).join('\n')}

建议结构:
${guidance.suggestedStructure.map((s, i) => `${i + 1}. ${s}`).join('\n')}

重点方向:
${guidance.focusAreas.join('')}

参考资料:
${searchResults.map((r) => `【${r.source}${r.snippet}`).join('\n')}

${seed.writingRequirements}`;

  return await callDeepSeek(prompt, 0.6, 2000);
}

设计亮点

  • writingRequirements直接注入完整的写作要求提示词
  • 多层信息整合:研判结果 + 原始资料 + 写作规范
  • 温度参数0.6:在创造性和稳定性之间平衡

四、评估与诊断系统

4.1 五维评估模型

// lib/evaluators.ts
export async function evaluationAgent(
  topic: string,
  content: string
): Promise<EvaluationScores> {
  const prompt = `你是一个专业的公文评审专家。请对以下公文进行5维度评估,每个维度给出0-1之间的分数,并详细说明打分理由。

主题:${topic}
公文内容:
${content}

评估维度:
1. 政治站位:是否符合政策方针?用词是否准确规范?
2. 事实准确:数据是否有依据?引用是否权威?
3. 逻辑严密:论证是否严谨?段落是否连贯?
4. 公文规范:是否符合公文格式?语言是否得体?
5. 内容深度:是否有深度?建议是否可操作?

返回JSON格式:
{
  "政治站位": {
    "score": 0.85,
    "reason": "用词规范,符合政策导向,但在体现创新发展理念上有所欠缺。"
  },
  "事实准确": { "score": 0.75, "reason": "..." },
  ...
}

请客观、严格评分,找出不足之处。`;

  return await callDeepSeekStructured<EvaluationScores>(prompt);
}

评估维度选择依据

  • 政治站位:政府公文的首要要求
  • 事实准确:信息可靠性
  • 逻辑严密:论证质量
  • 公文规范:格式规范性
  • 内容深度:实用价值

返回示例:

{
  "政治站位": { "score": 0.82, "reason": "..." },
  "事实准确": { "score": 0.65, "reason": "部分数据缺乏出处" },
  "逻辑严密": { "score": 0.78, "reason": "..." },
  "公文规范": { "score": 0.90, "reason": "..." },
  "内容深度": { "score": 0.58, "reason": "建议缺乏可操作性" }
}

4.2 诊断Agent:问题溯源

找出最弱的两个维度,分析为什么这些维度得分低,以及当前SEED参数的哪些设置导致了问题

export async function diagnosticAgent(
  scores: EvaluationScores,
  currentSeed: GovDocSEED
): Promise<DiagnosisResult> {
  // 找出最低的两个维度
  const sortedScores = Object.entries(scores)
    .sort((a, b) => a[1].score - b[1].score)
    .slice(0, 2);

  const weaknesses = sortedScores.map(([dim, data]) => `${dim}(${data.score})`).join('');

  const prompt = `你是一个AI系统诊断专家。当前系统生成的公文评分如下:

${Object.entries(scores).map(([k, v]) => `${k}: ${v.score} - ${v.reason}`).join('\n')}

当前SEED参数:
- 搜索深度:${currentSeed.searchDepth}
- 信源范围:${currentSeed.sourceWhitelist.join(', ')}
- 研判指令:${currentSeed.focusDirective}
- 写作要求:${currentSeed.writingRequirements.split('\n')[1]}

识别出的主要弱点:${weaknesses}

请分析:
1. 为什么这些维度得分较低?
2. 当前SEED参数的哪些设置导致了这些问题?
3. 应该如何调整SEED参数来改进?

返回JSON格式:
{
  "weakness": "简明描述弱点",
  "reason": "深层原因分析(150字内)",
  "mutation": [
    "搜索深度: 2 -> 15",
    "信源范围: 全网 -> 政府官网+统计局+权威智库",
    "研判指令: 通用概述 -> 数据驱动+深度问题剖析",
    "写作要求: 需要重新生成针对性提示词"
  ]
}`;

  return await callDeepSeekStructured<DiagnosisResult>(prompt);
}

诊断示例输出

{
  "weakness": "事实准确性和内容深度不足",
  "reason": "当前搜索深度仅为2,且信源范围过于宽泛,导致检索到的资料权威性不足。研判指令'通用概述'过于泛化,未能引导系统深入挖掘数据和问题。写作要求中缺少对数据引用和来源标注的强制要求。",
  "mutation": [
    "搜索深度: 2 -> 15(增加信息覆盖度)",
    "信源范围: 全网 -> 政府官网+统计局+权威智库+央媒(提升权威性)",
    "研判指令: 通用概述 -> 数据驱动+深度问题剖析(明确分析方向)",
    "写作要求: 需要AI重新生成,强调数据引用、来源标注、论证深度"
  ]
}

4.3 架构师Agent:动态提示词生成

这是整个系统最精妙的部分——让AI为AI设计新的提示词

export async function architectAgent(
  diagnosis: DiagnosisResult,
  currentSeed: GovDocSEED
): Promise<GovDocSEED> {
  const newSeed: GovDocSEED = { ...currentSeed };

  // 1. 解析mutation建议,应用到数值参数
  diagnosis.mutation.forEach(mutation => {
    if (mutation.includes('搜索深度')) {
      const match = mutation.match(/(\d+)/g);
      if (match && match.length >= 2) {
        newSeed.searchDepth = parseInt(match[1]);
      }
    }

    if (mutation.includes('信源')) {
      if (mutation.includes('权威') || mutation.includes('政府')) {
        newSeed.sourceWhitelist = ['政府官网', '统计局', '权威智库', '央媒'];
      }
    }

    if (mutation.includes('研判')) {
      if (mutation.includes('数据') || mutation.includes('深度')) {
        newSeed.focusDirective = '数据驱动+深度问题剖析';
      }
    }
  });

  // 2. 调用AI动态生成新的writingRequirements
  const prompt = `你是一位专业的公文写作指导专家。根据以下问题诊断,生成改进后的"写作要求"提示词。

当前发现的问题:
${diagnosis.weakness}

问题原因分析:
${diagnosis.reason}

改进建议:
${diagnosis.mutation.join('\n')}

请生成一份完整的、针对性的"写作要求"提示词。要求:
1. 针对上述问题进行有针对性的改进
2. 保持格式为标准的写作要求清单
3. 在提示词末尾添加"请直接输出公文内容,不要额外说明。"
4. 不要包含任何markdown代码块或额外的格式符号,直接输出纯文本`;

  newSeed.writingRequirements = await callDeepSeek(
    [
      { role: 'system', content: '你是一位经验丰富的公文写作提示词设计专家,能够根据问题诊断生成精准有效的写作要求。' },
      { role: 'user', content: prompt }
    ],
    0.6,
    1500
  );

  return newSeed;
}

AI生成的新提示词示例

写作要求:
1. 文风温度:客观严谨,数据驱动
2. 必须引用具体数据,并在引用处标注来源(如:根据XX统计局2024年数据...)
3. 加强问题分析的深度,明确阐述因果关系,避免跳跃式推理
4. 提出的建议需具体可操作,包含实施主体、时间节点、预期效果
5. 论证逻辑:现状分析(数据支撑)→ 问题识别 → 原因剖析 → 解决方案
6. 字数控制在1000-1500字
7. 确保每个论点都有事实或数据支撑

请直接输出公文内容,不要额外说明。

关键创新点

  • 不是硬编码的模板,而是基于诊断结果动态生成
  • AI理解了”写作要求”的本质,能够设计出针对性的指令
  • 实现了”AI为AI编程”的元认知能力

五、流式输出与实时反馈

为了让用户感知系统的运行过程,我们使用Server-Sent Events实现流式输出。

5.1 后端流式API

// app/api/generate/route.ts
function createStreamResponse() {
  const encoder = new TextEncoder();
  const stream = new TransformStream();
  const writer = stream.writable.getWriter();

  const sendLog = async (msg: string, type: 'info' | 'success' | 'warning' | 'error' = 'info') => {
    await writer.write(encoder.encode(`data: ${JSON.stringify({
      type: 'log',
      data: { time: new Date().toLocaleTimeString(), msg, type }
    })}\n\n`));
  };

  const sendStatus = async (status: string) => {
    await writer.write(encoder.encode(`data: ${JSON.stringify({
      type: 'status',
      data: status
    })}\n\n`));
  };

  const sendScores = async (scores: EvaluationScores, version: string) => {
    await writer.write(encoder.encode(`data: ${JSON.stringify({
      type: 'scores',
      data: { scores, version }
    })}\n\n`));
  };

  // ... 其他发送函数

  return { stream: stream.readable, sendLog, sendStatus, sendScores, /* ... */ };
}

export async function POST(request: NextRequest) {
  const { topic } = await request.json();
  const { stream, sendLog, sendStatus, sendContent, sendScores, sendSeed, sendDiagnosis, sendSearchResults, close } = createStreamResponse();

  (async () => {
    // V1阶段
    await sendStatus('running_v1');
    await sendLog('System Init: Topic="${topic}"');

    const searchResults = await searchAgent(topic, v1Seed);
    await sendLog(`Agent [Search] returned ${searchResults.length} results`);
    await sendSearchResults(searchResults, 'v1');

    const guidance = await insightAgent(topic, searchResults, v1Seed);
    await sendLog('Agent [Insight] generated guidance');

    const v1Content = await writerAgent(topic, searchResults, guidance, v1Seed);
    await sendContent(v1Content, 'v1');

    // 评估阶段
    await sendStatus('evaluating_v1');
    const v1Scores = await evaluationAgent(topic, v1Content);
    await sendScores(v1Scores, 'v1');

    // 进化阶段
    await sendStatus('evolving');
    const diagnosis = await diagnosticAgent(v1Scores, v1Seed);
    await sendDiagnosis(diagnosis);

    const v2Seed = await architectAgent(diagnosis, v1Seed);
    await sendSeed(v2Seed, 'v2');

    // V2阶段
    await sendStatus('running_v2');
    // ... V2执行流程

    await sendStatus('done');
    await close();
  })();

  return new Response(stream, {
    headers: {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive',
    },
  });
}

5.2 前端实时接收

// app/page.tsx
const startSimulation = async () => {
  const response = await fetch('/api/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ topic })
  });

  const reader = response.body?.getReader();
  const decoder = new TextDecoder();
  let buffer = '';
  let currentPhase: 'v1' | 'v2' = 'v1';

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    buffer += decoder.decode(value, { stream: true });
    const lines = buffer.split('\n\n');
    buffer = lines.pop() || '';

    for (const line of lines) {
      if (!line.startsWith('data: ')) continue;

      const event = JSON.parse(line.replace('data: ', ''));

      switch (event.type) {
        case 'status':
          setStatus(event.data);
          if (event.data === 'running_v2') currentPhase = 'v2';
          break;

        case 'log':
          if (currentPhase === 'v1') {
            setV1Logs(prev => [...prev, event.data]);
          } else {
            setV2Logs(prev => [...prev, event.data]);
          }
          break;

        case 'content':
          if (event.data.version === 'v1') {
            setV1Content(event.data.content);
          } else {
            setV2Content(event.data.content);
          }
          break;

        case 'scores':
          if (event.data.version === 'v1') {
            setV1Scores(event.data.scores);
          } else {
            setV2Scores(event.data.scores);
          }
          break;

        case 'diagnosis':
          setDiagnosis(event.data);
          break;

        case 'searchResults':
          if (event.data.version === 'v1') {
            setV1SearchResults(event.data.results);
          } else {
            setV2SearchResults(event.data.results);
          }
          break;
      }
    }
  }
};

六、UI设计:可视化进化过程

6.1 三列布局

┌─────────────┬─────────────┬─────────────┐
│   V1 Loop   │   Engine    │   V2 Loop   │
│             │             │             │
│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │
│ │  SEED   │ │ │ Status  │ │ │  SEED   │ │
│ └─────────┘ │ └─────────┘ │ └─────────┘ │
│             │             │             │
│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │
│ │ Search  │ │ │Diagnosis│ │ │ Search  │ │
│ │ Results │ │ │         │ │ │ Results │ │
│ └─────────┘ │ └─────────┘ │ └─────────┘ │
│             │             │             │
│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │
│ │Terminal │ │ │Mutation │ │ │Terminal │ │
│ └─────────┘ │ └─────────┘ │ └─────────┘ │
│             │             │             │
│ ┌─────────┐ │             │ ┌─────────┐ │
│ │Document │ │             │ │Document │ │
│ └─────────┘ │             │ └─────────┘ │
│             │             │             │
│ ┌─────────┐ │             │ ┌─────────┐ │
│ │ Radar   │ │             │ │ Radar   │ │
│ │ Chart   │ │             │ │ Chart   │ │
│ └─────────┘ │             │ └─────────┘ │
└─────────────┴─────────────┴─────────────┘

Mutation是指变体,根据诊断输出新的SEED. Radar Chart是指五维雷达图.

6.2 五维雷达图对比

使用SVG绘制五维雷达图,直观对比V1和V2的评分变化:

const RadarChart = ({ v1Scores, v2Scores, showComparison }: Props) => {
  const size = 280;
  const center = size / 2;
  const radius = 90;
  const keys = Object.keys(v1Scores);
  const total = keys.length;
  const angleSlice = (Math.PI * 2) / total;

  const getCoordinates = (value: number, index: number) => {
    const angle = index * angleSlice - Math.PI / 2;
    return {
      x: center + radius * value * Math.cos(angle),
      y: center + radius * value * Math.sin(angle)
    };
  };

  // 绘制网格线
  const gridLevels = [0.2, 0.4, 0.6, 0.8, 1.0];

  return (
    <svg width={size} height={size}>
      {/* 绘制同心多边形网格 */}
      {gridLevels.map((level, idx) => (
        <polygon
          key={idx}
          points={keys.map((_, i) => {
            const { x, y } = getCoordinates(level, i);
            return `${x},${y}`;
          }).join(' ')}
          fill="none"
          stroke="#e5e7eb"
          strokeWidth="1"
        />
      ))}

      {/* V1数据多边形 */}
      <polygon
        points={keys.map((key, i) => {
          const { x, y } = getCoordinates(v1Scores[key].score, i);
          return `${x},${y}`;
        }).join(' ')}
        fill="rgba(59, 130, 246, 0.2)"
        stroke="#3b82f6"
        strokeWidth="2"
      />

      {/* V2数据多边形(对比模式) */}
      {showComparison && v2Scores && (
        <polygon
          points={keys.map((key, i) => {
            const { x, y } = getCoordinates(v2Scores[key].score, i);
            return `${x},${y}`;
          }).join(' ')}
          fill="rgba(249, 115, 22, 0.25)"
          stroke="#f97316"
          strokeWidth="2"
        />
      )}

      {/* 维度标签 */}
      {keys.map((key, i) => {
        const { x, y } = getCoordinates(1.25, i);
        return (
          <text key={i} x={x} y={y} textAnchor="middle" className="text-[10px] fill-gray-500">
            {key}
          </text>
        );
      })}
    </svg>
  );
};

6.3 Terminal日志组件

模拟终端风格,实时显示Agent执行日志:

const AgentLog = ({ logs, title }: { logs: LogItem[]; title: string }) => {
  const scrollRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (scrollRef.current) {
      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
    }
  }, [logs]);

  return (
    <div className="bg-[#1e1e1e] rounded-xl overflow-hidden border border-gray-700">
      <div className="bg-[#2d2d2d] px-4 py-2 flex items-center gap-2">
        <div className="w-3 h-3 rounded-full bg-[#ff5f56]"></div>
        <div className="w-3 h-3 rounded-full bg-[#ffbd2e]"></div>
        <div className="w-3 h-3 rounded-full bg-[#27c93f]"></div>
        <span className="ml-auto text-gray-500 text-xs">{title}</span>
      </div>

      <div ref={scrollRef} className="p-4 h-56 overflow-y-auto font-mono text-xs">
        {logs.map((log, idx) => (
          <div key={idx} className="flex gap-3">
            <span className="text-gray-500">[{log.time}]</span>
            <span className={
              log.type === 'error' ? 'text-red-400' :
              log.type === 'success' ? 'text-emerald-400' :
              log.type === 'warning' ? 'text-yellow-400' :
              'text-blue-300'
            }>
              {log.msg}
            </span>
          </div>
        ))}
      </div>
    </div>
  );
};

实时日志示例

[14:23:01] System Init: Topic="天津市人工智能现状"
[14:23:01] Agent [Search] executing... depth=2
[14:23:03] Agent [Search] returned 2 results
[14:23:03] Agent [Insight] directive: "通用概述"
[14:23:08] Agent [Insight] generated guidance
[14:23:08] Agent [Writer] drafting content...
[14:23:15] V1 Document Generated.
[14:23:15] Triggering 5D Evaluation Model...
[14:23:22] Evaluation completed.
[14:23:22] Analyzing V1 performance...
[14:23:25] Diagnostician identified weaknesses
[14:23:25] Architect generating new SEED...
[14:23:30] SEED v2.0 (Evolved) generated
[14:23:30] Loading SEED v2.0 (Evolved)...
[14:23:30] Agent [Search] deep scan mode... sources=政府官网,统计局,权威智库,央媒
[14:23:35] Agent [Search] retrieved 15 high-value datasets
...

七、技术栈与依赖

{
  "dependencies": {
    "next": "^16.0.8",
    "react": "^19.0.0",
    "typescript": "^5",
    "@tavily/core": "^1.x",
    "lucide-react": "^0.x"
  }
}

环境变量配置

# .env.local
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxx
TAVILY_API_KEY=tvly-xxxxxxxxxxxxx

八、核心代码目录结构

govdoc-system/
├── app/
│   ├── api/
│   │   └── generate/
│   │       └── route.ts          # 流式API端点
│   ├── page.tsx                  # 主页面UI
│   └── layout.tsx                # 布局
├── lib/
│   ├── agents.ts                 # 搜索、研判、写作Agent
│   ├── evaluators.ts             # 评估、诊断、架构师Agent
│   ├── deepseek.ts               # DeepSeek API封装
│   └── types.ts                  # TypeScript类型定义
└── .env.local                    # 环境变量

九、实验效果分析

9.1 典型进化案例

主题:天津市人工智能现状

V1表现(基线SEED):

评分结果:
- 政治站位:0.82
- 事实准确:0.65  ← 弱点
- 逻辑严密:0.78
- 公文规范:0.90
- 内容深度:0.58  ← 弱点

诊断结果:
- 弱点:事实准确性和内容深度不足
- 原因:搜索深度仅为2,信源范围过于宽泛,研判指令泛化
- 突变策略:
  1. 搜索深度 2 → 15
  2. 信源范围:全网 → 政府+统计+智库+央媒
  3. 研判指令:通用概述 → 数据驱动+深度剖析
  4. 写作要求:AI重新生成针对性提示词

V2表现(进化SEED):

评分结果:
- 政治站位:0.88 (+0.06)
- 事实准确:0.89 (+0.24) ← 显著提升
- 逻辑严密:0.85 (+0.07)
- 公文规范:0.92 (+0.02)
- 内容深度:0.83 (+0.25) ← 显著提升

改进效果:
- 引用了15个权威数据源
- 标注了具体来源(如"根据天津市统计局2024年Q1数据")
- 分析深度提升,包含了产业链分析和政策建议
- 提出了5条具体可操作的建议,包含实施主体和时间节点

9.2 进化机制的有效性

通过10个不同主题的测试,统计结果如下:

维度 V1平均分 V2平均分 提升幅度
政治站位 0.81 0.87 +7.4%
事实准确 0.68 0.86 +26.5%
逻辑严密 0.75 0.84 +12.0%
公文规范 0.88 0.91 +3.4%
内容深度 0.62 0.82 +32.3%

关键发现

  1. 事实准确内容深度提升最显著(25%+),说明进化机制有效针对弱点改进
  2. 公文规范提升较小,因为V1已经较好(基线提示词已经强调格式)
  3. 诊断Agent准确识别了SEED参数与输出质量的因果关系

十、技术亮点与创新

10.1 元学习能力

传统方法:硬编码参数调整规则

if score < 0.7:
    seed.searchDepth += 5

本系统:AI理解”为什么”并自主决策

  • 诊断Agent分析深层原因
  • 架构师Agent设计新的提示词
  • 实现了”AI为AI编程”的元认知

10.2 动态提示词工程

静态模板

写作要求:${temperature}温度,${length}字数,${format}格式

动态生成

// AI根据诊断结果,完整重写提示词
newSeed.writingRequirements = await callDeepSeek(`
根据以下问题诊断,生成改进后的写作要求:
问题:${diagnosis.weakness}
原因:${diagnosis.reason}
建议:${diagnosis.mutation}
...
`);

10.3 多模态观测能力

  • Terminal日志:过程透明
  • 雷达图:效果可视化
  • 搜索结果展示:信息溯源
  • 诊断报告:原因分析

10.4 真实RAG集成

  • 使用Tavily进行真实网页搜索
  • 信源过滤(政府官网、统计局优先)
  • 搜索结果可点击溯源

十一、局限与改进方向

11.1 当前局限

  1. 单次进化:目前只有V1→V2,未实现多代进化
  2. 评估主观性:5维评估依赖AI判断,缺少人类反馈
  3. SEED空间有限:当前只有4个参数,可扩展性受限
  4. 计算成本:每次生成需要多次API调用(约15-20次)

11.2 改进方向

1. 多代进化与收敛检测

while (!converged && generation < MAX_GENERATIONS) {
  const newDoc = await generateWithSeed(currentSeed);
  const scores = await evaluate(newDoc);

  if (scores.average > 0.90) {
    converged = true; // 收敛条件
  }

  currentSeed = await evolve(scores, currentSeed);
  generation++;
}

2. 人类反馈强化学习

  • 收集用户对V2文档的满意度评分
  • 建立”成功SEED”知识库

3. 扩展SEED参数空间

interface ExtendedSEED {
  // 当前参数
  searchDepth: number;
  sourceWhitelist: string[];
  focusDirective: string;
  writingRequirements: string;

  // 新增参数
  thinkingChain: boolean;           // 是否启用思维链
  multiModelEnsemble: string[];     // 多模型集成
  exampleDocuments: string[];       // Few-shot示例
  constraintRules: Rule[];          // 硬约束规则
  creativityBudget: number;         // 创造性预算
}

4. A/B测试与SEED优化

  • 并行生成多个SEED变体
  • 对比评估选择最优
  • 使用遗传算法优化SEED参数

5. 领域迁移

  • 当前针对政府公文,可迁移到:
    • 学术论文写作
    • 技术文档生成
    • 商业报告撰写
    • 代码文档自动化

十二、总结

本文详细介绍了一个自我改善的AI Agent系统的完整设计与实现。核心创新点包括:

  1. 双循环架构:Inner Loop执行 + Outer Loop反思
  2. SEED进化机制:可变参数作为”基因”,通过评估→诊断→突变实现自我改进
  3. 动态提示词生成:让AI为AI设计提示词,实现元学习能力
  4. 多Agent协作:6个专业Agent各司其职,形成完整的工作流
  5. 流式可视化:实时展示进化过程,提升可解释性

这套架构不仅适用于公文写作,更是一种通用的AI自我优化范式。随着大模型能力的提升,我们可以构建越来越”聪明”的系统——它们不仅能执行任务,还能反思学习进化


附录:完整源码

完整项目代码:已经放在星球中了.

关键文件

  • lib/agents.ts - 搜索、研判、写作Agent实现
  • lib/evaluators.ts - 评估、诊断、架构师Agent实现
  • app/api/generate/route.ts - 流式API端点
  • app/page.tsx - 前端UI实现

运行方式

# 1. 安装依赖
npm install

# 2. 配置环境变量
cp .env.example .env.local
# 编辑 .env.local,填入 DEEPSEEK_API_KEY 和 TAVILY_API_KEY

# 3. 运行开发服务器
npm run dev

# 4. 访问 http://localhost:3000

联系作者

让AI的技术被商业赋能, 商业将AI的价值放大.

星球中有开箱即用的源码、讲解视频、提示词,以及落地经验.

欢迎加入我们,思考技术对商业的价值.

示例图

如果你有场景和困难, 欢迎找我聊聊AI

  1. 可以找AI咨询
  2. 可以找我AI落地

我的微信: leigeaicom

Written by

雷哥(微信:leigeaicom)

带你AI编程和AI工程化落地, 让你少走弯路, 做更有价值的创造者.

大家一起来讨论