P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

前言

前两天刷脉脉,看到一条消息给我整乐了。某大厂面试官说,现在面Java岗,AI相关的题已经占到七成了。我寻思着,这哪是面试啊,这是Java程序员的大型转岗现场啊。

以前面试问什么?HashMap底层、Redis缓存穿透、Spring循环依赖。现在呢?“说说你的Agent怎么设计的”“ReAct循环怎么实现的”“记忆压缩用的什么算法”。

不过话说回来,这趋势挺真实的。我干了22年AI,从当年用决策树做推荐,到现在跟大模型斗智斗勇,最大的感受就是:技术迭代的速度,比我老婆变脸的速度还快。

一、Agent项目:从"Hello World"到"Hello Boss"

面试官往那一坐,翘着二郎腿问:“先整体说说,你这个Agent项目里具体干了啥?”

这种时候千万别慌。你就想象自己在跟丈母娘介绍工作,得把"修电脑的"说成"人工智能系统架构师"。

我一般会分三块讲。第一块是Agent引擎,这是整个项目的心脏。我实现了一套ReAct模式的主循环,包括LLM调用、工具执行、上下文管理。说白了,就是让AI像人一样,先思考再行动,行动完了再观察,观察完了再思考。

这逻辑听着简单对吧?但你想想,你让AI去查个天气,它得先想"用户问的是北京还是上海?“然后行动"调用天气API”,再观察"返回了25度晴"。这一套流程要是写不好,AI就会陷入一种"我知道我要查天气但我不知道查哪的天气"的哲学困境。

第二块是多模型接入。我写了套OpenAI兼容的抽象客户端,支持智谱、DeepSeek、Kimi、阶跃星辰四个国产模型切换。每个模型都有自己的小脾气,智谱支持prompt缓存,DeepSeek支持1M上下文,Kimi擅长长文本,阶跃星辰……嗯,阶跃星辰也在努力。

最搞笑的是做SSE流式解析的时候,有的模型流式返回跟机关枪似的哒哒哒,有的跟便秘似的半天挤一个字。我得给它们统一做"肠胃调理",让前端看到的都是丝滑的打字机效果。

第三块是Tool Use和MCP集成。内置了11个核心工具,文件读写、命令执行、代码搜索、网页抓取,还支持动态接入MCP Server。什么叫MCP?就是Model Context Protocol,让AI能调用外部工具的标准协议。以前AI是个闭门造车的书生,现在是个能点外卖的社畜。

面试小贴士:
介绍项目千万别说"我负责了某某模块的开发",要说"我主导了核心引擎的架构设计与实现,解决了多模型异构接入的技术难题"。同样的事,换个说法,薪资能差出五千。

二、ReAct循环:AI的"三思而后行"

老王(面试官)来了兴趣:“你们这个ReAct循环,具体怎么设计的?”

我说:“核心就一个while(true),退出条件让LLM自己决定。”

老王眉头一皱:“就这么简单?”

我说:“对啊,就跟人生一样,表面上是个死循环,实际上全靠自觉。”

ReAct全称Reasoning and Acting,翻译成大白话就是"边想边干"。每次循环分三步:Thought(思考)、Action(行动)、Observation(观察)。

Thought阶段,AI会分析当前状态,决定下一步干啥。比如用户说"帮我查一下明天北京飞上海的机票,要最便宜的",AI这时候会想:“得先查航班信息,然后比价,最后给出推荐。”

Action阶段,AI调用工具。这时候就考验Tool Use的设计了,得让AI知道什么时候该用哪个工具。这就像你让室友带饭,你得告诉他"去食堂二楼"而不是"去吃饭的地方",否则他能在校园里转三圈。

Observation阶段,AI看工具返回了啥,然后更新上下文。如果查到的机票都卖完了,AI就得回到Thought阶段重新思考:“要不查查高铁?”

这个循环一直转,直到AI觉得"行了,我能给出最终答案了",就break出来。当然,为了防止AI陷入"我再想想"的无限拖延,还得设置最大循环次数和token预算。毕竟,再聪明的AI也不能让它思考到地老天荒。

核心逻辑伪代码:

while (!finished && budget > 0) {
    thought = llm.think(context);
    if (thought.isFinalAnswer()) break;
    action = thought.getAction();
    observation = tool.execute(action);
    context.update(observation);
    budget--;
}

三、LLM调用:跟四个"女朋友"同时聊天

多模型接入这块,我常被问到一个问题:“你怎么处理不同模型的差异?”

我说:“就跟同时跟四个女朋友聊天一样,得记住谁爱吃辣、谁不吃香菜、谁看到已读不回会炸毛。”

智谱GLM系列,prompt缓存做得不错,同样的系统提示词不用每次都传全量,省token。DeepSeek呢,1M上下文窗口,你扔本《红楼梦》进去它都能读完。Kimi的长文本处理能力很强,但有时候太长了它会"走神"。阶跃星辰……阶跃星辰确实也在努力。

最头疼的是SSE流式解析。OpenAI的SSE格式是标准答案,但国产模型们各有各的"方言"。有的把finish_reason放在最后一条data里,有的放在倒数第二条,有的干脆不告诉你,让你猜。我就写了个适配器层,给每个模型配个"翻译官",统一转成标准格式。

还有个坑是温度参数。有的模型temperature=0.7效果正好,有的得调到0.3才稳定。这就跟炒菜一样,同样的火候,不同的锅,出来的味道天差地别。我最后搞了个模型配置表,每个模型配一套最佳参数,用户切换模型的时候自动加载。

System Prompt的设计艺术

老王接着问:“System Prompt怎么设计的?”

这问题问得好。System Prompt就是AI的"入职培训手册",你写得越清楚,AI干活越靠谱。

我的设计分三层。第一层是角色定义,告诉AI它是谁、能干啥、不能干啥。比如"你是一个AI编程助手,可以帮助用户编写、调试和优化代码。你不应该提供有害内容或非法建议。"

第二层是工具说明,把每个工具的名字、功能、参数格式列清楚。这就像给新员工发办公用品清单,得告诉他"打印机在茶水间旁边,用之前先刷卡"。

第三层是输出格式约束,规定AI必须按什么格式回复。比如要求它用JSON格式返回工具调用,包含tool_name和parameters字段。不然AI一放飞自我,返回个散文,下游系统直接崩溃。

我试过把System Prompt写得像论文摘要,结果AI回复得也像个论文。后来改成口语化指令,比如"记住,每次调用工具前要先想清楚,别瞎调",效果反而更好。这说明啥?说明AI跟某些领导一样,你跟他讲人话,他才能干人事。

System Prompt黄金法则:
角色定义要具体,工具说明要完整,格式约束要严格,语气要像跟实习生说话——简单、直接、别指望它自己悟。

四、Tool Use:AI的"瑞士军刀"

"Tool什么时候发给LLM,什么时候执行?"老王抛出了经典问题。

我说:“这得看LLM的’心情’。”

老王:“说人话。”

我:“好吧。Tool Schema是在每次请求的时候发给LLM的,放在System Prompt或者用户消息里。LLM看到用户的请求后,自己决定要不要调用工具。如果它觉得’这事我得查一下’,就会在回复里返回一个tool_call;如果觉得’这题我会’,就直接给答案。”

执行时机是这样的:LLM返回tool_call后,系统提取出工具名和参数,去调用对应的工具函数,拿到结果后再塞回上下文,让LLM继续处理。这就好比你问朋友"附近有啥好吃的",他说"我查查美团",然后掏出手机查完告诉你"前面五百米有家烧烤"。

那LLM怎么知道该调用哪个工具呢?靠的是Function Calling机制。我们在System Prompt里把每个工具的描述写得明明白白,LLM根据用户意图匹配最合适的工具。比如用户说"查一下今天的天气",LLM一看,“weather_query"这个工具的描述里有"查询天气”,参数需要"city"和"date",匹配上了,就调用这个。

当然,LLM偶尔也会犯迷糊,该调用工具的时候它直接回答,不该调用的时候它瞎调用。这时候就得在System Prompt里加一些"紧箍咒",比如"如果你不确定,请先调用搜索工具获取信息,不要凭空编造"。

MCP:让AI接入"万能插座"

MCP全称Model Context Protocol,是Anthropic搞的一套标准协议。它的作用就是让AI能动态接入外部工具,就像手机能插各种充电线一样。

以前我们要给AI加新功能,得改代码、重启服务、重新部署。有了MCP,只要对方提供一个MCP Server,AI通过标准协议连上去,就能直接调用。这就像以前你换手机得换充电器,现在统一Type-C了,插上去就能用。

我在PaiCLI里实现了MCP Client,支持stdio和SSE两种传输方式。stdio适合本地工具,比如文件系统操作;SSE适合远程服务,比如网页抓取。接入的时候,AI会先调用tools/list获取可用工具列表,然后根据需要动态调用。

最爽的是,MCP生态发展很快,GitHub上已经有各种现成的MCP Server,查数据库、操作浏览器、发邮件、甚至控制智能家居,应有尽有。AI从一个"只会聊天的书呆子",变成了"什么都会的万事通"。

Tool调用流程:
用户提问 → LLM分析意图 → 匹配工具Schema → 返回tool_call → 系统执行工具 → 结果回传LLM → LLM生成最终回复。整个过程对用户透明,就像魔术一样,你只看到兔子从帽子里出来,没看到背后的机关。

五、记忆压缩:AI的"断舍离"

最后老王问了个狠的:“记忆压缩怎么做的?怎么生成摘要?”

我说:“这就跟整理衣柜一样,衣服太多了塞不下,得把过季的收起来,常用的挂出来。”

AI的记忆分两种:短期记忆和长期记忆。短期记忆就是当前对话的上下文,受限于模型的上下文窗口,一般几K到几M token不等。长期记忆是跨会话的,需要持久化存储。

短期记忆压缩,我主要用了两种策略。第一种是滑动窗口,只保留最近N轮对话,老的直接丢弃。简单粗暴,但容易丢失关键信息。比如你前面说了"我在做Java项目",后面问"推荐个框架",如果"Java"这个信息被滑出去了,AI可能给你推荐个Python框架。

第二种是摘要压缩。当上下文快满的时候,把前面的对话压缩成一段摘要,替换掉原始内容。摘要怎么生成?让LLM自己总结。我把前面的对话丢给LLM,说"请用100字总结上面的关键信息",然后把摘要塞回去。这就像是让AI写读书笔记,读完一章就记个要点,不用每次都翻原书。

长期记忆更复杂。我设计了一个记忆管理系统,分事实记忆和偏好记忆。事实记忆是客观信息,比如"用户在做电商项目"“用户喜欢Spring Boot”。偏好记忆是主观偏好,比如"用户喜欢用Maven而不是Gradle"“用户代码风格喜欢大括号换行”。

每次对话结束,系统会自动提取关键信息,生成记忆片段,存储到向量数据库。下次对话开始时,先检索相关记忆,注入到System Prompt里。这样AI就能记住"哦,这个用户上次说他在做微服务,这次问的问题应该跟这个有关"。

当然,记忆多了也会乱。我加了一个记忆衰减机制,很久不用的记忆权重降低,经常被引用的记忆权重升高。这跟人的记忆一样,常用的记得牢,不用的慢慢就忘了。毕竟,AI也不能什么都记着,不然就成了"数字囤积症"患者。

记忆压缩三板斧:
滑动窗口保近期,摘要压缩省空间,向量检索唤长期。三管齐下,让AI既有"金鱼般的短期专注",又有"大象般的长期记忆"。

六、写在最后

面完出来,我算了算,这八道题涵盖了Agent的架构设计、循环执行、模型接入、工具调用、记忆管理,基本上把AI Agent的核心知识点都扫了一遍。

说实话,22年前我刚入行的时候,面试问的是"什么是面向对象"“讲讲MVC模式”。现在问的是"Agent怎么设计ReAct循环"“System Prompt怎么写”。技术变得真快,快得让人有点慌。

但慌归慌,该学还得学。就像我那个室友,虽然把八股文塞床底了,但每天晚上偷偷拿出来背两页。为啥?因为基础不牢,地动山摇。AI再火,底层还是计算机科学,还是数据结构、算法、系统设计。

所以我的建议是:拥抱AI,但别抛弃基础。学Agent,但别忘了Java的GC原理。毕竟,面试官可能今天问你ReAct,明天就可能问你"HashMap为什么线程不安全"。

最后送大家一句话:在这个AI日新月异的时代,唯一不变的就是变化本身。与其焦虑,不如行动。毕竟,22年前我也没想到,有一天我会跟AI讨论"它该怎么记住用户喜欢用Maven这件事"。

(全文完,如果觉得有用,点个赞再走呗)

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐