LoopAgent循环优化代码

2026年1月13日 · 349 字 · 2 分钟

这里演示LoopAgent的使用方法,使用一个代码优化作为例子

LoopAgent循环优化代码

LoopAgent 的执行遵循以下设定:

循环执行:重复执行 SubAgents 序列(序列是“有序的”)

History 累积:每次迭代的结果都会累积到 History 中,后续迭代可以访问所有历史信息

条件退出:达到最大迭代次数来终止循环,配置 MaxIterations=0 时表示无限循环

这里演示代码优化的LoopAgent,分为两个Agent,最大进行3轮循环

代码分析agent

// 代码分析 Agent
func NewCodeAnalyzerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "CodeAnalyzer",
		Description: "分析代码质量和性能问题", // 描述Agent功能
		Instruction: `你是一个代码分析专家。你的职责是分析代码问题,不是优化代码。

请分析当前代码是否存在以下5种问题:
1. 性能瓶颈
2. 代码重复
3. 可读性问题
4. 潜在的 bug
5. 不符合最佳实践的地方

重要规则:
- 如果发现任何问题,只需列出问题,然后结束回答,不要调用 exit tool
- 只分析和指出问题,绝对不要给出优化建议或给出优化后的代码
- 不要自己尝试优化代码,优化工作由 CodeOptimizer 负责
- 只有在代码完全没有任何问题时,才调用 exit tool`, // Instruction是SystemMessage
		Model: llm.CreateDeepseekModel(),
		ToolsConfig: adk.ToolsConfig{
			ToolsNodeConfig: compose.ToolsNodeConfig{
				Tools: []tool.BaseTool{adk.ExitTool{}}, // ExitTool内部会创建一个ExitAction,调用此工具会退出LoopAgent
			},
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

// 代码优化 Agent
func NewCodeOptimizerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "CodeOptimizer",
		Description: "根据分析结果优化代码",
		Instruction: `基于前面的代码分析结果,对代码进行优化改进:
1. 修复识别出的性能问题
2. 消除代码重复
3. 提高代码可读性
4. 修复潜在 bug
5. 应用最佳实践

请提供优化后的完整代码。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

代码优化agent

// 代码优化 Agent
func NewCodeOptimizerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "CodeOptimizer",
		Description: "根据分析结果优化代码",
		Instruction: `基于前面的代码分析结果,对代码进行优化改进:
1. 修复识别出的性能问题
2. 消除代码重复
3. 提高代码可读性
4. 修复潜在 bug
5. 应用最佳实践

请提供优化后的完整代码。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

LoopAgent

func LoopAgent(code string) {
	ctx := context.Background()
	//创建LoopAgent
	loopAgent, err := adk.NewLoopAgent(ctx, &adk.LoopAgentConfig{
		Name:        "code_optimization_loop",
		Description: "代码优化循环,循环执行代码分析和优化",
		SubAgents: []adk.Agent{
			NewCodeAnalyzerAgent(),
			NewCodeOptimizerAgent(),
		},
		MaxIterations: 3,
	})
	if err != nil {
		log.Fatal(err)
	}
	//运行agent
	runner := adk.NewRunner(ctx, adk.RunnerConfig{
		Agent: loopAgent,
	})
	fmt.Println("开始代码优化循环")
	//开启迭代器
	iter := runner.Query(ctx, "请你优化以下go代码: \n"+code)

	count := 0 //记录第几轮

	for {
		event, ok := iter.Next()
		if !ok {
			break
		}
		if event.Err != nil {
			log.Fatal(event.Err)
		}
		if event.Output != nil && event.Output.MessageOutput != nil {
			msg, err := event.Output.MessageOutput.GetMessage()
			if err != nil {
				log.Fatal(err)
			}
			if msg.Role == schema.Assistant {
				fmt.Printf("============第%d轮===================\n", count)
				fmt.Println(event.AgentName)
				fmt.Println(msg.Content)
			}
			if event.AgentName == "CodeAnalyzer" {
				if event.Action != nil && event.Action.Exit {
					fmt.Println("代码循环提前结束")
					break
				}
			}
			if event.AgentName == "CodeOptimizer" {
				count++
			}
		}
	}
	fmt.Println("代码优化循环结束")
}

最后调用

func main() {
	LoopAgent(`func processData(data []int) []int {
    result := []int{}
    for i := 0; i < len(data); i++ {
        for j := 0; j < len(data); j++ {
            if data[i] > data[j] {
                result = append(result, data[i])
                break
            }
        }
    }
    return result
}`)
}