智能体编排

应用场景 #

  • 打通大模型+数据+图形+表单+触达
  • 需要进行复杂的逻辑流程
  • 以发票审核为例

函数说明 #

你可以在python数据集中调用执行

  • 执行数据源查询【大模型、数据库、接口】
#通过数据源连接名称及SQL语句获取ds数据集
ds_sql(conn_name, sql)

#将数据写入数据源
ds_save(config,content,update=0)
-- config:{'conn':'连接名','table':'表名(字段,..)',...}
-- content:字典或二维数组
-- 成功返回{'status':200,'msg':'success'}

# 可获取大模型生成的结果
ds_gpt(conn_name, prompt,stream=False,his='',tool=False,remark={}) 
-- stream:开启流式, his:历史纪录,tool:是否输出工具调用,remark:模型参数
-- 成功返回{'status':200,'msg':'xxxx','token':'xx'}
# 如果tool为True
-- 成功返回 {'tool':'数据源名','sql':'xxxx'} 或 {'tool':'智能体名', 'msg':'xxxx'}
-- 或 {'tool':'智能体名','msg':'', 'param':{'xx':'xxx'}}
  • 执行智能体【工具技能】
ds_tool('智能体名称',参数) 
-- 如ds_tool('下单',{'帐号':'xxx','商品':'xxxx'})
-- 也可以直接执行ds_gpt返回的工具调用意图
ds_tool({'tool':'智能体名','param':{'xx':'xxx'}})
-- 会把msg当做prompt参数传递给相关智能体
ds_tool({'tool':'智能体名','msg':'xxxx'})
-- 也可以简写为
ds_tool('智能体名', 'prompt')

Tool也可以是数据源

  • 执行智能返回值参考
#### SQL智能体
当数据源为数据库时,你可以通过sql的方式编写返回值为二维数组,
如[['省份','数量']['广东',123]]

#### 图形智能体
当智能体的名称使用VV开头,会返回图形和数据,格式如下:
{'msg': name,'ds':dataset,'chart':chart, 'token': 0,'status': 200}

#### LLM智能体
你可以使用大模型做为数据源,返回的格式如下:
{'msg': 'xxxxxx', 'token': 0,'status': 200}

#### Python智能体
你可以使用python数据源,推荐用标准格式返回
{'msg': 'xxxxxx', 'token': 0,'status': 200}

复杂智能体开发 #

  • 新建一个大模型数据源,本次采用dashAI,以调用阿里dashscope的能力为列

dashAI可选择qwen模型,当有图片上传时会自动切换使用vl模型,默认是qwen-vl,你可以在参数中变更,如{“vmodel”:“qwen-vl-max”}

  • 新建智能体数据集,选择python数据源,取名为"报销单审核"
import json
gpt_dict = json.loads("""$gpt_dict""")
history = gpt_dict['his']
prompt = """$prompt"""
p0 = """
请判断用户的意图,
1. 发票审核回答{"status":1}
2. 数据提交,请回答{"status":2}
3.查询或统计数据回答{"status":3}
4.如果都不涉及请询问用户的意图
"""

p1=f"""
如果用户需审核发票,请识别附件内容后进行审核
你需要参考规则:金额不能超过150元;发票信息属实,非虚假报销。
如果审核通过,你需要询问用户确认是否提交
如果不通过,需要给出原因
请输出格式如下:
识别的内容:xxxxx
是否通过:是或否
原因: xxx
以下是我的问题:
{prompt}
"""

p2="""
请基于最后一次的审核的结果判断,忽略之前的审核结果,如果审核未通过,不允许提交,请给出原因;
如果审核通过,请用以下格式输出相应的insert sql的json
{"tool":"local","sql":"INSERT INTO fpshjl (是否通过, 原因) VALUES ('是或否', '替换成你的原因')"}
"""
p3="""
数据存储在sqlite的表中,表结构如下:
create table fpshjl(是否通过 varchar(100), 原因 text, create_time DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))
请输出以下json格式
{"tool":"local","sql":"你的查询sql"}
"""

def gen():
    ds = ds_gpt('通义千问',prompt,his=history+p0,tool=True)
    yield f"意图识别完成{ds},等待处理\n"
    # ---------- 意图1处理,有上传文件即调用dashAI识别发票 -----------
    if ds['status']==1:
        if gpt_dict['files']:
            # 流式输出结果
            res = ds_gpt('dashAI',p1,files=gpt_dict['files'],stream=1)
            for item in res:
                yield item
        else:
            yield '请上传图片格式的发票'
    # ---------- 意图2处理,调用插入sql,写入数据 -----------
    elif ds['status']==2:
        ds = ds_gpt('通义千问',prompt,his=history+p2)
        yield ds_tool(ds)
    # ---------- 意图3处理,调用通义千问处理查询数据意图并执行查数要求 -----------
    elif ds['status']==3:
        ds = ds_gpt('通义千问',prompt,his=history+p3)
        yield ds_tool(ds)
    else:
        yield '没有可处理的智能体'

ds = gen()
  • 在首页AI问答的模块使@,即可召唤“报销单审核”

智能体编排 #

  • 我们也可以通过智能体编排来实得现复杂智能体开发,比如我们可以先建设几个智能体
  • 数据总结
请基于以下数据:
$prompt
请总结相关参数,a:xxxx,b:xxxx
按以下格式回复
{"tool":"VV单据","param":{"a":"xxxx","b":"xxxx"}}
  • VV单据
dataset={
   "a":"$a",
   "b":"$b"   
}
  • 在智能体编排中,这样我们可以写为
import json
gpt_dict = json.loads("""$gpt_dict""")
history = gpt_dict['his']
prompt = """$prompt"""

def gen():
    know = ds_sql('知识库','xxxx')
    info = ds_sql('API','xxxx')
    yield f"已获取相关数据,正在进行总结\n"
    ds = ds_tool('数据总结',f'{know}{info}{history}{prompt}')
    yield f"数据总结完成,准备显示单据\n"
    yield f"请确认数据是否正确,并提交\n"
    yield ds_tool(ds)
    
ds = gen()
  • 如果需要大模型查询时也是流式输出,可以这样
    res = ds_gpt('通义千问',prompt,his=history+prompt,stream=True)
    for item in res:
        yield item