惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
H
Hacker News: Front Page
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Project Zero
Project Zero
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
P
Privacy & Cybersecurity Law Blog
Know Your Adversary
Know Your Adversary
Last Week in AI
Last Week in AI
腾讯CDC
Schneier on Security
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
量子位
L
Lohrmann on Cybersecurity
J
Java Code Geeks
Cyberwarzone
Cyberwarzone
Recent Announcements
Recent Announcements
IT之家
IT之家
博客园_首页
罗磊的独立博客
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Application and Cybersecurity Blog
Application and Cybersecurity Blog
F
Fortinet All Blogs
博客园 - Franky
P
Palo Alto Networks Blog
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Martin Fowler
Martin Fowler
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric

博客园 - chegan

历时半年,我将一个大型asp.net的零代码快速开发平台转成了java 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(二)-数据结构和代码分析方法 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析 像纸质笔记本一样给div,textarea添加行的分割线 基于视图的增删改查操作(颠覆传统思维吧) 恶劣的百度推广人员 javascript实现当前页面截屏 基于数据库的企业级智能表单系统设计(asp.net)-架构 基于数据库的企业级智能表单系统设计(asp.net)-序言 同时运行qq和360的方法(偶然发现的) http编程中的get和post混合使用方式 使用silverlight构建一个工作流设计器(二十一)-增加标签(下) 使用silverlight构建一个工作流设计器(二十)-增加标签(上) 自贺获得DEV-WOW 2009微软开发者大赛开发奖 使用silverlight构建一个工作流设计器(十九)-规则与活动的交点的平滑移动 使用silverlight构建一个工作流设计器(十八)-持久化数据到数据库—服务器段功能实现 使用silverlight构建一个工作流设计器(十七)-持久化数据到数据库—设计webservices接口 使用silverlight构建一个工作流设计器(十六)-持久化数据到数据库—数据库结构 抛论妄自菲薄与夜郎自大之砖,引国家软件发展道路之玉
用c#从头写一个AI agent,实现企业内部自然语言数据统计分析(三)--一个综合的例子
chegan · 2025-04-30 · via 博客园 - chegan

在前面一节中,我们做了一个简单的统计图表的例子。本节中,我们将实现一个综合的稍微复杂一点的例子,并对这个例子做一个详细的剖析,如下图所示:。

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

Agent按照我的要求从数据库中获取数据,并在指定的时间通过消息发送给我。Agent为何能如此听话?或者说能听得懂我的话,并按照要求执行呢?那是因为我给他配置了解决此类问题的各种工具(tools)让他在合适的时候调用,下面是Agent在收到我的指令后进行的一系列动作,整个过程描述如下:

1、用户发出请求:在晚上17点28统计一下知识库数量和用户数量,一起发给admin

2、Agent收到请求后发给大模型,大模型初步判断这个是一个定时触发的任务,调用我的工具创建定时器,这个工具的json描述如下:

{
          "type": "function",
          "function": {
            "name": "RemindAdd",
            "description": "当你想定时提醒的时候非常有用。如果对于用户给出的时间不确定,例如用户说:10点提醒我拿东西,这里的10点可能是早上10点,也可能是晚上10点,所以你要询问用户给出确定的时间点。但是如果根据系统时间,现在的时间已经过了10点,那么默认就是晚上10点,就不用在询问用户了。",
            "parameters": {
              "type": "object",
              "properties": {
                "time": {
                  "type": "string",
                  "description": "定时到期时间,使用24小时时间格式。例如2025-02-05 15:31。如果用户是指每天任务的话, 那么这个时间必须是今天的时间"
                },
                "something": {
                  "type": "string",
                  "description": "一个动作,用户想要在定时到期时要做的事情,例如:做饭,洗碗等"
                },
                "timeRelated": {
                  "type": "string",
                  "description": "和用户定时相关的词语,例如:3分钟后,12:50,下午4点等"
                },
                "userInput": {
                  "type": "string",
                  "description": "用户输入的原话内容"
                },
                "userLoginName": {
                  "type": "string",
                  "description": "当前用户登录名,使用系统提示的内容填写"
                },
                "isEveryDay": {
                  "type": "string",
                  "description": "是否为每天重复提醒,true或者false"
                },
                "contentType": {
                  "type": "string",
                  "description": "提醒的类型:text或者action。text是指发送文本消息,action指的是一个动作:例如查询当天最新的IT资讯,发送消息,或者用户请求中包含 \"自动、定时、发送\" 等动作词汇时也认为是一个action。"
                }
              }
            },
            "required": [
              "time",
              "something",
              "timeRelated",
              "userInput",
              "userLoginName",
              "isEveryDay",
              "contentType"
            ]
          }
        }

大模型指示Agent调用这个工具,并传递参数。Agent根据传递参数创建定时器,保存在数据库中,这个定时器信息如下图:

3、在指定时间到期之后,Agent提取定时器的提醒内容 "统计知识库数量和用户数量,然后将结果一起发给admin” 提交给大模型。

4、大模型判断这是一个多任务场景,返回Agent说调用任务分解的tool,并传递参数,这个任务分解函数的json描述如下:

 {
      "type": "function",
      "function": {
        "name": "Global_Decomposition",
        "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指出任务之间的依赖关系。",

        "parameters": {
          "type": "object",
          "properties": {
            "tasks": {
              "type": "string",
              "description": "分解后的任务,一个json数组格式的字符串,不能为空。例如:[{\"index\": 1,\"desc\": \"统计一个部门用户数\",\"base\":\"\"   },{\"index\": 2,\"desc\": \"写一个简单js2个数字相加的函数\",\"base\":\"\"  },{\"index\":3,\"desc\":\"通知全体市场部人员开会\",\"base\":\"1,2\" }...]。其中base指出任务之间的依赖关系,填写依赖任务的index值,多个之间使用逗号隔开。"
            },
            "agentID": {
              "type": "string",
              "description": "agentID"
            },
            "userLoginName": {
              "type": "string",
              "description": "用户名,根据系统提示自动填入"
            },
            "userInput": {
              "type": "string",
              "description": "用户提问的原话内容"
            }
          }
        },
        "required": [
          "tasks",
          "agentID",
          "userLoginName",
          "userInput"
        ]
      }
    },

通过这个json,大模型把这个任务 " 统计一下知识库数量和用户数量,一起发给admin" 分解为三个任务:

  •  1、统计是知识库数量
  • 2、统计用户数量
  • 3、把上面两个统计结果发送给admin(任务3依赖于任务1、2)

Agent拿到分解的任务后,根据任务的依赖关系,经过遍历循环执行(如果分解任务数量多,依赖关系复杂可能需要多次遍历执行),先完成任务1和任务2(再上一篇中详细介绍过),然后把任务1和任务2的结果以及任务3一起提交给大模型

5、大模型在收到 第上面四步的请求(类似于:知识库数量178,用户数量51。请根据以上信息完成用户下面的请求:把统计结果发送给admin),判断这是一个信息发送的任务,返回工具调用信息,这个发送信息的json格式如下:

{
        "type": "function",
        "function": {
          "name": "System_Notify",
          "description": "当你想发送通知、消息、email,短信等时非常有用。",
          "parameters": {
            "type": "object",
            "properties": {
              "agentID": {
                "type": "string",
                "description": "agentID"
              },
              "userLoginName": {
                "type": "string",
                "description": "发送人姓名"
              },
              "message": {
                "type": "string",
                "description": "消息内容。"
              },
              "toUser": {
                "type": "string",
                "description": "消息接收人姓名,多个接收人之间使用逗号(,)分开。例如:张三,李四,王五"
              },
              "userDesc": {
                "type": "string",
                "description": "消息接收人描述:用户没有提及具体的姓名而是一个描述,系统管理员 或者 财务部的部长"
              },
              "msgType": {
                "type": "string",
                "description": "消息类型,包括:短信(sms)、系统消息(system)、邮件(email)、微信群(weixingroup)、个人微信(weixinuser),多个消息类型之间使用逗号(,)分开。例如:sms,system,email,weixin。"
              },
              "toName": {
                "type": "string",
                "description": "当参数mstType是微信群时,toName指的是微信群的名称或者个人微信的名称"
              },
              "userInput": {
                "type": "string",
                "description": "用户提问的原话内容。"
              }
            }
          },
          "required": [
            "userLoginName",
            "message",
            "toUser",
            "userDesc",
            "msgType",
            "userInput",
            "toName",
            "agentID"
          ]
        }

6、Agent收到后,根据参数进行消息发送

至此整个流程完成。从这个过程中看出,Agent在人类和大模型之间,起到一个中间人的角色。人类在发出一个请求给Agent后,通过Agent和大模型之间的多次沟通和信息交流后,完成人类的指令。

以上只是一个简单的实例,但任何复杂的事情都是由简单的组成的不是吗?