找回密码
 立即注册
首页 业界区 业界 用c#从头写一个AI agent,实现企业内部自然语言数据统计 ...

用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(三)--一个综合的例子

撇瞥 2025-6-5 10:09:07
在前面一节中,我们做了一个简单的统计图表的例子。本节中,我们将实现一个综合的稍微复杂一点的例子,并对这个例子做一个详细的剖析,如下图所示:。
1.png

 
上面是我通过Agent和大模型进行的对话,在指定的时间,我在web端收到了一个消息,如下所示:
 
2.png

 
 
Agent按照我的要求从数据库中获取数据,并在指定的时间通过消息发送给我。Agent为何能如此听话?或者说能听得懂我的话,并按照要求执行呢?那是因为我给他配置了解决此类问题的各种工具(tools)让他在合适的时候调用,下面是Agent在收到我的指令后进行的一系列动作,整个过程描述如下:
1、用户发出请求:在晚上17点28统计一下知识库数量和用户数量,一起发给admin
2、Agent收到请求后发给大模型,大模型初步判断这个是一个定时触发的任务,调用我的工具创建定时器,这个工具的json描述如下:
  
  1. {
  2.           "type": "function",
  3.           "function": {
  4.             "name": "RemindAdd",
  5.             "description": "当你想定时提醒的时候非常有用。如果对于用户给出的时间不确定,例如用户说:10点提醒我拿东西,这里的10点可能是早上10点,也可能是晚上10点,所以你要询问用户给出确定的时间点。但是如果根据系统时间,现在的时间已经过了10点,那么默认就是晚上10点,就不用在询问用户了。",
  6.             "parameters": {
  7.               "type": "object",
  8.               "properties": {
  9.                 "time": {
  10.                   "type": "string",
  11.                   "description": "定时到期时间,使用24小时时间格式。例如2025-02-05 15:31。如果用户是指每天任务的话, 那么这个时间必须是今天的时间"
  12.                 },
  13.                 "something": {
  14.                   "type": "string",
  15.                   "description": "一个动作,用户想要在定时到期时要做的事情,例如:做饭,洗碗等"
  16.                 },
  17.                 "timeRelated": {
  18.                   "type": "string",
  19.                   "description": "和用户定时相关的词语,例如:3分钟后,12:50,下午4点等"
  20.                 },
  21.                 "userInput": {
  22.                   "type": "string",
  23.                   "description": "用户输入的原话内容"
  24.                 },
  25.                 "userLoginName": {
  26.                   "type": "string",
  27.                   "description": "当前用户登录名,使用系统提示的内容填写"
  28.                 },
  29.                 "isEveryDay": {
  30.                   "type": "string",
  31.                   "description": "是否为每天重复提醒,true或者false"
  32.                 },
  33.                 "contentType": {
  34.                   "type": "string",
  35.                   "description": "提醒的类型:text或者action。text是指发送文本消息,action指的是一个动作:例如查询当天最新的IT资讯,发送消息,或者用户请求中包含 "自动、定时、发送" 等动作词汇时也认为是一个action。"
  36.                 }
  37.               }
  38.             },
  39.             "required": [
  40.               "time",
  41.               "something",
  42.               "timeRelated",
  43.               "userInput",
  44.               "userLoginName",
  45.               "isEveryDay",
  46.               "contentType"
  47.             ]
  48.           }
  49.         }
复制代码
大模型指示Agent调用这个工具,并传递参数。Agent根据传递参数创建定时器,保存在数据库中,这个定时器信息如下图:
3.png

3、在指定时间到期之后,Agent提取定时器的提醒内容 "统计知识库数量和用户数量,然后将结果一起发给admin” 提交给大模型。
4、大模型判断这是一个多任务场景,返回Agent说调用任务分解的tool,并传递参数,这个任务分解函数的json描述如下:
  1. {
  2.       "type": "function",
  3.       "function": {
  4.         "name": "Global_Decomposition",
  5.         "description": "任务分解函数,把用户请求的内容分成若干个可执行的最小单元,确保每个单元都包含且只能包含一个独立任务。如果您发现用户的请求是一个包含多个任务的情况时,优先调用这个函数,这个函数的优先级别最大(除了和定时、提醒有关的内容)。例如用户说:统计一下部门用户数,并给我写一个简单js2个数字相加的函数,还有通知全体市场部人员开会。\n那么使用这个Global_Decomposition可以把用户的输入分解成3个任务,就是 :[{ "index": 1,"desc": "统计一个部门用户数" ,"base":"" },{"index": 2,"desc": "写一个简单js2个数字相加的函数" ,"base":"" },{"index":3,"desc":"通知全体市场部人员开会","base":"1,2" }...] 。任务分解注意一下几点:\\n1、如果这些任务之间有前后依赖关系,那么请注意任务分解时候的排序,要把被依赖的任务放在依赖他的任务之前。\\n2、如果分解后还是只有一个任务,那么就不要分解。\\n3、要保证任务分解必须能全面执行用户的任务,任务分解的数量不限制,要保证逻辑清晰、完整、正确。\\n4、其中base指出任务之间的依赖关系。",
  6.         "parameters": {
  7.           "type": "object",
  8.           "properties": {
  9.             "tasks": {
  10.               "type": "string",
  11.               "description": "分解后的任务,一个json数组格式的字符串,不能为空。例如:[{"index": 1,"desc": "统计一个部门用户数","base":""   },{"index": 2,"desc": "写一个简单js2个数字相加的函数","base":""  },{"index":3,"desc":"通知全体市场部人员开会","base":"1,2" }...]。其中base指出任务之间的依赖关系,填写依赖任务的index值,多个之间使用逗号隔开。"
  12.             },
  13.             "agentID": {
  14.               "type": "string",
  15.               "description": "agentID"
  16.             },
  17.             "userLoginName": {
  18.               "type": "string",
  19.               "description": "用户名,根据系统提示自动填入"
  20.             },
  21.             "userInput": {
  22.               "type": "string",
  23.               "description": "用户提问的原话内容"
  24.             }
  25.           }
  26.         },
  27.         "required": [
  28.           "tasks",
  29.           "agentID",
  30.           "userLoginName",
  31.           "userInput"
  32.         ]
  33.       }
  34.     },
复制代码
通过这个json,大模型把这个任务 " 统计一下知识库数量和用户数量,一起发给admin" 分解为三个任务:

  •  1、统计是知识库数量
  • 2、统计用户数量
  • 3、把上面两个统计结果发送给admin(任务3依赖于任务1、2)
Agent拿到分解的任务后,根据任务的依赖关系,经过遍历循环执行(如果分解任务数量多,依赖关系复杂可能需要多次遍历执行),先完成任务1和任务2(再上一篇中详细介绍过),然后把任务1和任务2的结果以及任务3一起提交给大模型
5、大模型在收到 第上面四步的请求(类似于:知识库数量178,用户数量51。请根据以上信息完成用户下面的请求:把统计结果发送给admin),判断这是一个信息发送的任务,返回工具调用信息,这个发送信息的json格式如下:
  1. {
  2.         "type": "function",
  3.         "function": {
  4.           "name": "System_Notify",
  5.           "description": "当你想发送通知、消息、email,短信等时非常有用。",
  6.           "parameters": {
  7.             "type": "object",
  8.             "properties": {
  9.               "agentID": {
  10.                 "type": "string",
  11.                 "description": "agentID"
  12.               },
  13.               "userLoginName": {
  14.                 "type": "string",
  15.                 "description": "发送人姓名"
  16.               },
  17.               "message": {
  18.                 "type": "string",
  19.                 "description": "消息内容。"
  20.               },
  21.               "toUser": {
  22.                 "type": "string",
  23.                 "description": "消息接收人姓名,多个接收人之间使用逗号(,)分开。例如:张三,李四,王五"
  24.               },
  25.               "userDesc": {
  26.                 "type": "string",
  27.                 "description": "消息接收人描述:用户没有提及具体的姓名而是一个描述,系统管理员 或者 财务部的部长"
  28.               },
  29.               "msgType": {
  30.                 "type": "string",
  31.                 "description": "消息类型,包括:短信(sms)、系统消息(system)、邮件(email)、微信群(weixingroup)、个人微信(weixinuser),多个消息类型之间使用逗号(,)分开。例如:sms,system,email,weixin。"
  32.               },
  33.               "toName": {
  34.                 "type": "string",
  35.                 "description": "当参数mstType是微信群时,toName指的是微信群的名称或者个人微信的名称"
  36.               },
  37.               "userInput": {
  38.                 "type": "string",
  39.                 "description": "用户提问的原话内容。"
  40.               }
  41.             }
  42.           },
  43.           "required": [
  44.             "userLoginName",
  45.             "message",
  46.             "toUser",
  47.             "userDesc",
  48.             "msgType",
  49.             "userInput",
  50.             "toName",
  51.             "agentID"
  52.           ]
  53.         }
复制代码
 
6、Agent收到后,根据参数进行消息发送
至此整个流程完成。从这个过程中看出,Agent在人类和大模型之间,起到一个中间人的角色。人类在发出一个请求给Agent后,通过Agent和大模型之间的多次沟通和信息交流后,完成人类的指令。
以上只是一个简单的实例,但任何复杂的事情都是由简单的组成的不是吗?

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册