从AI智能体到多智能体协作

1. AI智能体 什么是智能体? 智能体(AI Agent)是指能够感知环境、自主决策并执行任务以实现特定目标的智能实体 。它以大模型为智能底座,具备自主感知、理解、规划、决策、记忆和行动的能力,能够自动化执行复杂任务 智能体 = LLM + Prompt + 知识库(Retrievers, optional) + Tools(optional) + Memory(optional) + chain(optional) 可以参考LangChain 实现 1.1 RAG(知识库) 1.2 MCP 1.2.1 组成部分 Tools Resources Prompts 1.2.2 协议 stdio SSE(已废弃) Streamable HTTP 重要说明 Streamable HTTP是有状态的(也支持无状态) 引入Mcp-Session-Id和Last-Event-ID,支持断点续传 1.2.3 调试工具 npx -y @modelcontextprotocol/inspector 1.2.4 体系中的位置 1.2.5 演示 1.3 记忆(Memory) Mem0: Building Production- Ready AI Agents with Scalable Long-Term Memory cursor也引入Memory 2. 多智能体协作 2.1 原因 2.1.1 解决 认知过载和信息过载问题 ...

November 5, 2025 · 1 min

大语言模型中的ReAct框架

1.简介 请注意,这里的ReAct并非指前端开发框架react,而是由reasoning(推理)和acting(行动)两个英文单词组合而成的术语。ReAct是一种创新的通用框架, 它将语言模型中的推理与行动相结合,旨在高效解决各类复杂的语言推理及决策任务。 2. ReAct实际过程 while 未达成目标 { // 1. 调用LLM进行推理 reasoning(); // 2. 调用外部工具采取行动,并将行动结果,放入与LLM交互的上下文中,作为LLM推理的素材 acting(); } 其本质是执行多轮 reasoning + acting,把acting的结果放入与LLM交互的上下文中,作为LLM下一轮推理的素材 ReAct克服了链式思考推理中普遍存在的幻觉和错误传播问题,生成了更具可解释性的类似人类思考过程的任务解决轨迹, 并能够提高大型语言模型在多种任务上的准确性。 3. 示例 3.1 迷宫说明 为了说明ReAct框架,萌叔构建了一个迷宫 🧱🧱🧱🧱🧱🧱🧱 🧱😎🛣️🧱🧱🧱🧱 🧱🧱🛣️🛣️🛣️🧱🧱 🧱🧱🧱🧱🛣️🧱🧱 🧱🧱🛣️🛣️🛣🧱🧱 🧱🧱🧱🧱🛣️🏁🧱 🧱🧱🧱🧱🧱🧱🧱 player当前的位置是(1,1), 终点的位置为(5,5) 每次可以移动一步,只能是下面4种动作之一 (1, 0) (0, 1) (-1, 0) (0, -1) 限制 player的视野是有限的,仅能观察到其周围的局部区域。 形如 🧱🧱🧱🏿🏿🏿🏿 🧱😎🛣️🏿🏿🏿🏿 🧱🧱🛣️🏿🏿🏿🏿 🏿🏿🏿🏿🏿🏿🏿 🏿🏿🏿🏿🏿🏿🏿 🏿🏿🏿🏿🏿🏿🏿 🏿🏿🏿🏿🏿🏿🏿 正因视野受限,player在迷宫中的行进过程只能是探索式的: 每走一步,便观察一下周围环境,再据此尝试下一步的行动,如此反复,直至抵达终点。 3.2 代码片段 完整代码 example # 初始化 Kimi 模型 llm = ChatOpenAI( model_name="gpt-3.5-turbo", # 或其他 Kimi 模型名 # openai_api_base=kimi_api_base, temperature=0.1 ) agent = initialize_agent( tools=[move_tool, observe_tool], # 工具列表 llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 指定智能体类型 max_iterations = 200, verbose=True # verbose=True 可以打印出详细的推理过程 ) # 3. 运行智能体 - 使用新的invoke方法 question = """ 你作为player当前处于一个 7*7的 二维矩阵中,'X'是你的位置,'#' 都是墙体,只有 '0' 是通道, '-' 表示未知 初始坐标为(1,1),你需要设法到达(5,5) 注意: 只能沿着通道移动 你每次可以移动一步,只能是下面4种动作之一 (1, 0), (0, 1), (-1, 0), (0, -1) 请你给出一个完整的移动轨迹,如果可以尝试推测一下矩阵的情况 """ response = agent.invoke({"input": question}) print(response) 注意: 复杂的任务可能需要修改 max_iterations ...

October 10, 2025 · 6 min

小智机器人

1.引言 最近有一个很火的开源项目小智机器人-xiaozhi-esp32。 类似于小度音箱和小爱音箱,你可以和小智进行语音沟通,但是小智的服务端对接了大模型(千问、DeepSeek等)。 所以它是一个智能体,可以和用户进行更丰富和有趣的对话。 2.特点 2.1 开源MIT协议,可以用于商用 2.2 支持语音唤醒 需要特定硬件 2.3 基于流式 ASR + LLM + TTS 架构的语音交互 2.4 OLED / LCD 显示屏,支持表情显示 2.5 设备端为ESP32-C3、ESP32-S3、ESP32-P4 芯片平台 价格低廉(最便宜大概50元左右,一般情况小于200元) 立创开发板 立创的这块开发板还带有摄像头,也就是说可以进行图像识别。爱动手的可以买元器件自己装,懒人可以直接在淘宝和京东上买成品。 2.6 后端也有开源实现 xinnan-tech/xiaozhi-esp32-server Python 服务器 joey-zhou/xiaozhi-esp32-server-java Java 服务器 AnimeAIChat/xiaozhi-server-go Golang 服务器 其实虾哥的版本,只开源了客户端和通讯协议,Server的实现都来自第三方 2.7 支持MCP扩展大模型能力 可以实现智能家居控制、PC桌面操作、知识搜索、邮件收发等 小智原生已经带有播放音乐、天气预报、新闻等功能 为了将MCP服务接入小智,萌叔开发了 vearne/xiaozhi-mcp-pipe,欢迎使用。 2.8 有记忆功能 参考 mem0 和 mem0-research 3. 原理&技术 3.1 原理 ESP32芯片的性能非常弱,几百MHz,<1MB的内存,因此几乎所有的功能都是在服务端实现的。 1)【Client】ESP32硬件通过麦克风采集原始音频数据,通过Websocket协议传到Server 2)【Server】对音频数据进行语音识别,转换为文字 3)【Server】使用文字与大模型进行交互,得到回答(文字),回答可能包含指令(控制与之连接的其他外围设备或IoT设备,例如智能灯泡、传感器等) 4)【Server】文字通过TTS转成音频数据,通过Websocket协议再发到ESP32硬件 5)【Client】ESP32硬件通过扬声器播放给用户 3.2 技术 以xinnan-tech/xiaozhi-esp32-server为例说明 LLM 语言模型 使用方式 支持平台 免费平台 openai 接口调用 阿里百炼、火山引擎豆包、深度求索、智谱ChatGLM、Gemini 智谱ChatGLM、Gemini ollama 接口调用 Ollama - dify 接口调用 Dify - fastgpt 接口调用 Fastgpt - coze 接口调用 Coze - 实际上,任何支持 openai 接口调用的 LLM 均可接入使用。 ...

August 13, 2025 · 1 min

玩转MCP(2)-原理篇

1. 引言 这篇文章萌叔来谈谈MCP的协议的一些重要概念,以及它是如何和大模型进行交互的。 2. MCP架构 2.1 Host Host进程充当容器和协调器,它要负责启动MCP-Client,使用Client与对应的MCP-Server进行交互。 通常而言Host with Client就是第一个AI Agent,在其中必然会涉及与大模型的交互。 2.2 Client Client由Host创建,每个Client与特定的Server具有一对一的关系 2.3 Server 通过 MCP 原语暴露resource、tool和prompt, Server可以运行在本地或者是远程服务 3. MCP协议的内容 MCP协议的核心诉求是对外说明Server具有什么能力,Client该如何使用这种能力,每种能力其实都被抽象成了某个tool,类似于函数。 为了更好的使用tool,MCP引入了resource和prompt, 3.1 resource resource一般是可访问的静态或动态数据源,笔者的理解,resource是领域相关的知识库 3.2 prompt 用户或系统提供给模型的指令或上下文输入,用于引导模型行为。 大部分情况下,只提供tool即可,注意: 一个server通过会提供多个tool。 Client和Server采用JSON-RPC 2.0协议。 3.3 Client要获取tool信息通常会发起 ListTools 指令 Request { &quot;method&quot;: &quot;tools/list&quot;, &quot;params&quot;: { &quot;_meta&quot;: { &quot;progressToken&quot;: 3 } }, &quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;id&quot;: 3 } Response { &quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;id&quot;: 3, &quot;result&quot;: { &quot;tools&quot;: [{ &quot;name&quot;: &quot;remember&quot;, &quot;description&quot;: &quot;Retrieve historical chat records between users and LLM.&quot;, &quot;inputSchema&quot;: { &quot;properties&quot;: { &quot;keyword&quot;: { &quot;description&quot;: &quot;key word&quot;, &quot;title&quot;: &quot;Keyword&quot;, &quot;type&quot;: &quot;string&quot; }, &quot;start_date&quot;: { &quot;anyOf&quot;: [{ &quot;type&quot;: &quot;string&quot; }, { &quot;type&quot;: &quot;null&quot; }], &quot;default&quot;: null, &quot;description&quot;: &quot;Start date in &#039;YYYYMMDD&#039; format.When empty, automatically uses the date 3 months before today&quot;, &quot;examples&quot;: [&quot;20250620&quot;], &quot;title&quot;: &quot;Start Date&quot; }, &quot;end_date&quot;: { &quot;anyOf&quot;: [{ &quot;type&quot;: &quot;string&quot; }, { &quot;type&quot;: &quot;null&quot; }], &quot;default&quot;: null, &quot;description&quot;: &quot;End date in &#039;YYYYMMDD&#039; format.When empty, automatically uses today&#039;s date&quot;, &quot;examples&quot;: [&quot;20250710&quot;], &quot;title&quot;: &quot;End Date&quot; }, &quot;max_message_count&quot;: { &quot;default&quot;: 200, &quot;description&quot;: &quot;The maximum number of messages that can be returned&quot;, &quot;minimum&quot;: 1, &quot;title&quot;: &quot;Max Message Count&quot;, &quot;type&quot;: &quot;integer&quot; } }, &quot;required&quot;: [&quot;keyword&quot;], &quot;type&quot;: &quot;object&quot; }, &quot;outputSchema&quot;: { &quot;properties&quot;: { &quot;result&quot;: { &quot;title&quot;: &quot;Result&quot;, &quot;type&quot;: &quot;string&quot; } }, &quot;required&quot;: [&quot;result&quot;], &quot;title&quot;: &quot;_WrappedResult&quot;, &quot;type&quot;: &quot;object&quot;, &quot;x-fastmcp-wrap-result&quot;: true } }] } } 3.4 Client使用某个tool时,会使用 callTool 指令 Request { &quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;method&quot;: &quot;tools/call&quot;, &quot;id&quot;: &quot;tool-call-1754015372815&quot;, &quot;params&quot;: { &quot;name&quot;: &quot;get_datetime&quot;, &quot;arguments&quot;: { &quot;format&quot;: &quot;date_jp&quot; }, &quot;_meta&quot;: { &quot;progressToken&quot;: 0 } } } Response { &quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;id&quot;: &quot;tool-call-1754015372815&quot;, &quot;result&quot;: { &quot;content&quot;: [{ &quot;type&quot;: &quot;text&quot;, &quot;text&quot;: &quot;2025年08月01日&quot; }], &quot;isError&quot;: false } } 4.与大模型的交互 我们已经通过MCP协议获知了MCP Server所能提供的能力,现在需要把这些信息告诉大模型, 让大模型依据上下文以及MCP Server提供的能力,做出决策,发出指令。 ...

August 5, 2025 · 5 min

玩转MCP(1)-使用篇

1. 引言 MCP可以说是function calling的升级版,它使得大语言模型可以方便的整合和具有工具能力。 简单而言,LLM只是一个大脑,它只能思考。 但是当我们给它提供了MCP之后,它可以轻易的获得各种能力, 宛如给他安上了手和腿,它可以行走了,并对外部世界施加影响。 2. 一些MCP 聊天App 萌叔使用的是 daodao97/chatmcp chatmcp可以很方便的集成其它mcp工具,这里介绍几个MCP 2.1 mcp-searxng ihor-sokoliuk/mcp-searxng SearXNG 是一款免费的互联网元搜索引擎,它聚合了来自各种搜索引擎和服务的结果。 用户既不会被追踪,也不会被画像。传送门 使用mcp-searxng,使得大模型可以通过搜索引擎获取信息。 配置方式 { &quot;mcpServers&quot;: { &quot;searxng&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [ &quot;-y&quot;, &quot;mcp-searxng&quot; ], &quot;env&quot;: { &quot;SEARXNG_URL&quot;: &quot;YOUR_SEARXNG_INSTANCE_URL&quot; } } } } Tools searxng_web_search 利用搜索引擎进行检索 web_url_read 从某个URL读取内容 2.2 mcp-datetime ZeparHyfar/mcp-datetime 很多大模型没有时间概念,这会导致他在处理问题时,出现时间错误,mcp-datetime可以 以各种格式获取当前日期和时间。 配置方式 { &quot;mcpServers&quot;: { &quot;mcp-datetime&quot;: { &quot;command&quot;: &quot;uvx&quot;, &quot;args&quot;: [&quot;mcp-datetime&quot;] } } } Tools get_datetime 2.3 mcp-server-chart antvis/mcp-server-chart antvis/mcp-server-chart是蚂蚁集团出品的图表工具。 mcp-server-chart生成的图片已经使用CDN加速,与大模型交互只传递URL,可以极大的减少token开销。 配置方式 { &quot;mcpServers&quot;: { &quot;mcp-server-chart&quot;: { &quot;command&quot;: &quot;npx&quot;, &quot;args&quot;: [ &quot;-y&quot;, &quot;@antv/mcp-server-chart&quot; ] } } } Tools 可以画25种图表 ...

July 27, 2025 · 2 min

一文了解RAG(检索增强型生成)

在这篇文章中,萌叔将介绍RAG技术。 将它与传统的搜索引擎进行对比,并介绍一个完整的RAG实现–lightRAG,详述其技术细节。 1. 传统搜索 传统搜索通常基于倒排索引来进行搜索 1.1 倒排索引 倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案, 是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。 倒排索引是Term到DocID的映射。 1.2 搜索语句示例 Lucene针对某个字段进行搜索样例 title:hello world 就意味着,搜索title为hello,或者包含title关键字的文档 伪代码形如 doc.title contains &quot;hello&quot; OR doc.title contains &quot;world&quot; 假定 “hello”-> [1, 5, 8] “world”-> [5, 8, 10, 12] 然后搜索引擎对2个doc ID集合的求并集,并对所有文档进行打分,选出分数最高的前N个文档。 2. RAG RAG (检索增强生成) 是一种人工智能技术,它结合了信息检索和生成式模型的功能, 以提高生成文本的准确性和相关性。 RAG 先从外部知识库中检索相关信息,然后结合这些信息,使用生成式模型, 生成更准确、更有上下文相关的文本。 提到RAG,需要先聊一聊Embedding models 2.1 Embedding models 2.1.1 高维向量表征文本 嵌入式模型,可以把一段文本转换为纯数值的高维向量 通过嵌入模型(如bge-m3)将文本转换为1024维的数值向量,这个向量包含了文本的语义特征 curl --location &#039;http://192.168.100.2:21434/api/embed&#039; \ --header &#039;Content-Type: application/json&#039; \ --data &#039;{ &quot;model&quot;: &quot;bge-m3:latest&quot;, &quot;input&quot;: &quot;这个故事的主题是什么?&quot; }&#039; 2.1.2 向量距离反映语义相似度 当两个向量在向量空间中的距离越近(通常用余弦相似度或欧氏距离衡量) 说明它们对应的文本在语义上越相似 例如"猫"和"猫咪"的向量会比"猫"和"汽车"的向量更接近 ...

June 27, 2025 · 2 min

推荐一个AI的代理服务(收费)

引言 国内这两年崛起的AI大模型,Kimi和Deepseek,已经足够满足日常的使用需要。 但如果你想体验OpenAI,或者想调用dall-e-3模型画图,或者使用国外的其它音频和视频模型。 你可能需要科学上网,并且可能需要使用信用卡进行注册。其实还是非常不方便。 这里推荐一个AI的反向代理服务: openai-hk 这个服务应该是国人开发的,有QQ客服支持 优势 1.支付方便 使用微信支付,不用包月,按照对接口的实际调用量收费。 从个人使用看,计费即时且精准。 2.不需要科学上网,国内可以随意使用 3. 无限速 因为采用账号池多账号轮询的方案,所以没有API的调用频率限速 4. 支持广泛 以下只列出部分 4.1 文字 gpt-3.5 gpt-4o o1-mini o1-preview gemini claude 4.2 图像 dall-e-3 Midjourney 4.3 音乐 suno udio 4.4 视频 kling 可灵 pika 参考 模型定价列表 5. 文档清晰 openai-hk 文档更新比较快, 新的模型也能很快接入。 另外文档中也介绍了社区一些常用的AI软件,可以作为借鉴和参考。 总结 使用openai-hk 减少了对接的烦恼, 支付更方便,计费合理。适合AI研究人员以及想体验OpenAI等产品的用户。 有兴趣的朋友可以试一下。 作者: vearne 文章标题: 推荐一个AI的代理服务(收费) 发表时间: 2025年2月12日 文章链接: https://vearne.cc/archives/40263 版权说明: CC BY-NC-ND 4.0 DEED

February 12, 2025 · 1 min

介绍OpenAI新发布的Operator

前言 2025年1月23日 OpenAI发布了新的Agent: Operator。 这篇文章将分为2个部分 第1部分,萌叔全文翻译OpenAI的官方介绍资料 第2部分,会基于萌叔自己的理解,介绍一下Operator功能要点和可能的实现思路 废话不多说,进入正题 第1部分 针对新的Agent预览版的研究概述,此Agent可以使用它自己的浏览器来执行用户提出的任务。 今天,我们发布了Operator(在新窗口中打开),一个可以访问网页并为你执行任务的智能代理。 它使用自己的浏览器查看网页,并通过输入、点击和滚动与页面交互。 目前,它是一个研究预览版,这意味着它仍有限制,并将根据用户反馈不断改进。 Operator 是我们推出的首批代理之一,这类 AI 能够自主为你完成任务——你只需指定任务,它就会执行。 Operator 可以处理各种重复性的浏览器任务,例如填写表单、订购杂货,甚至创建梗图。 它能够使用人们日常交互的界面和工具,这不仅拓宽了 AI 的应用范围,还能帮助用户节省日常任务的时间,同时为企业提供新的互动机会。 为了确保安全并逐步推广,我们将从小范围开始。 从今天起,Operator 向美国的 Pro 用户开放, 用户可以在 [operator.chatgpt.com](opens in a new window) 访问。 这个研究预览版让我们能够从用户和更广泛的生态系统中学习,不断优化和改进。 我们计划未来将其扩展到 Plus、Team 和 Enterprise 用户,并将这些能力集成到 ChatGPT 中。 Operator 的工作原理 Operator 由一种名为 Computer-Using Agent (CUA) 的新模型驱动。CUA 结合了 GPT-4o 的视觉能力, 并通过强化学习增强推理能力,使其能够与图形用户界面(GUI)交互——即用户在屏幕上看到的按钮、菜单和文本框。 Operator 可以“看见”(通过截图)并“交互”(使用鼠标和键盘能执行的所有操作)网页,因此无需定制 API 集成,就能在网页上执行任务。 如果遇到挑战或出现错误,Operator 能利用其推理能力进行自我纠正。而当它陷入困境并需要帮助时,会将控制权交还给用户,确保流畅且协作的体验。 尽管 CUA 仍处于早期阶段并存在一些限制,但它在 WebArena 和 WebVoyager 这两个关键的浏览器使用基准测试中创造了新的最先进基准成绩。 你可以在我们的研究博客文章中了解更多关于评估方法及 Operator 背后的研究。 ...

February 6, 2025 · 2 min

AI预测模型工程化性能调优

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 前言 最近经历了一次AI预测模型工程化性能调优,这里分享出来,希望对大家有所启发。 模型是keras训练的神经网络预测模型,输入一段文本,输出文本的分类结果。为了对外提供服务,已经将模型用 gunicorn + flask对模型进行封装,提供http接口。 环境 OS:ubuntu 18.04 CPU:32核 内存: 256GB 显卡: Tesla P100 前期的压测结果 wrk -t4 -c100 -d30s --script=post.lua --latency http://localhost:8080/api/predict 类型 CPU GPU QPS 2.4 12.41 2. 观察性能指标 QPS过低不能满足业务方的要求,所以萌叔尝试对封装好的服务进行调优。 仔细观察了各项系统指标之后(cpu、load、磁盘IO、内存使用率、虚拟内存页换入换出) 萌叔发现了一个疑点。 2.1 keras 使用CPU 在压测的过程中,CPU的使用率只能达到70%左右 2.2 keras 使用GPU 在压测的过程中,GPU的使用率只能达到30%左右 神经网络模型对文本分类的预测过程,实际就是将输入文本转换成数值,再带入神经网络,进行的2次计算的过程。这是一个计算密集型的场景,性能瓶颈应该是CPU/GPU; 如果CPU、GPU没有打满,则说明性能仍有提升的空间。 3. 调优 3.1 初始协程模式 web使用Flask开发,启动脚本如下: gunicorn -k gevent -t 300 -b 0.0.0.0:8080 run:app gunicorn有几种工作模式 sync (进程模式) eventlet gevent (协程模式) tornado gthread gevent是一种协程模式,它的特点是在请求的处理过程中有IO调用时(或者当前的协程主动让出CPU),会自动触发切换上下文切换,启动另一个协程,提高CPU的利用率。它特别适用于IO密集型的场景,尤其是对于处理过程中有对数据库的调用,第三方服务调用的情况。 ...

March 17, 2020 · 2 min