当前位置: 首页 > news >正文

python机器人Agent编程——多Agent框架的底层逻辑(上)

目录

  • 一、前言
  • 二、两个核心概念
    • 2.1 Routines
      • (1)清晰的Prompt
      • (2)工具调用json schema自动生成
      • (3)解析模型的toolcall指令
      • (4)单Agent的循环决策与输出
  • PS.扩展阅读
    • ps1.六自由度机器人相关文章资源
    • ps2.四轴机器相关文章资源
    • ps3.移动小车相关文章资源
    • ps3.wifi小车控制相关文章资源

一、前言

现在大语言模型中的第一性原理:Scaling laws正在失效的论调四起,大模型大有迎来瓶颈期的感觉。然而,世界在AI领域都在较劲,虚虚实实,不可信其有也不可信其无。但是有个方向是一致的,那就是多Agent的路线。无论是AI头部企业OpenAI、Google、Facbook、Microsoft还是业界大佬Andrew FeiFeiLi、Michael Winikoff等都对多Agent技术路线作了充分的肯定。本文是对阅读Ilan Bigio的《Orchestrating Agents: Routines and Handoffs》的回炉理解和分享,其文章平实未有半点修饰,基础阐述了多Agent协作的底层算法逻辑。而OpenAI推出的教育框架Swarm就是源于此Idea.
在这里插入图片描述

二、两个核心概念

多Agent协作Idea引入了概念: routineshandoffs,通过基于这两个概念的python代码实现,完成了多个智能体间的转移、协作和完整的用户交互。

2.1 Routines

这个词通过体会,可以理解为简单的机械的任务列表。通过向LLM描述一些比较清晰的,简单的先后任务Prompt,和提供完成这些任务表所需的function或者tools,实现单个Agent完成某项“技能”的能力。这里的核心要点主要有两个:

(1)清晰的Prompt

需要向LLM提供一个较为明确,没有歧义容易操作的system的Promt描述,这个相当于对一个社会上的普通人,雇用后,对其进行业务的培训,让他/她明白这个岗位的职责和操作步骤,使其成为一个公司的特定岗位的业务员。

system_message = ("You are a customer support agent for ACME Inc.""Always answer in a sentence or less.""Follow the following routine with the user:""1. First, ask probing questions and understand the user's problem deeper.\n"" - unless the user has already provided a reason.\n""2. Propose a fix (make one up).\n""3. ONLY if not satesfied, offer a refund.\n""4. If accepted, search for the ID and then execute refund."""
)

(2)工具调用json schema自动生成

LLM现在都支持外部的tool/函数调用了,而且很多都是遵循OpenAi的规范格式,就是json schema格式,可以认为是大模型的结构化输出通讯协议的一种。

大模型JSON Schema格式是一种用于描述和验证JSON数据结构的规范。它定义了JSON数据中各个元素的类型、格式、约束和关系,确保了数据的一致性和可靠性。在软件开发、API设计以及数据交换过程中,JSON Schema发挥着重要作用(来自网络的定义,不知道说些什么)
“协议”的格式如下:

{"type": "function","function": {"name": "sample_function",#工具名称"description": "This is my docstring. Call this function when you want.",#工具描述"parameters": {#工具行参数描述"type": "object","properties": {"param_1": {#第1个参数"type": "string"},"param_2": {#第2个参数"type": "string"},"the_third_one": {#第3个参数"type": "integer"},"some_optional": {#可选参数"type": "string"}},"required": ["param_1","param_2","the_third_one"] {#必须传入的参数}}
}

其实就是对应的一个python的普通的funciton:

def sample_function(param_1, param_2, the_third_one: int, some_optional="John Doe"):"""This is my docstring. Call this function when you want."""print("Hello, world")

区别与需要手动定义这个JSON Schema,可以用一个python函数自动生成实现JSON Schema,这个也是用到了swarm框架里了:

import inspect
#实现一个自动JSON Schema生成
def function_to_schema(func) -> dict:type_map = {str: "string",int: "integer",float: "number",bool: "boolean",list: "array",dict: "object",type(None): "null",}try:signature = inspect.signature(func)except ValueError as e:raise ValueError(f"Failed to get signature for function {func.__name__}: {str(e)}")parameters = {}for param in signature.parameters.values():try:param_type = type_map.get(param.annotation, "string")except KeyError as e:raise KeyError(f"Unknown type annotation {param.annotation} for parameter {param.name}: {str(e)}")parameters[param.name] = {"type": param_type}required = [param.namefor param in signature.parameters.values()if param.default == inspect._empty]return {"type": "function","function": {"name": func.__name__,"description": (func.__doc__ or "").strip(),"parameters": {"type": "object","properties": parameters,"required": required,},},}

以上的自动生成函数适合任何一个普通函数:

def add(a:int,b:int,isadd=True):"""this funciton is used to do add method when isadd is true or minuse method when isadd is false return the result"""if isadd:return a+belse:return a-bschema =  function_to_schema(add)
print(json.dumps(schema, indent=2))

打印结果如下:
在这里插入图片描述
有了以上两个法宝后就可以轻松实现agent的外部函数调用了:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 15 16:47:17 2024@author: 18268
"""import inspect
import jsondef function_to_schema(func) -> dict:type_map = {str: "string",int: "integer",float: "number",bool: "boolean",list: "array",dict: "object",type(None): "null",}try:signature = inspect.signature(func)except ValueError as e:raise ValueError(f"Failed to get signature for function {func.__name__}: {str(e)}")parameters = {}for param in signature.parameters.values():try:param_type = type_map.get(param.annotation, "string")except KeyError as e:raise KeyError(f"Unknown type annotation {param.annotation} for parameter {param.name}: {str(e)}")parameters[param.name] = {"type": param_type}required = [param.namefor param in signature.parameters.values()if param.default == inspect._empty]return {"type": "function","function": {"name": func.__name__,"description": (func.__doc__ or "").strip(),"parameters": {"type": "object","properties": parameters,"required": required,},},}def add(a:int,b:int,isadd=True):"""this funciton is used to do add method when isadd is true or minuse method when isadd is false return the result"""if isadd:return a+belse:return a-bschema =  function_to_schema(add)
print(json.dumps(schema, indent=2))from openai import OpenAI
# 定义模型  
MODEL = "llama3.2:latest"  
ollama_client = OpenAI(base_url = 'http://localhost:11434/v1',api_key='None', # required, but unused
)
messages = []tools = [add]
tool_schemas = [function_to_schema(tool) for tool in tools]response = ollama_client.chat.completions.create(model=MODEL,messages=[{"role": "user", "content": "1加1等于几"}],tools=tool_schemas,)
message = response.choices[0].messageprint(message.tool_calls[0].function)

最后模型根据用户输入"1加1等于几",会去查找工具的tool_schemas,并自主决定了调用add这个工具,输出如下:
在这里插入图片描述
这个是openai自定义的一个type:openai.types.chat.chat_completion_message_tool_call.Function

(3)解析模型的toolcall指令

这个就是当模型认为要调用工具时,会吐出要调用的某个函数的信息:
在这里插入图片描述

,包含一个function属性及对应名字和参数。接下来就是根据它,去调用实体的函数:

tools=[add]
tools_map = {tool.__name__: tool for tool in tools}#这里搞了一个tools_map,用于存多个funciton的名字def execute_tool_call(tool_call, tools_map):#根据openai的LLM返回格式,调用相应函数name = tool_call.function.nameargs = json.loads(tool_call.function.arguments)print(f"Assistant: {name}({args})")# call corresponding function with provided argumentsreturn tools_map[name](**args)
execute_tool_call(message.tool_calls[0], tools_map)

如下调用了add函数,执行并输出了结果。
在这里插入图片描述

(4)单Agent的循环决策与输出

以上实现了LLM自动调用工具库的function,如果需要多个工具库的调用,还需要做一个while循环,首先需要将前一个工具执行输出结果输入给LLM,然后再让LLM对照routines的任务表判断,是否还要继续调用其它工具,直到它认为可以输出结果返给user为止:


def run_full_turn(system_message, tools, messages):num_init_messages = len(messages)messages = messages.copy()while True:# turn python functions into tools and save a reverse maptool_schemas = [function_to_schema(tool) for tool in tools]tools_map = {tool.__name__: tool for tool in tools}# === 1. get openai completion ===response = ollama_client.chat.completions.create(model=MODEL,#或者qwen2.5等本地模型messages=[{"role": "system", "content": system_message}] + messages,tools=tool_schemas or None,)message = response.choices[0].messagemessages.append(message)if message.content:  # print assistant responseprint("Assistant:", message.content)if not message.tool_calls:  # if finished handling tool calls, breakbreak# === 2. handle tool calls ===for tool_call in message.tool_calls:result = execute_tool_call(tool_call, tools_map)result_message = {"role": "tool","tool_call_id": tool_call.id,"content": result,}print("result_message:",result_message)messages.append(result_message)# ==== 3. return new messages =====return messages[num_init_messages:]

PS.扩展阅读

————————————————————————————————————————

对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询

ps1.六自由度机器人相关文章资源

(1) 对六自由度机械臂的运动控制及python实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及python算法
在这里插入图片描述

ps2.四轴机器相关文章资源

(1) 文章:python机器人编程——用python实现一个写字机器人
在这里插入图片描述

在这里插入图片描述

(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播

(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
在这里插入图片描述
在这里插入图片描述

ps3.移动小车相关文章资源

(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
在这里插入图片描述
在这里插入图片描述

(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ps3.wifi小车控制相关文章资源

web端配套资源源代码已经上传(竖屏版),下载地址
仿真配套资源已经上传:下载地址
web端配套资源源代码已经上传(横屏版),下载地址

相关文章:

python机器人Agent编程——多Agent框架的底层逻辑(上)

目录 一、前言二、两个核心概念2.1 Routines(1)清晰的Prompt(2)工具调用json schema自动生成(3)解析模型的toolcall指令(4)单Agent的循环决策与输出 PS.扩展阅读ps1.六自由度机器人相…...

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日,渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人,莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院(庚贤堂中医药…...

学习日志011--模块,迭代器与生成器,正则表达式

一、python模块 在之前学习c语言时,我们学了分文件编辑,那么在python中是否存在类似的编写方式?答案是肯定的。python中同样可以实现分文件编辑。甚至还有更多的好处: ‌提高代码的可维护性‌:当代码被分成多个文件时…...

ChatGPT 搜索 vs Google 搜索

原文:Amanda Caswell - 2024.11.01 随着 OpenAI 推出的实时搜索功能,ChatGPT 正在逐步成为像 Google 这样的传统搜索引擎的竞争对手。ChatGPT 以其对话式的回答方式而闻名,它能够在没有广告干扰的情况下提供实时的上下文信息。 我迫不及待地…...

一文简单了解Android中的input流程

在 Android 中,输入事件(例如触摸、按键)从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次,包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程,并结合代码逐步了解…...

【MySQL】SQL语言

【MySQL】SQL语言 文章目录 【MySQL】SQL语言前言一、SQL的通用语法二、SQL的分类三、SQLDDLDMLDQLDCL 总结 前言 本篇文章将讲到SQL语言,包括SQL的通用语法,SQL的分类,以及SQL语言的DDL,DML,DQL,DCL。 一、SQL的通用语法 在学习具体的SQL语句之前,先来…...

5.4.2-1 编写Java程序在HDFS上创建文件

本次实战涉及使用Java操作Hadoop HDFS,包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务,成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践,如检查文件存在性以避免重复创建,以及处理HDFS安全…...

The 3rd Universal CupStage 15: Chengdu, November 2-3, 2024(2024ICPC 成都)

Problem L. Recover Statistics 题目意思&#xff1a; 给定a, b, c三个值&#xff0c;确保构造的数列中包含满足题目的数量 解题思路&#xff1a; 100 中 选择a 50个&#xff0c; b45个&#xff0c; c4个。 #include <iostream>using namespace std;using ll long …...

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…...

SOHO场景开局(小型,多子网):AP+管理型交换机+路由器+光猫

业务需求 1. 实现除光猫外&#xff0c;整网设备通过APP进行开局&#xff0c;开局部署完成后&#xff0c;能够通过APP远程运维。 2. 需要单独划分访客、办公、视频监控3个子网&#xff0c;其中访客子网供顾客无线上网使用&#xff0c;办公子网用于接入无线和有线办公终端&#x…...

Android - Pixel 6a 手机OS 由 Android 15 降级到 Android 14 操作记录

Pixel 6a 手机由 Android 14 升级到 Android 15了&#xff0c;但是由于一些原因又想降级回 Android 14&#xff0c; 能降吗&#xff1f;该怎么降级呢&#xff1f;本篇文章来记述实际操作过程&#xff0c;希望能给想做相同操作的人一些帮助。 答案当然是能降&#xff0c;而且我…...

linux系统kkFileView 配置https预览文件

思路&#xff1a; 1.kkfile的 context全局路径可以修改 context-path,比如&#xff1a;server.servlet.context-path 2.使用nginx反向代理 /kkfile 转发到 kkfile路径上 官网教程 ​​​​​​kkFileView - 在线文件预览 1、配置config/application.properties. server.se…...

stm32——通用定时器时钟知识点

&#xff08;该图来自小破站 铁头山羊老师的stm32标准库教学&#xff09;...

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…...

针对股票评论的情感分类器

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月16日13点39分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...

Day18 Nim游戏

你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数&#xff…...

理解反射,学会反射:撬开私有性质(private)的属性与方法

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;用Java学习数据结构系列喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹喜欢的话可以点个赞谢谢了。作者&#xff1a;小…...

Redis在高性能缓存中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…...

菲涅耳全息图

菲涅耳全息图&#xff1a;记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…...

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...