A General-Purpose Intent and Command Recognition Framework
Project description
Read this in other languages: English, 中文.
OddAgent:一个通用的意图、指令识别框架
[TOC]
想自己动手来手搓一个完全属于你自己的“小爱同学”、“小艺”吗?如果有你这么一个想法,而又不知道该如何开始的话,那么OddAgent项目可以成为你非常容易上手的开源项目。
本来这个功能是小落同学在2024年初就已经支持,由于前阵子公司老板说需要做一个基于LLM的智能助手系统,因此就先从小落同学项目里把相关的代码摘了一下出来,单独搞了一个OddAgent项目出来,作为一个基于LLM的智能助手系统,提供多轮问答、流式AI聊天等功能独立项目来演进。
OddAgent作为一个通用的意图、指令识别框架,跟业务无关,效果识别的准确率,可识别的能力,完全由你的智能体技术配置文件决定。
同时,OddAgent只负责识别意图、指令,不负责实现具体的功能。通过OddAgent识别出来意图、指令后,你需要自行实现工具逻辑,并调用对应的工具,完成相应的功能。
一、功能特性
1. 框架特性
- 支持多轮对话
- 支持流式AI聊天接口
- 工具模板化处理
- 支持语音对话(需要自行部署 OddAsr项目,并在config.json中将OddAsr部署的IP地址指向OddAsr所在的服务器)
OddAsr项目位于:https://github.com/oddmeta/oddasr ,若需要语音的支持,请自行部署。
2. 示例功能
根据视频会议的功能特性,在示例中实现了如下的助手功能:
- 预约会议服务,可创建指定时间、地点的会议。
- 创建会议服务。
- 结束会议服务。
- 加入会议服务,可加入指定会议。
- 退出会议服务。
- 邀请参会人服务,可邀请指定会议的参会人。
- 挂断参会人服务,可挂断指定会议的参会人。
- 打开摄像头服务。
- 关闭摄像头服务。
- 打开麦克风服务。
- 关闭麦克风服务。
- 发送双流服务。
- 停止双流服务。
- 打开同声字幕服务。
- 打开会议纪要服务。
- 关闭会议纪要服务。
二、快速开始
建议在一个虚拟环境里安装,以避免与其它的产品和项目冲突。我个人习惯用conda,你用venv, uv,poetry什么也都OK。下面以conda为例介绍整个安装。
环境要求: Python 3.10+
-
- 创建测试用的虚拟环境
conda create -n oddagent_test python==3.12
conda activate oddagent_test
-
- 在虚拟环境里安装OddAgent
pip install -i https://pypi.org/simple/ oddagent
非官方的镜像站可能不一定能找到最新版本,因此建议使用pypi官方源。
三、创建你自己的智能体项目
1. 步骤一:在任意你想要的目录下创建一个目录
如:d:\\myagent 或者 /home/user/myagent
2. 步骤二:下载项目配置样例
项目配置样例:https://oddmeta.net/tools/oddagent/config.json.sample 智能体配置样例:https://oddmeta.net/tools/oddagent/conference_config.json
下载好后放在你前面创建的目录下。然后复制config.json.sample,并将其改名为config.json
然后开始调整设置config.json里配置你自己的系统配置
四、配置你自己的系统配置
在config.json系统配置里,必改的内容主要是两个:
- 大模型配置:需要将你自己用的大模型的地址
GPT_URL,模型名MODEL,以及API_KEY在配置里填一下 - 智能体的配置:指定OddAgent启用哪个智能体。如果你有多个不同的智能体希望同时运行的话,可以参考后面的介绍《
进阶用法:同时运行多个智能体》
下面是一个系统配置的示例。
1. 大模型配置
"GPT_URL": "https://qianfan.baidubce.com/v2/chat/completions",
"MODEL": "ernie-4.5-turbo-128k",
"API_KEY": "your api key",
2. 智能体配置
"TOOL_CONFIG_FILE_EXT": "_config.py",
"TOOL_CONFIG_FILE": "agents/xiaoluo/xiaoluo_config.py",
五. 智能体技能配置
OddAgent支持通过JSON文件配置不同的智能体技能,配置文件位于你的项目根目录下agents目录下。
在agent_tool_list字段下面,将你要实现的功能一个个加进去:
tool_name: 工具名。建议可以是实际这个工具在实现时需要调用的API的名字。name: 详细工具名。一个实际的、用户要以看在懂的名字。description: 工具具体介绍。example: 可选。如果这个工具是需要带调用参数的,建议在这里具体介绍一下,这里的介绍是会带在prompt提示词里送给大模型,让大模型来更清楚明白的了解这个工具所对应的意图(intent),以及更准确的去解析出此工具对应的slot(槽位)。parameters: 可选。如果这个工具是需要带调用参数的,所有的参数需要在这里列示一下。同example一样,这里的内容也是会在prompt里带给大模型的,以便大模型更精准的解析意图及槽位。enabled: 启用与否tool_api_url: 【不建议使用】识别出工具意图后,实际实现该工具所需要调用的API的地址。tool_api_headers: 【不建议使用】调用工具API时,需要在API的头信息里带的参数列表,如认证的token。tool_api_method: 【不建议使用】调用工具API时,使用的方法(method),比如:GET/POST/PUT/DELETE等。
注意事项: 当前开源版本每个tool只提供一个parameter槽位的支持,请匆填充多个parameter,否则测试时会一直在要求你补充。
以下是一个示例配置。
{
"global_variants": [],
"agent_tool_list": [],
{
"tool_name": "meeting_schedule",
"name": "预约会议",
"description": "预约会议服务,可创建指定时间、地点的会议。",
"example": "JSON:[{'name': 'time', 'desc': '会议时间,格式为yyyy-MM-dd HH:mm:ss', 'value': ''} ]\n输入:帮我预约一个2046年4月18日10:00:00的会议\n答:{ 'time': '2046-04-18 10:00:00'}",
"parameters": [
{"name": "time", "desc": "会议时间,格式为yyyy-MM-dd HH:mm:ss", "type": "string", "required": false},
],
"enabled": true,
"tool_api_url": "https://api.oddmeta.net/api/meeting_schedule",
"tool_api_headers": "{'Content-Type': 'application/json', 'Authorization': '{{ api_key }}'}",
"tool_api_method": "POST"
}
]
}
六、运行测试你自己的智能体
1. 启动oddagent智能体后台
在你创建的自己的智能体项目的目录下,打开一个terminal命令行,然后启动oddagent。当然你也可以自己写个简单的脚本来实现启动或者自动启动。
启动命令:oddagent -c config.json
2. 启动测试界面
1)界面测试
oddagent后台加了一个简单的Web界面,专门用于测试和调试你的智能体技能配置,默认的地址是:http://localhost:5050
绑定的IP和端口可以在系统配置(config.json)里修改。
打开后的界面如下图所示
在这个界面里,你可以选择右边的命令词然后发送请求到oddagent,然后看看它是否正确的解析并返回了你要的意图和槽位,如果有一些命令词说法未能正确识别出意图和槽位的话,可以再继续对你的智能体技术配置里做调整。
2)实际API测试
OddAgent只做意图、指令的识别,所以实际场景里基本上都是在你自己的产品里用API来调用OddAgent识别意图指令,然后自行去实现相应的功能。 以下是一个API调用OddAgent的完整示例代码:
import json
import requests
API_BASE_URL = 'http://127.0.0.1:5050/oddagent/chat' # API地址
def recognize_intent(message):
"""调用api_oddagent_chat API"""
try:
response = requests.post(
API_BASE_URL,
json={
'question': message,
'api_mode': 1 # 模拟API结果,0-不模拟,1-模拟,2-自定义API
},
headers={'Content-Type': 'application/json'},
timeout=30
)
response.raise_for_status()
data = response.json()
return { 'err_code': 200, 'message': 'success', 'data': data}
except Exception as e:
print(f"API调用失败: {str(e)}")
return { 'err_code': 500, 'message': f'API调用失败: {str(e)}', 'data': None }
if __name__ == '__main__':
json_response = recognize_intent("开个周例会")
print(json.dumps(json_response, ensure_ascii=False, indent=2))
运行测试代码:python test_oddagent.py
调用后返回的结果:
{
"err_code": 200,
"message": "success",
"data": {
"answer": {
"data": "[模拟API模式] 假装成功!",
"err_code": 0,
"message": "[meeting_create] API调用成功",
"slots": {
"meeting_name": "周例会"
},
"tool_name": "meeting_create"
}
}
}
其中:
tool_name: 识别出来的意图(由智能体技能配置文件所配置)slots: 该意图工具对应的槽位值。
再次强制:OddAgent作为一个通用的意图、指令识别框架,跟业务无关,效果完全由你的智能体技术配置文件决定。
七、进阶用法:同时运行多个智能体
在一些情况下,存在同时运行多个智能体的需求,建议的方案有两种。
1. 用一个oddagent搞定
在系统配置(config.json)里,你可以将 TOOL_CONFIG_FILE 设置为agents/xiaoluo/*,然后把你智能体配置都放到 agents/xiaoluo 目录下,这样 oddagent 在启动的时候就会去读取 这个目录下所有的 *_config.json 结尾的文件,并将他们加载起来。
2. 用多个oddagent分开部署
为每个智能体启用一个系统配置(config1.json, config2.json, config3.json...),并在每个系统配置里设置
TOOL_CONFIG_FILE: 指向对应智能体的配置文件。如:conference_config.py,smarthome_iot_config.py...BACKEND_PORT: 使用不同的端口,如:5050,5051,5052,5053...
以小落同学而言,她支持天气预报,会议调度,智能家居控制等多种智能体功能,她的做法是部署多个不同的智能体,也即:启动多个oddagent,每个oddagent配置一个智能体配置,并绑定一个端口,然后前置一个工作流接受用户输入,并根据用户的输出再导到不同的oddagent过去处理。
下面是小落同学的一个智能体示例。
\---oddagent
| config.json
| config.json.sample
|
+---agents
| \---xiaoluo
| | conference_config.py
| | GAB_config.py
| | odd_bookmark_config.py
| | smarthome_iot_config.py
| | tpad_work_hour.py
| | weather_config.py
| | xiaoluo_config.py
| | __init__.py
如果想用一个oddagent搞定,那你就在系统配置config.json里将 TOOL_CONFIG_FILE 设置为agents/xiaoluo/*,然后在config.json所在的目录下: oddagent -c config.json 启动 oddagent 即可。
如果想用多个 oddagent分开部署的话,就把系统配置config.json复制多份,并修改每个系统配置中对应的TOOL_CONFIG_FILE和BACKEND_PORT,然后再每个oddagent分别启动即可: oddagent -c config1.json , oddagent -c config2.json ...
八、广而告之
新建了一个技术交流群,欢迎大家一起加入讨论。 扫码加入AI技术交流群(微信) 关注我的公众号:奥德元 让我们一起学习人工智能,一起追赶这个时代。 (若二维码过期了,可私信我) 有事+wx: oddmeta 交流群: 8655372
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oddagent-1.2.30.tar.gz.
File metadata
- Download URL: oddagent-1.2.30.tar.gz
- Upload date:
- Size: 3.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef181adad8c715f5036d395b4d293005d8f04b89bb030ff0b6ede22db7464efb
|
|
| MD5 |
57646bc4a2fbf2b85dd08537b8406a5e
|
|
| BLAKE2b-256 |
027d09465bdea449eea07fe2e25083fd41d4a1b38fa3ec0dddc175dc5c5bda41
|
File details
Details for the file oddagent-1.2.30-py3-none-any.whl.
File metadata
- Download URL: oddagent-1.2.30-py3-none-any.whl
- Upload date:
- Size: 3.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c43df8adb471515cc42ef730dc876c0262c29528072e1367ec7fbbd5cdf93415
|
|
| MD5 |
f2ac1541edcae8c7a3748777cdafa45c
|
|
| BLAKE2b-256 |
16079e272a11be9837592cdeb430d61f86898128eb3120a99dd9e0db395f2c12
|