近期笔者因为参与LLM增强项目攻坚,对LLM工程相关的技术也希望有一定的了解,因此希望借这个机会,读一些文章充电,看看目前LLM智能化工程的一些研究趋势。在阅读了几篇文章之后,最终读者选定AgentFlow这个项目做代码实现分析。由于笔者在算法方面的涉猎实在不深,所以本文只是抛砖引玉,阐述上有什么不专业不严谨的地方,也辛苦大家指正。
AgentFlow主要解决现有LLM在进行工具增强推理时有可扩展和泛化能力差的问题,简单来说就是在线LLM-Agent服务缺乏在生产环境中RL(强化学习)的手段。所以AgentFlow提出了以下的解决方案,一是一套动态训练Planner的编排,另外一个是一套奖励目标训练算法Flow-GRPO。源码可以通过这个GitHub来下载,跑了一番看Agent编排的实现比较完整,但在线服务跟训练的部署执行会比较难搞,所以本文更倾向于对Agent编排做详细阐述。
Agent编排包含Planner、Executor、Verifier跟Generator四个角色,Planner会不断Rollout判断下一步要做什么,Executor执行ToolCall,Verifier判断当前问题是否解决,Generator负责整合Output。整个核心代码集中在Solver.solve,长这个样子:
1 | class Solver: |
详细来讲是这样一个流程:
- Analyze Query
- Inputs:Question & Tools -> Inject Into Prompts
- Outputs: Query Analysis -> Brief & Concise
- Main Execution Loop
- Planner.generate_next_step
- Inputs: Question, Query Analysis, Memory & StepCount -> Inject Into Prompts
- Outputs: NextStep -> Justification, Context, SubGoal & ToolName
- Planner.extract_subgoal_and_tool -> JSON or REGEX
- Inputs: NextStep
- Outputs: Context, SubGoal & ToolName
- CallTool if tool is active
- Executor.generate_tool_command
- Inputs: Question, Context, SubGoal & ToolMeta -> Inject Into Prompts
- Outputs: ToolCommand
- Executor.extract_explanation_and_command
- Inputs: ToolCommand
- Outputs: analysis, explanation & command
- Executor.execute_tool_command
- Inputs: ToolName & Command
- Outputs: Result
- Executor.generate_tool_command
- Memory.add_action
- Inputs:StepCount, ToolName, SubGoal, Command, Result
- Planner.verificate_context -> verify memory
- Inputs: Question, Query Analysis, Memory, StepCount -> Inject Into Prompts
- Outputs: Stop Verification -> Explanation + STOP/CONTINUE
- Planner.extract_conclusion -> JSON or REGEX
- Inputs: Stop Verification
- Outputs: Context Verification (Explanation), Conclusion (STOP/CONTINUE)
- Planner.generate_final_output/generate_direct_output
- Inputs: Question, Memory -> Inject Into Prompts
- Outputs: Chat Response
- Planner.generate_next_step
本质上这套流程是一个多回合的MDP(马尔可夫决策过程),通过上面4个模块的协作,不断逼近最合理的答案。但仅仅有这个框架还是不够的,纯Rollout逼近的效果理论上肯定没有经过训练之后的好。所以paper里采用Flow-GRPO这套体系提供生产环境训练能力,有两个关键点:
- QA奖励:单次QA奖励会广播到每个step,最终结果影响每个step的决策奖励;
- Group-Normalized-Advantages(组归一化优势):在每个训练批次中,算法对同一批次(并行rollouts)所有轨迹的优势函数做归一化,确保优化梯度合理,本质也符合GRPO的思路。
要详细了解AgentFlow这套GRPO实现的话,可以看这个以及另一个知乎文章,此处不再赘述。代码方面的话,目前笔者没有跑通,也有可能需要借助verl、cuda之类环境才可以把整个训练验证跑起来。从已有信息来看,也许训练逻辑走到了下面的代码,通过training_rollout_async和_solve_and_evaluate保证训练集的Rollout和评测可并发进行,然后产出一批rollout_data,但rollout_data的消费逻辑目前还不明确。具体的话,可以参考目前rollout的逻辑:
1 | class Rollout(LitAgent): |