聊到AutoGen框架我得先给个定位它不是又一个聊天框包装工具而是一套专门用来编排多个AI代理协同工作的运行时。今年我在两个真实项目里把它用到了生产环境一个做自动化数据分析一个做多轮文案迭代。回头再看AutoGen最打动我的不是某个模型能力而是它把“对话”这个人类最自然的协作模式搬到了多个智能体之间。这篇文章就把我当时从选型、上手、踩坑到落地的过程写出来代码基于pyautogen 0.2.x版本适合正在评估多Agent框架、或者已经被LangChain编排搞得头大的朋友。1. 为什么我会在项目里选用AutoGen框架1.1 从“单模型问答”到“多智能体协作”的转变先聊一个很现实的问题单个大模型真的能独立完成一件复杂的业务任务吗我的答案是不能。拿数据分析举例。你要让模型“读取CSV、清洗空值、做分组统计、画一张图、再解释结论”。如果把这些全塞进一个Prompt里模型往往会在某个环节开始“幻觉”比如编造不存在的列名或者明明没执行代码却说已经算完了。原因很简单LLM本质上是一个“字接龙”模型不是流程执行引擎。它更适合在某个具体步骤里发挥作用而不是一口气把整个工作流吞下去。多智能体协作解决的正是这个问题。AutoGen框架允许你定义多个拥有不同系统提示词和模型的Agent让它们通过消息互相交流。一个Agent负责拆解任务另一个Agent负责写代码第三个Agent负责审查结果。每个Agent只做自己擅长的部分整体像一个真实团队在工作。这个思路听起来不复杂但真正落地时消息怎么路由、工具谁执行、人类什么时候介入都需要一个框架来承载。AutoGen就是把这个承载层做得比较成熟的那一个。我习惯用一个生活类比理解它以前是“老板让一个全能员工从头干到尾”现在是“老板开了一个群把策划、设计师、剪辑、审片拉进群大家在群里讨论、反馈、迭代”。AutoGen就是那个群主负责拉群、定规则、控制发言顺序。1.2 AutoGen与LangChain这类工具的本质差异很多朋友会问我LangChain不也能编排吗到底该用哪个我的判断标准很简单看你的核心抽象是“链”还是“对话”。LangChain的核心抽象是Chain一条链上的每个节点是固定的。你想让A先输出、B再处理、C最后汇总就把它串成一条链流程相对确定适合接口清晰的流水线。AutoGen的核心抽象是ConversableAgent每个Agent都可以平等地接收消息、产生回复消息是动态路由的。这意味着Agent与Agent之间可以来回讨论、质疑、修改像群聊一样自由而不是一条直线走到底。我用一个对比表说明对比维度LangChainAutoGen核心抽象Chain链ConversableAgent可对话代理流程确定性确定性高按节点执行动态对话发言顺序由LLM或策略决定工具执行通过Tool节点调用UserProxyAgent可执行代码或注册函数调试方式看链路日志看对话转录接近“读聊天记录”最适合场景固定流程的RAG、结构化管道多角色协作、迭代式生成、代码执行在选型时我还考虑过一点AutoGen的对话式编排特别适合“结果需要反复打磨”的任务。比如写一份市场分析报告第一版可能方向偏了第二版数据用错了第三版结构才稳定下来。这个过程如果用LangChain写你就得为每次迭代单独设计链节代码会越写越绕。AutoGen让Agent之间自由反馈天然支持这种“来回改”的模式代码量反而更少。1.3 影响范围什么样的项目真正适合AutoGenAutoGen不是万能的它适合那些“可以拆分成多个角色、且角色之间存在信息反馈”的任务。我实际验证过的场景包括自动化数据分析规划Agent拆解统计口径写码Agent生成Python代码UserProxyAgent执行最后解释Agent输出结论。代码生成与执行让模型写代码、工具执行代码、再把执行结果喂回模型形成闭环。多角色内容创作写文案、审稿、修改模拟一个内容小组的工作流。竞品调研搜索Agent收集信息分析师Agent汇总挑战者Agent提出质疑。不适合的场景也很明显如果你的业务只是一个简单的FAQ问答或者需要低于300毫秒的低延迟API直接调模型就好引入多Agent反而耗时和成本都会成倍增长。记住一句话多智能体是用来解决复杂问题的不是用来给简单问题加戏的。2. 快速搭起第一个AutoGen对话应用2.1 安装与版本选择pyautogen的版本迷宫先解决最容易翻车的问题版本。AutoGen从2023年开源到现在API变化非常大。0.2.x时代是经典API很多教程都是基于这个版本写的。0.4.x开始底层重构拆成了autogen-core和autogen-agentchat类名和用法有不少变化。如果你照着网上0.2的代码装最新的0.4包大概率直接跑不通。我的建议是刚入门就锁死0.2.x版本先把核心概念吃透再去看新的。安装命令很直接pip install pyautogen0.2.28如果你需要代码执行建议再装一下Docker相关的依赖但这里的示例为了简单我会用本地执行并加安全提示。确认装好了可以检查版本import autogen print(autogen.__version__)我在版本上栽过一次跟头一开始装上的是0.4.x照着老教程写autogen.ConversableAgent结果发现包名变成了autogen_agentchat光适配就花了一个下午。所以这篇博客后面的所有代码都按0.2.28来写。2.2 第一个双Agent对话三分钟跑通装好之后的第一个程序我建议别着急上复杂功能先让两个Agent互相说句话感受一下“对话流”长什么样。下面这段代码非常经典import autogen llm_config { config_list: [ { model: gpt-4o-mini, api_key: sk-你的密钥, base_url: https://api.openai.com/v1 } ], temperature: 0.7, timeout: 120, } writer autogen.AssistantAgent( namewriter, system_message你是一位文案编辑。当对方给出写作任务时你负责写出初稿。, llm_configllm_config, ) reviewer autogen.AssistantAgent( namereviewer, system_message你是一位审稿人。你负责点评初稿提出修改建议。, llm_configllm_config, ) result writer.initiate_chat( reviewer, message请帮我写一句关于秋天的文案。, max_turns4, )这段代码做了什么writer发起了一个对话reviewer作为接收方参与进来。max_turns4限制了最多来回4轮避免两个模型无限互聊。运行后你会看到控制台打印出两个Agent一步步说话的内容这就是AutoGen最基础的运行模式。这里需要注意system_message是Agent的“人设”非常关键。如果你不告诉审稿人“你只负责点评”它也可能直接写文案如果你不告诉编辑“任务完成要说TERMINATE”对话就停不下来。人设写得越具体协作越可控。2.3 读懂llm_config模型网关与参数的关键配置llm_config是AutoGen所有Agent共用的“大脑参数”。我拆开讲几个重点config_list一个列表可以配置多个模型和密钥。AutoGen会自动做负载均衡或失败重试。如果在国内使用各家大模型的OpenAI兼容接口只需要改base_url、api_key和model三个字段比如DeepSeek、智谱、阿里云百炼都支持这种格式。temperature控制随机性。0到1之间写代码、做计算任务建议调低到0.2写文案可以调到0.8让表达更有创意。timeout请求超时时间。Agent对话可能一轮要生成很长的回复默认60秒不够用我一般设到120秒。cache_seed一个容易被忽略的参数。设成一个整数比如cache_seed42AutoGen会把相同参数的模型输出缓存到本地磁盘重复调试时能省不少钱。我强烈建议在开发阶段开启。实际项目中我一般会写一个配置文件来管理这些模型参数而不是硬编码在代码里。尤其当你有多个团队共用一套代码时模型接入信息集中管理会省很多事。3. 核心机制拆解消息循环、工具调用与人机协作3.1 消息的内部流转谁在什么时候说了什么很多人用AutoGen用得很玄乎其实就是没搞懂消息流转。每个ConversableAgent内部有一系列“回复生成器”收到消息后按优先级依次尝试检查是否有收到新的工具执行结果如果有把结果整理成回复。检查是否有注册的函数需要调用如果有生成工具调用请求。默认情况下调用LLM生成文本回复。UserProxyAgent的特殊之处在于它默认不会调用LLM而是负责“行动”。它可以执行代码块、调用注册函数然后把执行结果作为消息发回去。这就是为什么经典的“写代码-执行代码-返回结果”循环里一定需要UserProxyAgent参与。AssistantAgent负责写代码UserProxyAgent负责跑起来。我画不出漂亮的结构图但你可以把消息流想象成一圈人传纸条AssistantAgent写了一张纸条UserProxyAgent收到后照着纸条做动作再把动作结果写在另一张纸条上传回去。反复传直到有人写“TERMINATE”。如果你在调试时觉得“Agent怎么不说话了”或者“它怎么自己回复自己”本质上是这个消息流在某一步断了。通过开启详细日志能看到每一步谁收到了什么消息。3.2 用工具注册代替代码执行让Agent学会“动手”代码执行是AutoGen的重要能力但有些场景不适合直接跑代码。比如你想让Agent调用内部API获取数据或者调用一个公司内部封装好的函数更安全的方式是注册工具。工具注册分两步。第一步把函数注册给AssistantAgent让LLM知道有这个工具存在第二步把同一个函数注册给UserProxyAgent让它负责真正执行。from typing import Annotated def get_weather(city: Annotated[str, 城市名称]) - str: 查询指定城市的天气情况。 # 这里可以替换成真实的天气API调用 return f{city}晴25度微风 assistant autogen.AssistantAgent( nameassistant, llm_configllm_config, system_message你可以调用天气工具。任务完成回复TERMINATE。, ) user_proxy autogen.UserProxyAgent( nameuser_proxy, human_input_modeNEVER, max_consecutive_auto_reply5, is_termination_msglambda msg: TERMINATE in msg.get(content, ), ) assistant.register_for_llm(nameget_weather, description查询天气)(get_weather) user_proxy.register_for_execution(nameget_weather)(get_weather) user_proxy.initiate_chat( assistant, message北京今天天气怎么样, )这段代码里有几个细节非常容易踩坑函数的参数必须有类型注解并且最好用Annotated补充说明。LLM需要根据类型注解来生成合法的调用参数我见过很多人不写类型注解结果工具调用总是报错。register_for_llm和register_for_execution的名字必须一致否则UserProxyAgent执行时会找不到工具。注册给AssistantAgent的函数会被自动组装成OpenAI tools参数传给模型。如果你的模型不支持function calling这个机制不会生效。为什么不让AssistantAgent直接执行函数因为它只是一个文本模型它“说”出来的工具调用是文本意图不是真的程序执行。真实环境里执行动作必须放在一个能访问外部世界的组件里UserProxyAgent就是这个执行者的角色。3.3 human_input_mode把人类放回对话里多智能体系统最大的风险是“两个人自嗨把结果搞偏”。所以AutoGen提供了human_input_mode参数让人类可以在对话中途介入。三种模式模式行为使用场景NEVERAgent之间自动对话不需要人工输入测试、批量任务、自动化流程TERMINATE仅在对话可能结束前询问人类是否确认半自动流程人工做最后把关ALWAYS每次Agent回复前都询问人类意见需要高度把控的任务比如重要报告我在生产环境里用得最多的是NEVER但会额外设计一个“人工审核节点”让任务结果发送到企业微信或飞书由人确认后再对外发布。AutoGen本身不强制你这么做但做To B项目时把人工审核放在“生成”和“发布”之间能规避掉很多不可控风险。如果你希望调试时逐步观察可以临时把human_input_mode设为ALWAYS它会每一步都问你要不要输入虽然烦但是能非常直观地看到每个Agent的决策依据。4. 实战案例搭一个“需求分析代码实现”双Agent流水线4.1 场景设定让一个Agent做规划一个Agent写代码实战是最好的学习方式。我设计了一个典型场景用户给出一串数字要求Agent完成统计分析并输出结论。这个任务看起来简单但正好覆盖“规划、生成代码、执行代码、总结反馈”四个关键环节。角色分工如下Planner负责拆解需求把“求均值、中位数、众数”这些目标整理成步骤不写代码。Coder负责根据Planner的步骤写Python代码代码必须放在Markdown代码块中方便UserProxyAgent识别并执行。UserProxyAgent不参与方案讨论只负责执行代码块把执行结果回传给Coder。通过GroupChat把三个角色拉进一个群GroupChatManager决定下一步谁发言。这种结构很接近一个迷你数据团队。4.2 完整可运行的GroupChat示例下面是可以直接运行的代码。运行前请先在当前目录创建一个work文件夹用于存放每次生成的临时脚本。import autogen llm_config { config_list: [ { model: gpt-4o-mini, api_key: sk-你的密钥, base_url: https://api.openai.com/v1 } ], temperature: 0.2, timeout: 120, } user_proxy autogen.UserProxyAgent( nameuser_proxy, human_input_modeNEVER, max_consecutive_auto_reply5, code_execution_config{work_dir: work, use_docker: False}, is_termination_msglambda msg: TERMINATE in msg.get(content, ), ) planner autogen.AssistantAgent( nameplanner, system_message你是需求规划师负责拆解用户目标给出清晰的执行步骤。你只输出步骤不写代码。, llm_configllm_config, ) coder autogen.AssistantAgent( namecoder, system_message你是Python程序员。根据planner的步骤编写代码代码放在markdown代码块中。执行结果返回后根据结果判断是否需要修改代码。任务总结完成后最后单独回复TERMINATE。, llm_configllm_config, ) groupchat autogen.GroupChat( agents[user_proxy, planner, coder], messages[], max_round12, ) manager autogen.GroupChatManager( groupchatgroupchat, llm_configllm_config, ) user_proxy.initiate_chat( manager, message统计列表[3, 1, 4, 1, 5, 9, 2, 6]的均值、中位数和众数并给出简要结论。, )代码跑起来后你会看到GroupChatManager不断选择发言人。一开始Planner先输出步骤然后Coder写代码UserProxyAgent从work目录执行并返回结果Coder再总结最后输出TERMINATE。这里有一个很关键的设计Coder的system_message里明确写了“任务总结完成后最后单独回复TERMINATE”。这比依赖max_round硬性截断要优雅得多。因为前者是模型“主动认为任务完成了”后者是“不管完没完成到轮数就切断”。4.3 运行结果观察与参数调整思路第一次运行可能不会顺利常见现象有Planner说了很多废话、Coder不写Markdown代码块、UserProxyAgent找不到生成的文件。这些都可以通过调整system_message解决不要急着改代码逻辑。如果发现Coder生成的代码风格经常变把temperature从0.7调到0.2效果会立竿见影。如果发现Coder生成代码时爱解释一大段在system_message里加“代码块外不要解释”即可。运行完最好看一眼work目录里面有每次执行留下的.py文件。如果脚本有语法错误UserProxyAgent会返回错误信息给CoderCoder会自己修复。这个“自我纠错”过程是AutoGen最吸引人的地方但也要注意它可能反复修改多次还改不对所以max_round不能设得太大。我一般控制在10到15轮超过这个数大概率是逻辑出问题了而不是答案太复杂。5. 常见问题与排查心得5.1 对话停不下来终止条件是头等大事AutoGen项目里遇到最多的故障不是模型能力不行而是对话停不下来。两个AssistantAgent互相“客气”你一句我一句能聊到天荒地老。归根结底是没有设置好终止条件。我从机制层面帮你拆清楚终止手段有三个最好同时用上is_termination_msg定义什么样的消息代表“结束”。通常设置为消息内容里包含TERMINATE这个标记。max_consecutive_auto_reply限制同一个链路中自动连续回复的最大次数超过就强制停。max_round/max_turns限制整个群聊或双方对话的总轮数这是最后的保险丝。最优雅的做法是让每个Agent的system_message里都写清楚“当你认为任务已经完成时回复TERMINATE”。这句话不能省略也不能指望模型自己领悟。我在生产环境里的习惯是把is_termination_msg的判断逻辑写严一点比如只允许出现在纯文本末尾的TERMINATE算数避免模型在代码块里提到这个词就误触发。5.2 模型报错、上下文溢出与成本失控模型相关的问题是最耗时间的。我整理了一张排查表按出现频率排序现象可能原因处理办法401认证失败api_key错误或没有权限检查密钥确认环境变量是否被覆盖404模型不存在模型名拼错或当前接口不支持换成接口商支持的具体模型ID请求超时回复太长timeout太短调大timeout或限制输出max_tokens上下文长度超限多Agent历史消息累积太多精简system_message增加max_round控制定期清理历史费用飙升每个Agent都在调用大模型给简单角色用更小更便宜的模型复杂角色用强模型成本问题很多人一开始注意不到直到月底账单爆炸。AutoGen的机制决定了消息轮次越多token消耗越大。我常用的优化策略是执行工具结果的Agent用NEVER模式且不调LLM只负责执行和回传规划类Agent用小模型只有真正需要高质量推理的角色才配大模型。5.3 工具调用失败的几个隐蔽原因工具调用是AutoGen的高级玩法但坑也最多。我遇到过的问题是函数加载成功了LLM也说自己会调用但实际执行时总是报“Function get_weather not found”。排查之后发现问题出在register_for_execution没有被调用。很多人只注册了register_for_llm让模型知道了工具但没注册执行端UserProxyAgent根本找不到对应函数。还有一个隐蔽问题函数定义里用了*args或**kwargs导致LLM生成的参数格式不匹配。最稳妥的做法是只用带类型注解的明确参数。另外如果你用的模型本身不支持function calling比如某些精简版模型工具调用会退化成一段文本而不是结构化的调用指令。调试时可以在日志里查看收到的function_call字段如果一直是空的基本就是模型不支持换一个支持工具调用的模型即可。6. 从Demo到生产我的几点扩展经验6.1 给Agent加“记忆”从短对话到长任务默认情况下AutoGen的对话历史只存在于当前会话对象里项目一重启什么都忘了。要做长期记忆我采用的方式是把每次任务的关键结论写成摘要存入向量数据库。下次任务开始时先把相关历史摘要拼接到某个Agent的system_message里。实现上不复杂核心是“先总结、再存、再加载”。比如数据分析任务结束后让总结Agent输出一段JSON包含数据源、统计口径、最终结论。下一次用户提出类似问题时系统先从向量库检索到这段JSON再注入到Planner的语境里。这样Agent就能基于历史经验继续工作而不是每次从零开始。6.2 用FastAPI包一层对外服务生产环境不可能直接让用户调用initiate_chat一般要套一层HTTP接口。我当时用FastAPI包了一个异步任务接口把请求放到队列里后台Worker运行AutoGen会话再把结果写回。接口长这样from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class TaskRequest(BaseModel): task: str app.post(/run_task) async def run_task(req: TaskRequest): # 这里应该在后台任务队列中执行避免阻塞 result run_autogen_task(req.task) return {result: result}这里有一个容易被忽略的性能问题AutoGen会话是有状态的不适合直接塞进无状态HTTP服务里。你要么为每个会话维护一个独立对象要么设计成“用户每次调用创建新会话”。我倾向于后者因为多Agent长对话占用的内存和token都不小服务化之后必须考虑超时和并发控制。6.3 评估多Agent系统的输出质量多Agent系统跑得再热闹也得有质量标尺。我一般分两步走先用硬性规则做自动化检查比如输出是否包含必须的字段、代码能否运行、数值是否在合理范围内再用一个独立的“评委Agent”对结果打分从逻辑、完整性、可执行性三个维度给出分数和改进意见。这个方法听起来简单但有一个前提取决于评委Agent必须使用不同于生产任务的系统提示词不能和协作Agent混在一起。我见过有人让同一个模型又当选手又当裁判那一轮输出的结果往往自卖自夸参考价值很低。所以我的最终建议是在使用AutoGen时不要让一个Agent“既做运动员又做裁判”。把评估角色单独拆出来哪怕用便宜模型效果也比自我评价靠谱得多。这个原则几乎适用于所有多Agent系统。最后分享一个我自己反复验证过的小技巧在实际项目里每个Agent的system_message开头写清楚“你是做什么的”结尾写清楚“任务做完怎么结束”中间只留干货。很多看似玄学的不稳定问题其实就是人设含糊导致的。AutoGen框架已经替你解决了对话编排的脏活剩下要做的就是把每个Agent的角色边界定义到足够清晰。
企业数字化 ERP 产品动态
相关推荐
Seed-2.1-pro-0915:4.2B参数模型的推理体验重构 1. 这不是“又一个大模型”,而是一次被低估的推理体验重构“本来没抱期望的 Seed-2.1-pro-0915,居然能当主力模型用了”——这句话我第一次看到时,正卡在本地部署一个7B参数模型的量化环节,显存反复爆掉,生成速度慢得像… · 2026/11/5 16:27:57
三菱FX编程口通信实践:Qt串口助手与协议编解码 简介:FX_serial_asst.rar 是一份面向工业自动化上位机开发初学者与 PLC 通信实践者的 Qt 工程源码,围绕三菱 FX3U 编程口串行通信展开,可用于搭建上位机连接、数据采集与寄存器读写等练习场景。压缩包共 7 个文件,约 12KB… · 2026/11/5 20:18:15
FX PLC编程口调试助手:Qt串口组帧校验与批量轮询 简介:面向Qt上位机与三菱FX3U PLC编程口通信学习的示例工程,适合工业自动化方向的上位机开发者、PLC初学者及需要理解串行通信流程的工程人员参考。压缩包共7个文件,约12KB,以cpp、h源码为主,另有ui界面与pro工程配置&… · 2026/11/5 19:00:04
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07