手把手教你使用C#创建一个WebSearchAgent
PocketFlowSharp介绍
最近我对PocketFlow比较感兴趣,不仅是因为它是一个极简的LLM框架,更加让我觉得很不错的地方在于作者提供了很多方便学习的例子,就算没有LLM应用开发经验,也可以快速上手。
我比较喜欢C#,也想为C#生态做一点小小的贡献,因此创建了PocketFlowSharp项目。
PocketFlowSharp项目的愿景是助力.NET开发者开发LLM应用。
在我个人在学习实践的过程中,我发现很多项目不是那么“新手友好的”,这也没有办法,开发者更关注的是代码实现,文档写起来确实也很费劲。
在PocketFlowSharp项目中,我希望可以做到足够的新手友好,提供一些只要简单配置即可跑起来的示例,并且每个示例是独立的。
PocketFlowSharp项目地址:https://github.com/Ming-jiayou/PocketFlowSharp

构建Web_Search_Agent
今天介绍的是Web_Search_Agent。
效果
先来看下效果:



配置
运行这个示例非常简单,我提供了.env.example,如下所示:

用于配置LLM与BraveSearchApi,目前BraveSearchApi的免费额度是一个月2000次。
将其重命名为.env,注意需要将其设置为嵌入的资源,如下所示:

实现
在经过简单的配置之后,应该已经能够跑通了,为了让感兴趣的人更好的学习,我这里来介绍一下具体的实现。
Web_Search_Agent说是Agent其实我觉得更像是个工作流。PocketFlowSharp相当于一个简单的流程框架,将节点根据一个string类型的action进行连接。
Web_Search_Agent的整体流程如下所示:

首先创建一个Flow:

将节点进行连接有两种方式。
一种是:
decide.Next(search, "search");
另一种是:
_ = search - "decide" - decide;
这是因为实现了运算符重载,具体可看此处:


运行Flow的时候,节点之间的编排在这里:

每一个节点的运行流程在这里:

首先会运行决定节点的prep:

获取上下文(当前还没有上下文)与问题。
决定节点的exec:

获取prep的问题与上下文,判断是搜索还是回答。
决定节点的post:

根据LLM做出的决定选择行动。
这里LLM选择的是search。
根据返回的search寻找下一个节点也就是搜索节点,然后同样执行prep、exec与post。
Search节点的prep:

从共享存储中获取要搜索的内容。
Search节点的exec:

返回网络搜索结果:

Search节点的post:

将网络搜索的结果放到共享存储的context中。
然后返回"decide"又会回到决定节点。
决定节点这次选择的是answer:

就会转到回答节点。
回答节点的prep:

从共享存储中获取问题与上下文。
回答节点的exec:

根据问题与上下文进行回答。
回答节点的post:

将答案存入共享存储中。
最后从共享存储中提取出答案:

以上就是整个流程,希望能够让感兴趣的朋友快速理解。
最后
如果你还有什么不理解的地方,欢迎给我提issue。
如果对你有所帮助,点颗star就是最大的鼓励。
欢迎感兴趣的朋友一起为爱发电。
手把手教你使用C#创建一个WebSearchAgent的更多相关文章
- 手把手教你用vue-cli构建一个简单的路由应用
上一章说道:十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 开发环境搭建好之后,那么开始新添加一些页面,构建最基本的vue项目, ...
- 手把手教你从零写一个简单的 VUE--模板篇
教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...
- 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引
近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...
- 手把手教你用redis实现一个简单的mq消息队列(java)
众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...
- 手把手教你使用 js 实现一个 Canvas 编辑器
手把手教你使用 js 实现一个 Canvas 编辑器 拖拽 缩放,等比缩放 导出 image 模版 撤销,重做 OOP,封装,继承,多态 发布库 CI/CD (gitlab/github) ... h ...
- 手把手教你从零写一个简单的 VUE
本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...
- 手把手教你解决无法创建 JPA 工程的问题
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7703803.html ------------------------------------ ...
- 手把手教你用Docker部署一个MongoDB集群
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引 ...
- 手把手教你使用Java实现一个神经网络
首先看一下运行效果: 下面是项目整体目录: 0.实现神经网络总览 神经网络由层.神经元.权重.激活函数和偏置组成.每层都有一个或者多个神经元,每一个神经元都和神经输入/输出连接,这些连接就是权重. 需 ...
- 手把手教你用netty撸一个ZkClient
原文地址: https://juejin.im/post/5dd296c0e51d4508182449a6 前言 有这个想法的缘由是前一阵子突发奇想, 想尝试能不能直接利用js连接到zookeeper ...
随机推荐
- ABB喷涂机器人IRB5400维修保养
为最大限度地保证ABB机器人正常运行,ABB机器人普遍需要在运行6000小时后进行一次保养,特别是针对在恶劣工况与长时间在负载极限或运行极限下工作的ABB机器人,则需要每年进行一次全面ABB机器人保养 ...
- Oracle DBA末日or重生?不会APEX=淘汰!
残酷现实:传统DBA正在消失 "只会调优SQL的DBA,正在沦为数据库修理工!" 掌握APEX的DBA,薪资翻3倍,秒变企业核心资产! 一.DBA的死刑通知书 1. 云+AI:直接 ...
- Thymeleaf 嵌套循环
<label th:each="role:${roles}" class="check-box"> <input th:each=" ...
- QT5笔记:36. QGraphicsView 综合示例 (完结撒花!)
通过此示例可以比较熟悉QGraphincsView的流程以及操作 坐标关系以及获取: View坐标:左上角为原点,通过鼠标移动事件获取 Scene坐标:中心为原点,横竖为X,Y轴.通过View.map ...
- mybatis - [12] 日志工厂
题记部分 001 || 日志工厂 如果一个数据库操作出现了异常,需要通过日志定位问题. 002 || Log4j Log4j是Apache的一个开源项目,通过使用Log4j,可以控制日志信息输送的目的 ...
- MySQL - [08] 存储过程
题记部分 一.什么是存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效 ...
- halcon中是怎么实现半导体/Led中的GoldenDie的检测方法的 基于局部可变形模板匹配 variation_model模型
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/18739196 这篇简单介绍一下halcon中的print_check_single_chars ...
- CATIA许可证破解方法(CMD版)
<<< catia的DS License Server Administration后不会自动弹出GUI界面,就需要使用CMD来破解安装许可证. <<< 1. ca ...
- Selenium 测试介绍
本文会从以下下几个方面介绍Selenium,相信大家阅读后会对Selenium有一个全新的认识. 为什么是Selenium 初探Selenium Selenium组成 Selenium ...
- 【P0】Logisim部件级实验/有限状态机
课上 过得十分狼狈.经鉴定孩子可能脑子拗 T1 投票决议 组内投票,赞成>反对,则通过:组长拥有一票否决权. 信号名 方向 描述 [1:0] s Input 2'b00 赞成2'b01 反对2' ...