智能体系统设计
本文介绍了智能体相关的体系结构,工作流程以及组件,并定义了Restful接口
1. 体系结构
2. 工作流
- a. 初始工作,将数据库连接信息传递给Agent Server进行数据库连接管理
- b. 当Agent Server接收到用户消息后传递给Agent Executor按照ReAct模式执行任务
- c. Agent Executor调用Structed Chat Agent进行推理
- d. 然后Agent Executor根据Structed Chat Agent的反馈确定是否要调用工具,将返回结果和工具返回结果合并.
- e. 循环c, d两步直到AgentFinish将最终结果返回用户
3. 组件
Agent Server: 接受用户请求并执行相关操作,将中间对应步骤和最终结果返回用户,其中包含以下子组件:
SQL Connection Manager: 数据库连接信息管理器, 对数据库进行预连接,并管理所有要用到的数据库
Agent Executor: 智能体执行器,循环调用Agent并根据反馈信息决定下一步任务
Structured Chat Agent: 结构化聊天智能体,根据固定的ReAct提示词模板推理任务,并将结果反馈给Agent Executor
SQL Agent Tool: SQL智能体工具,通过SOL ToolKits完成所有数据库查询任务
Charts Chain Tool: 图表智能工具,根据输入整理生成可供前端渲染的图表数据
Knowledge Base Tool: 知识库组件,提供知识库查询和信息整合
LM Server: 大模型服务, 执行单次的请求推理
MySQL: 数据库
K8S: 容器编排调度系统,对参与的微服务进行管理调度
4. LangChain Agent Execute Sequence Diagram
5. 接口
连接数据库: User->Agent System
协议接口
传输协议 | HTTP(POST) |
---|---|
URI PATH | /uran/agent/db-connects |
Headers | Content-Type:application/json;charset=UTF-8 |
Version | v1.0 |
请求字段
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
uri | String | Y | 数据库链接uri |
dbs | StringArray | Y | 要用到的数据库数组 |
响应字段
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
status | Int | Y | 状态码200为成功, 其余为出错 |
message | String | Y | 当status=200为”success”, 其余为错误信息 |
data | Object | N | 返回有用的数据 |
示例 :
请求
{
"uri":"mysql://root:Koala_MySQL#20Xx..A..@10.10.8.5:43306",
"dbs":["koala_ai_alarm", "xxx", ...]
}
响应
{
"status": 200,
"message": "success"
}
断开数据库: User->Agent System
协议接口
传输协议 | HTTP(DELETE) |
---|---|
URI PATH | /uran/agent/db-connects |
Headers | Content-Type:application/json;charset=UTF-8 |
Version | v1.0 |
请求字段
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
uri | String | Y | 数据库链接uri |
dbs | StringArray | Y | 要用到的数据库数组 |
响应字段
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
status | Int | Y | 状态码200为成功, 其余为出错 |
message | String | Y | 当status=200为”success”, 其余为错误信息 |
data | Object | N | 返回有用的数据 |
示例 : 请求
{
"uri":"mysql://root:Koala_MySQL#20Xx..A..@10.10.8.5:43306",
"dbs":["koala_ai_alarm", "xxx", ...]
}
响应
{
"status": 200,
"message": "success"
}
对话交流: User <->
Agent System
协议接口
传输协议 | HTTP(POST) |
---|---|
URI PATH | /uran/agent/chat |
Headers | Content-Type:application/json;charset=UTF-8 |
Version | v1.0 |
请求字段
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
message | Object | Y | 用户发送消息 |
+content | String | Y | 消息体 |
maxTokens | Int | Y | 限制最大token数 |
temperature | Float | Y | 想象力 |
model | String | Y | 模型名 |
database | String | N | 指定要搜索的数据库 |
session | String | N | 会话id,如果没有或者为""或null,在第一次对话后会返回 |
响应字段 ( 流式text/event-stream )
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
data | Object | Y | 返回产生的结果[DONE]表示完成 |
+choices | ObjectArray | Y | |
++delta | Object | Y | |
+++role/step/content | String | Y | role=assistant,step=当前正在发生进行的步骤, content=模型回复的消息 |
+++generation | Object | N | 模型生成的渲染图表数据 |
++++type | String | Y | 图表类型table表格/histogram直方图/linechart折线图/piechart饼图 |
++++chart | Object | Y | ECharts支持的图结构数据,或者如果为table则是简单分类的json数据,见示例 |
++session | String | Y | 本次对话session id, 在一次对话过程请求中需要带上 |
++finish_reason | String | Y | null or 结束原因 |
示例 : 请求
{
"maxTokens": 128,
"temperature": 0.7,
"message": {
"content": "按天统计人员报警数量,并生成直方图"
},
"model": "koala-mm",
"database": "koala_ai_alarm",
"session": "abcd-xxx-iiii"
}
响应
data: { "choices": [{"delta": {"step": "正在使用工具:......"}, "session": "abcd-xxx-iiii", "finish_reason": null}, ]}
data: { "choices": [{"delta": {"step": "正在使用工具:......"}, "session": "abcd-xxx-iiii", "finish_reason": null}]}
data: { "choices": [{"delta": {"content": "火灾"}, "session": "abcd-xxx-iiii", "finish_reason": null}]}
data: { "choices": [{"delta": {"content": "发生"}, "session": "abcd-xxx-iiii", "finish_reason": null}]}
data: { "choices": [{"delta": {"generation":
{
"type" : "table",
"chart" : {
"数学": [84, 120, 115, ....],
"语文": [99, 120, 115, ....],
"外语": [66, 120, 115, ....]
}
},
"session": "abcd-xxx-iiii",
"finish_reason": "stop"
}}]}
...