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
}`)
}