从原理到实战:Gemini CLI的Agent架构与百万token上下文管理终极指南,入门到精通这一篇就够了
`gemini-cli` 从开源至今仅一个多月,已经收获接近65K Star,作为第一个开源的通用命令行智能体工具,在开源社区贡献者的参与下,现如今功能已经非常完善。本文将对源码进行解析,学习其中优秀Agent的设计思路,将重点关注主控Agent以及上下文管理的实现,对于其他部分不在本文的讨论范围之内。
gemini-cli
从开源至今仅一个多月,已经收获接近65K Star,作为第一个开源的通用命令行智能体工具,在开源社区贡献者的参与下,现如今功能已经非常完善。本文将对源码进行解析,学习其中优秀Agent的设计思路,将重点关注主控Agent以及上下文管理的实现,对于其他部分不在本文的讨论范围之内。
主控 Agent 循环实现
核心架构
gemini-cli
的 Agent 循环主要由以下几个核心组件构成:
- GeminiClient (
client.ts
) - 主控制器 - Turn (
turn.ts
) - 单轮对话管理 - CoreToolScheduler (
coreToolScheduler.ts
) - 工具调用调度 - LoopDetectionService (
loopDetectionService.ts
) - 循环检测
主循环流程
// 主要入口点在 GeminiClient.sendMessageStream
asyncsendMessageStream(prompt:string, prompt_id?:string):Promise<AsyncGenerator<ServerGeminiStreamEvent>>{
// 1. 会话轮次限制检查
if(this.turnCount>=this.MAX_TURNS){
thrownewError(`Maximum turns (${this.MAX_TURNS}) reached`);
}
// 2. 聊天历史压缩
const compressed =awaitthis.tryCompressChat(prompt_id);
// 3. 循环检测
const loopDetected =awaitthis.loopDetectionService.checkForLoop(...);
// 4. 创建 Turn 实例并执行
const turn =newTurn(this.chat,this.coreToolScheduler,...);
return turn.run();
}
循环检测机制
在主循环过程中,系统实现了双重循环检测机制,确保系统不会陷入无限的工具调用或内容生成循环:
- 资源保护 :避免消耗过多的 API 调用次数和计算资源
- 用户体验 :及时通知用户并停止无效的处理过程
- 会话恢复 :用户可以重新发起新的请求,循环检测状态会在新的
prompt_id
开始时重置
1. 内容块分析检测
一个基本的内容检测方法,用于快速检测内容块是否存在重复。基本原理如下:
- 固定大小滑动窗口 :使用
CONTENT_CHUNK_SIZE = 100
字符的固定大小块 - SHA256 哈希算法 :对每个文本块计算哈希值进行高效比较
- 位置追踪 :记录相同哈希值出现的所有位置索引
- 距离分析 :当相同块出现
CONTENT_LOOP_THRESHOLD = 10
次时,计算平均距离 - 循环判定 :如果平均距离 ≤
1.5 × 块大小
,则判定为循环
classLoopDetectionService{
privatestaticreadonlyCHUNK_SIZE=100;// 固定块大小
privatestaticreadonlyMIN_REPETITIONS=3;// 最小重复次数
privatecontentHashes:Map<string,number[]>=newMap();
analyzeContentChunksForLoop(content:string):boolean{
const chunks =this.createFixedSizeChunks(content,this.CHUNK_SIZE);
for(let i =0; i < chunks.length; i++){
const hash =this.hashContent(chunks[i]);
if(!this.contentHashes.has(hash)){
this.contentHashes.set(hash,[]);
}
const positions =this.contentHashes.get(hash)!;
positions.push(i);
// 检查是否有足够的重复
if(positions.length>=this.MIN_REPETITIONS){
const intervals =this.calculateIntervals(positions);
if(this.hasConsistentPattern(intervals)){
returntrue;// 检测到循环
}
}
}
returnfalse;
}
privatecreateFixedSizeChunks(content:string,size:number):string[]{
constchunks:string[]=[];
for(let i =0; i <= content.length- size; i += size){
chunks.push(content.substring(i, i + size));
}
return chunks;
}
privatehashContent(content:string):string{
// 使用简单的哈希算法
let hash =0;
for(let i =0; i < content.length; i++){
constchar= content.charCodeAt(i);
hash =((hash <<5)- hash)+char;
hash = hash & hash;// 转换为32位整数
}
return hash.toString();
}
}
2. LLM智能检测
试用LLM结合上下文判断是否出现内容循环,设置条件如下:
- 触发条件 :在第 30 轮后开始,每隔 3-15 轮检查一次
- 上下文分析 :提取最近 20 轮对话历史
- 语义理解 :使用 Gemini Flash 模型分析对话模式
- 置信度评估 :返回0~1.0的循环置信度分数
- 动态调整 :根据置信度调整下次检查间隔
classLoopDetectionService{
privatestaticreadonlyDEFAULT_CHECK_INTERVAL=5;// 默认检查间隔
privatestaticreadonlyHIGH_CONFIDENCE_THRESHOLD=0.8;
privatestaticreadonlyMEDIUM_CONFIDENCE_THRESHOLD=0.6;
asynccheckForLoopWithLLM(history:ChatMessage[]):Promise<LoopCheckResult>{
const recentHistory = history.slice(-10);// 取最近10条消息
const prompt =this.buildLoopDetectionPrompt(recentHistory);
const response =awaitthis.llmClient.generateContent(prompt);
const result =this.parseLoopDetectionResponse(response);
// 根据置信度调整下次检查间隔
if(result.confidence>=this.HIGH_CONFIDENCE_THRESHOLD){
this.nextCheckInterval=2;// 高置信度,更频繁检查
}elseif(result.confidence>=this.MEDIUM_CONFIDENCE_THRESHOLD){
this.nextCheckInterval=3;// 中等置信度
}else{
this.nextCheckInterval=this.DEFAULT_CHECK_INTERVAL;// 低置信度,正常间隔
}
return result;
}
privatebuildLoopDetectionPrompt(history:ChatMessage[]):string{
return`
分析以下对话历史,判断AI助手是否陷入了非生产性的循环状态:
${history.map(msg => `${msg.role}:${msg.content}`).join('\n')}
请评估:
1. 是否存在重复的响应模式
2. 是否在执行相同的无效操作
3. 是否缺乏实质性进展
返回JSON格式:{"isLoop": boolean, "confidence": number, "reason": string}
`;
}
}
Turn 类详细实现
Turn
类是单轮对话的核心管理器,负责处理流式响应和工具调用:
classTurn{
privatependingToolCalls:ToolCall[]=[];
async*run():AsyncGenerator<ServerGeminiStreamEvent>{
// 处理响应流
forawait(const response ofthis.chat.sendMessageStream(this.prompt)){
// 处理 thought 部分
if(response.thought){
yield{type:GeminiEventType.Thought,content: response.thought};
}
// 处理文本内容
if(response.text){
yield{type:GeminiEventType.Content,content: response.text};
}
// 处理函数调用
if(response.functionCalls){
for(const call of response.functionCalls){
this.handlePendingFunctionCall(call);
}
}
}
// 处理待处理的工具调用
if(this.pendingToolCalls.length>0){
yield*this.handleToolCalls();
}
}
privatehandlePendingFunctionCall(call:FunctionCall):void{
this.pendingToolCalls.push({
id:generateId(),
name: call.name,
params: call.args
});
}
}
上下文管理实现
内存管理策略
gemini-cli
采用 纯内存 + 文件系统的混合存储方案, 不依赖数据库 :
- 内存存储: 会话期间的上下文保存在内存中,如:聊天历史、工具调用状态、循环检测状态等
- 文件系统持久化: 长期记忆通过文件系统存储,如:用户记忆、项目上下文等
- 智能压缩: 动态压缩聊天历史以控制token使用
聊天历史压缩机制
// 压缩触发条件和参数
staticreadonlyCOMPRESSION_TOKEN_THRESHOLD=0.7;// 70% token 使用率触发压缩
staticreadonlyCOMPRESSION_PRESERVE_THRESHOLD=0.3;// 保留 30% 最新历史
staticreadonlyMAX_TURNS=100;// 最大会话轮次
asynctryCompressChat(prompt_id?:string):Promise<boolean>{
const history =this.getChat().getHistory(true);
const originalTokenCount =countTokens(history,this.model);
const limit =tokenLimit(this.model);
// 检查是否需要压缩
if(originalTokenCount >this.COMPRESSION_TOKEN_THRESHOLD* limit){
// 计算保留的历史记录数量
const preserveIndex =this.findIndexAfterFraction(
history,
this.COMPRESSION_PRESERVE_THRESHOLD
);
// 生成摘要并更新历史
const summary =awaitthis.sendMessage(getCompressionPrompt(),...);
this.getChat().updateHistory(newHistory);
returntrue;
}
returnfalse;
}
结构化的压缩提示词
与Claude code
类似,也是提供把需要压缩的内容提炼为几个部分,进而减少token的使用量,避免超出上下文限制:
- overall_goal:用户的主要目标
- key_knowledge:重要的技术知识和决策
- file_system_state:文件系统的当前状态
- recent_actions:最近执行的重要操作
- current_plan:当前的执行计划
完整的prompt如下:
You are the component that summarizes internal chat history into a given structure.
When the conversation history grows too large, you will be invoked to distill the entire history into a concise, structured XML snapshot.This snapshot is CRITICAL,as it will become the agent's *only* memory of the past. The agent will resume its work based solely on this snapshot. All crucial details, plans, errors, and user directives MUST be preserved.
First, you will think through the entire history in a private <scratchpad>. Review the user's overall goal, the agent's actions, tool outputs, file modifications, and any unresolved questions. Identify every piece of information that is essential for future actions.
After your reasoning is complete, generate the final <state_snapshot> XML object. Be incredibly dense with information. Omit any irrelevant conversational filler.
The structure MUST be as follows:
<state_snapshot>
<overall_goal>
<!-- A single, concise sentence describing the user's high-level objective.-->
<!--Example:"Refactor the authentication service to use a new JWT library."-->
</overall_goal>
<key_knowledge>
<!--Crucial facts, conventions,and constraints the agent must remember based on the conversation history and interaction with the user.Use bullet points.-->
<!--Example:
-BuildCommand: \`npm run build\`
-Testing:Tests are run with \`npm test\`.Test files must endin \`.test.ts\`.
- API Endpoint:The primary API endpoint is \`https://api.example.com/v2\`.
-->
</key_knowledge>
<file_system_state>
<!--List files that have been created, read, modified,or deleted.Note their status and critical learnings.-->
<!--Example:
- CWD: \`/home/user/project/src\`
- READ: \`package.json\` -Confirmed'axios'is a dependency.
- MODIFIED: \`services/auth.ts\` -Replaced'jsonwebtoken'with'jose'.
- CREATED: \`tests/new-feature.test.ts\` -Initial test structure for the new feature.
-->
</file_system_state>
<recent_actions>
<!-- A summary of the last few significant agent actions and their outcomes.Focus on facts.-->
<!--Example:
-Ran \`grep 'old_function'\` which returned 3 results in2 files.
-Ran \`npm run test\`, which failed due to a snapshot mismatch in \`UserProfile.test.ts\`.
-Ran \`ls -F static/\` and discovered image assets are stored as \`.webp\`.
-->
</recent_actions>
<current_plan>
<!--The agent's step-by-step plan. Mark completed steps. -->
<!-- Example:
1. [DONE] Identify all files using the deprecated 'UserAPI'.
2. [IN PROGRESS] Refactor \`src/components/UserProfile.tsx\` to use the new 'ProfileAPI'.
3. [TODO] Refactor the remaining files.
4. [TODO] Update tests to reflect the API change.
-->
</current_plan>
</state_snapshot>
总结
gemini-cli
的设计思路不乏以下亮点:
- 循环控制 :多层安全机制确保系统稳定性,包括轮次限制和智能循环检测
- 上下文管理 :无数据库依赖的轻量级设计,结合智能压缩和结构化摘要,有效管理长对话历史
与Manus
类似,gemini-cli
使用文件系统持久化长期记忆,因为文件系统就是天然的数据库,这种设计既保证了系统的可靠性和性能,又提供了良好的用户体验和扩展性。
不过,略显遗憾的是目前gemini-cli
使用的仍然是单一主控Agent来控制所有交互,响应速度上会比较差;而Claude code
则是多Agent架构,同时异步设计实现了高效的响应速度,并且还允许用户根据不同任务定义不同的子Agent,在性能和效率上都是断档的存在。期待后续gemini-cli
和其他开源的Agent也能够实现类似的架构。
如何学习大模型 AI ?
我国在AI大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着Al技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国Al产业的创新步伐。加强人才培养,优化教育体系,国际合作并进,是破解困局、推动AI发展的关键。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
2025最新大模型学习路线
明确的学习路线至关重要。它能指引新人起点、规划学习顺序、明确核心知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
对于从来没有接触过AI大模型的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线。
针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
大模型经典PDF书籍
新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路!
配套大模型项目实战
所有视频教程所涉及的实战项目和项目源码等
博主介绍+AI项目案例集锦
MoPaaS专注于Al技术能力建设与应用场景开发,与智学优课联合孵化,培养适合未来发展需求的技术性人才和应用型领袖。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
为什么要学习大模型?
2025人工智能大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
适合人群
- 在校学生:包括专科、本科、硕士和博士研究生。学生应具备扎实的编程基础和一定的数学基础,有志于深入AGI大模型行业,希望开展相关的研究和开发工作。
- IT行业从业人员:包括在职或失业者,涵盖开发、测试、运维、产品经理等职务。拥有一定的IT从业经验,至少1年以上的编程工作经验,对大模型技术感兴趣或有业务需求,希望通过课程提升自身在IT领域的竞争力。
- IT管理及技术研究领域人员:包括技术经理、技术负责人、CTO、架构师、研究员等角色。这些人员需要跟随技术发展趋势,主导技术创新,推动大模型技术在企业业务中的应用与改造。
- 传统AI从业人员:包括算法工程师、机器视觉工程师、深度学习工程师等。这些AI技术人才原先从事机器视觉、自然语言处理、推荐系统等领域工作,现需要快速补充大模型技术能力,获得大模型训练微调的实操技能,以适应新的技术发展趋势。
课程精彩瞬间
大模型核心原理与Prompt:掌握大语言模型的核心知识,了解行业应用与趋势;熟练Python编程,提升提示工程技能,为Al应用开发打下坚实基础。
RAG应用开发工程:掌握RAG应用开发全流程,理解前沿技术,提升商业化分析与优化能力,通过实战项目加深理解与应用。
Agent应用架构进阶实践:掌握大模型Agent技术的核心原理与实践应用,能够独立完成Agent系统的设计与开发,提升多智能体协同与复杂任务处理的能力,为AI产品的创新与优化提供有力支持。
模型微调与私有化大模型:掌握大模型微调与私有化部署技能,提升模型优化与部署能力,为大模型项目落地打下坚实基础。
顶尖师资,深耕AI大模型前沿技术
实战专家亲授,让你少走弯路
一对一学习规划,职业生涯指导
- 真实商业项目实训
- 大厂绿色直通车
人才库优秀学员参与真实商业项目实训
以商业交付标准作为学习标准,具备真实大模型项目实践操作经验可写入简历,支持项目背调
大厂绿色直通车,冲击行业高薪岗位
文中涉及到的完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)