[特殊字符]AI洞察者中心|知识库(二)
来源:https://bluefocus.feishu.cn/docx/T0lLdbOy6oPUDGxcI3Lcr2Gtn2e
Multi-agent mode实践 | 用coze手捏一个bot
视频:分享一个在Coze上做提示词工程以及设计多智能体应用的最佳实践案例
视频:【Agent共学第二期】Kai分享 | 一百个字搭谁是卧底-多Agent
COZE版儿童陪伴机器人+实物玩具=AI玩具,体验感还不错
活动
[教学向]我把Coze比赛第一的bot拆了教大家
🤖扣子 AI 工坊 Coze AI Factory 火热开启
🪐与 AI 童行,扣子创意 Bot 挑战赛开启
我在字节Coze平台做的智能体上了热榜!
扣子在上海|一些捏 Bot 的 “旁门左道” 和赛前赛后
我们的 Bot 获得了「掘金 x 扣子 Hackathon 活动 - 深圳站」的总冠军
深圳线下活动最佳解决方案奖-WeCapture
字节的扣子炸裂更新,模型支持月之暗面,插件 IDE 已经上线
猎豹移动集团 coze 版 Al Hackathon
视频:【共学快闪】AI Agent篇 Coze搭建- Itao+陈慧凌 分享|主题:和 AI 成为搭子
综合探讨
想变现? Coze Agent商业化路径分析
扣子(coze)系列教程(一):什么是扣子智能体
这可能是全网目前最全的Coze入门教程了!
Bot创作者如何在Coze上赚钱?
如何用扣子coze给企业搭建一个超级数字员工
新手总结Coze bot创建步骤:先锁定“最简”任务,提前准备测试问题
视频:【共学快闪】AI Agent-Coze搭建 5月8日大圣分享Coze全流程搭建
视频:【共学快闪】AI Agent-Coze搭建 5月7日赛博禅心大聪明分享
面向业务开发的 Coze 使用指南
用Coze扣子轻松搭个Bot,从此告别"标题党"
扣子官方:用扣子/Coze 揭秘吴恩达的4种 AI Agent 设计模式
扣子官方:这届00后已经学会用扣子/ Coze “偷懒”了
【2万字长文】如何用Kimi全自动创建扣子智能体?这喂饭级教程将揭晓一切!
保姆级教程:Coze 打工你躺平
扣子Coze智能体开发实战教程 | 智能体开发
Bot 分享
万字实践教程,全面入门 Coze 工作流|用 Coze 打造 AI 精读专家,复刻 10 万粉公众号的创作生产力
[Coze教程] “菜品秀秀”bot制作流程大揭密
动了谁的奶酪?——用字节扣子打造一个每篇都10万+阅读的知音人
闭关10天,捣鼓出一个自媒体写作神器,一分钟一篇文章,写作嘎嘎猛!
扫码枪+AI:一扫生成药品信息卡片,说明书可以扔了!|AI 教程
视频:【Agent共学第二期】制作一个新闻鉴别相关的bot
视频:用Coze搭建智能机器人并挖掘销售线索
视频:coze实战系列(一)| 天天小管家
视频:毕业加速器:如何用AI爆肝论文?
视频:不写代码,如何用 Coze 做专属的对话机器人
视频:用coze一键生成朋友圈文案
视频:COZE:中小企业均可0门槛创建业务agent,支持接入微信公众号、微信客服、discord、tele等各种终端,实现公司AI客服、销售机器人等触达客户
视频:【Agent共学第二期】许键分享|拆解“离谱村捏剧本”coze bot思路
视频:【Agent共学第二期】银海分享 | 用AI重塑我的工作流
视频:【Agent共学第二期】大家一起捏 Bot,Coze 作品分享会
视频:【Agent共学第二期】Bot冠军大揭秘:李小白
视频:【Agent共学第二期】两位个人Bot创作者的分享:《你出生的那一天》和《热点文章生成器》
视频:【Agent共学第二期】一点都不简单的共创之路
61儿童节,我给儿子做了两款coze小应用,让他见识一下程序员爸爸的厉害。
视频:使用「扣子/Coze」搭建文本纠错助手
六一【黑科技】礼物,AI“复活”玩具!细节剖析~
这是Coze平台上最完善、最强大的Notion连接器
最贴心的coze bot:从零开始的bot搭建实战
数据何规接入AI客服(kimi版)啦!
人民日报健康客户端:智能对话 科学防癌 AI赋能肿瘤防治行动
使用 coze 打造私人播客助手 - 根据个人喜好自动化生成播客
字节COZE应用创作平台,开发 AI chatbot(短视频爆款案例)初探
使用Coze制作MidJourney提示词专家
使用扣子Coze创建AI绘画助手
我用Coze搓了一个乞丐版的秘塔搜索
用Coze搞一个简单的安全AI助手
英语怎么快速提高?我用 Coze AI 免费手搓了一个 24 小时陪练教师
玩转 Coze,我帮开源 AI 社区搞了一个社群运营机器人
保姆级教程!教你如何用扣子搭建一个免费好用的“图片转表格”AI客服(附实操过程+效果)
【AI学习】如何用扣子搭建“赛事活动AI客服”机器人?亲测效果好
字节最新发布的Coze太好用了,我也不想取代合规老师的工作啊!
从0到1 | 使用coze国内版部署飞书bot机器人、豆包智能体
Coze + 爬虫 = 周末去哪不用愁!!
今天拿到心动offer,这个AI有点东西…
从0到1无代码使用coze搭建一对一作画工具
应对裁员潮,突发奇想,打造“收割offer”智能体…
扣子使用问题FAQ
来源:https://bluefocus.feishu.cn/docx/O5TzdbZhpo8p5xxFFTict1HrnHb
为方便技术人员更快了解情况和解决问题,反馈时请提供以下信息:
请提供以下信息,帮助定位问题
-
操作过程
-
异常状况截图及描述
-
Bot/工作流/插件 编辑页面的网址链接
反馈邮箱:feedback@coze.cn
常见问题解答
- 展开左侧导航列表查看
logid查询方式
一、常见问题解答
扣子整体
扣子使用额度
扣子使用额度规则:
1.目前扣子有使用额度限制,当日额度用完后,可以尝试切换其他模型使用,或者等待第二天额度刷新。
3.预计7月中旬上线专业版,开放额度充值,如果您已将扣子用于企业业务,可以添加下方企微,获得优先对接。
Bot可以回复,但是“无法生成用户问题建议”
目前问题推荐走单独的模型和额度统计,每人每天100次使用额度,与Bot所使用的模型无关。额度用完后需要等待第二天额度刷新。
提示词相关教程
P[r](https://platform.openai.com/docs/guides/prompt-engineering)ompt engine[ering https://platf](https://www.coze.cn/docs/guides/prompt)orm.openai.com/docs/guides/prompt-engineering
扣子教程-编写提示词 https://www.coze.cn/docs/guides/prompt
Bot 被封禁
为进一步优化扣子商店环境,减少劣质及虚假 Bot 对大家造成的困惑,我们将持续对存在冒充、欺骗行为的 Bot 进行[封禁处理。具体说明如下:
1. Bot 一旦被封禁,将不能](https://www.coze.cn/docs/guides/content_principles)再进行修改或发布操作,您需重新创建 Bot 方可使用。对于符合封禁条件的 Bot ,我们不会提供解封服务。后续还有可能将处罚范围扩大至账户限制,所以请您在使用时务必尽量避免违规行为。具体可参考使用条款:https://www.coze.cn/docs/guides/content_principles
2. 若您的 Bot 存在被误封禁的情况,可邮件联系 feedback@coze.cn 进行反馈,邮件中请提供您的 Bot 名称、账号信息以及相关说明。
3. 若您发现有疑似违规 Bot,请邮件联系 report@coze.cn 进行反馈,并附上相关 Bot 链接或名称及截图。
非常感谢您的支持与理解!
Bot 发布被拒
运营判断属于发布标准和规范禁止发布的内容:
[Bot 审核相关策略,您可以参](https://www.coze.cn/docs/guides/content_principles)考《扣子平台内容发布标准和规范》。出于安全规范原因,无法向您提供更多审核细节信息。
找不到已收藏的Bot
在扣子主页,点击右上角“Bots”,即可以查看已收藏的Bot,对话框@相关bot还可以进行对话。
扣子 “Bot分析”覆盖渠道
目前Coze.cn的各发布渠道,以下渠道的使用数据会纳入Bot编排页的分析统计:豆包、飞书、微信客服、微信公众号(服务号)、微信公众号(订阅号)、Bot商店、掘金。
以下渠道的使用数据暂时未纳入Bot编排页的分析统计:Bot as API、抖音评论区、抖音企业号、微信小程序
知识库
知识库效果不佳常见设置问题
**知识库效果不佳常见设置问题:**
1.表格知识库,索[引列](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#JHLddkUVfos1QYxdc5Zcu1kgnmf)设置不准确。解决:需要把最接近用户提问内容的列设置为索引列;
2.知识库召回设置为按需调用,但是没有在提示词中设置调用方式。解决:可以切换为自动调用,或者在提示词中添加关于调用方式的描述;
3.知识库-最大召回数量,过大或过小。解决:可以先设置为5,然后根据对话效果逐步调整。
4.知识库-最小匹配值,过大或过小。解决:可以先设置在0.2-0.4之间,然后根据实际对话效果进行调整。
5.知识库-搜索策略,尝试切换模式进行测试,如果不确认可以先使用混合模式。
5.1语义模式:基于向量的文本相关性查询,推荐在需要理解语义关联度和跨语言查询的场景使用。
5.2全文模式:依赖于关键词的全文搜索,推荐在搜索具有特定名称、缩写词、短语或ID的场景使用。
5.3混合模式:结合全文检索与语义检索的优势,并对结果进行综合排序。
您还可以参考相关文档指南:
- 知识库介绍 https://www.Coze.cn/docs/guides/knowledge
- 知识库使用指南 https://www.Coze.cn/docs/guides/use_knowledge
- 知识库最佳实践 https://www.Coze.cn/docs/guides/product_knowledge_Bot
- 知识库社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#JHLddkUVfos1QYxdc5Zcu1kgnmf
知识库无法导入飞书文档
**关于无法导入飞书在线**文**档的问题,可以是**以**下原因导**致的:
- 您没有文档所有权(需要文档所有者才可以导入,管理者不行)
- 文档属于知识库/共享空间则无法进行导入,目前暂时只支持导入个人云空间下的文档
- 飞书文档由本地文档导入生成(暂时不支持此类文档)
- 文档权限设置,没有开启“允许内容被分享到组织外”
- 文档分享设置,没有开启“互联网获得链接的人可阅读”
- 扣子账号当前绑定的飞书账号,与您文档所归属的飞书账号不一致。您可以在扣子页面左下角点击头像-设置-数据源-授权(飞书)-点击获取当前应用-获取-授权并安装,然后返回扣子知识库导入页面,选择对应的飞书账号,导入文档。
如果您确认已满足以上要求,请提供知识库编辑页网址链接、相关飞书文档链接、相关截图,以便我们核实问题。
希望Bot只引用知识库内容
Bot编排页-知识库调用设置-找到“回复”,选择开启“自定义Prompt”
上传表格,服务器处理一直进度为0
目前上传表格到扣子知识库时,需要满足单行全部内容不超过2000字符,每个单元格的内容不超过1024字符。
如果您的文件已满足要求,可以提供以下信息,我们会进行问题排查:
知识库页面的网址链接
所上传原始文件一份(仅用于测试)
上传过程logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台;
2.新建一个知识库,进入文件上传页面,按 F12 键打开 开发者工具,点击顶部的 “Network”,在开发中工具左上角输入框输入“creat”;
3.上传文件直到复现问题;
4.在开发者工具中,点击下方搜出的信息(creat?ms..),在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
图像流
图像流教程[
官方教程 https://www.co](https://www.coze.cn/docs/guides/n1j2h6zx)ze.cn[/d](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#AxU2dgxmaoKUu3x34T2cxcdwnid)ocs/guides/n1j2h6zx
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#AxU2dgxmaoKUu3x34T2cxcdwnid
卡片
卡片教程
卡片教程
官方教[程-卡片 https://www.coze.cn](https://www.coze.cn/docs/guides/message_card)/docs[/g](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#R6kldymWaoS5puxwJK5cYlQ9n0e)uides/message_card
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#R6kldymWaoS5puxwJK5cYlQ9n0e
卡片绑定数组
需要在工作流代码节点中,点击数组变量并添加所有子节点,然后再进行卡片绑定。
数据库
数据库教程文档
官方文档:数据库 [https://www.coze.cn/](https://www.coze.cn/docs/guides/database)d[ocs/guides/database
C](https://www.bilibili.com/read/cv35570626/)oze工作[流【](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#RWPjdXPvjo54v2xrlPYc4jbHnmg)数据库】节点教程 https://www.bilibili.com/read/cv35570626/
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#RWPjdXPvjo54v2xrlPYc4jbHnmg
数据库查询/为什么在微信/豆包/飞书…记录了数据库,在扣子网页看不到对应记录
**1. 在**不同平台[使用扣子,所存储的数据库记](https://www.coze.cn/docs/guides/database)录[是相互隔离的,无法跨平台查询。
1.1 ](https://www.coze.cn/docs/guides/database)在Bot调试页右上角“Memory”,可以查询在扣子网页端对话产生的数据库记录,无法查询用户在其他平台对话的数据库记录。
1.2 查询自己在豆包/公众号/飞书等等所有非扣子网页端对话产生的数据库记录,需要在对应的平台,以对话的形式进行数据库的读/写/修改/删除操作。
2. 如果您是想在同一个平台增删改查其他用户的数据库信息,需要满足以下两个条件:
2.1 数据库开启多用户模式
2.2 通过工作流来管理数据库信息 https://www.Coze.cn/docs/guides/database
工作流试运行能查到数据,Bot里查不到 / Bot数据库有数据,工作流试运行查不到
工作流中的测试数据与 Bot 中的真实数据是隔离的。
1.在Bot调试页,无法调取工作流里的测试数据库信息。如果真实数据库为空,需要先插入数据后再进行查、删、改等操作。
2.在工作流中进行数据库节点测试时,无法调取Bot数据表中的真实数据。如果测试数据为空,需要先插入数据,再进行查、删、改等操作的测试。
数组变量批量插入数据库
关[于将数组变量批量插](https://www.coze.cn/docs/guides/use_workflow)入数据库,您可以参考这条SQL语句:insert into table_name (col1,col2,col3) values (v1-1,v2-1,v3-1),(v1-2,v2-2,v3-2)
批量插入在数据库节点拼SQL会比较麻烦,建议您通过代码节点来拼SQL语句,然后传到数据库节点。关于代码节点的使用,您暂时可以参考工作流相关通用教程中的代码节点部分,后续我们会更新专门的数据库相关代码节点教程文档。
数据库底层时间格式
数据库底层是用的 datetime 类型,带时分秒的。
工作流
工作流相关教程
工作流相关[教程](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#SDGYdohBpoLCdIxfbGEcheSYnBb):
工作流介绍 https://www.Coze.cn/docs/guides/workflow
使用工作流 https://www.Coze.cn/docs/guides/use_workflow
工作流最佳实践 https://www.Coze.cn/docs/guides/workflow_search_news
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#SDGYdohBpoLCdIxfbGEcheSYnBb
提高工作流调用率
可以按照以下方法提高工作流调用率:
- 在提示词加强限制,要求 “每次用工作流处理所有用户对话”,不需要填写其他引导内容;
- 在工作流介绍中增加描述信息,帮助大模型理解和成功调用工作流。
- 工作流名称简洁明了。
工作流超时限制
工作流单个节点有1分钟超时限制,工作流整体有2分钟超时限制,需要您根据要求调整配置,在限制的时间内完成运行。
批处理参考文档
批处理参考文档[ ](https://www.coze.com/docs/guides/llm_batch?_lang=zh)[https://www.Coze.com/docs/guide](https://www.coze.com/docs/guides/llm_batch?_lang=zh)s/llm_batch?_lang=zh
示例:以插件批处理为例,批处理的入参为实际的批处理入参,必须为数组 ; 红框二为每次运行的入参,以这里为例,每次运行的入参是getNews引入的每一项item
如何直接输出工作流内容,不经过bot处理
可以在结束节点中,开启“使用设定的内容直接回答”
插件
插件教程
插件相关教程
插件介绍 https://www.Coze.cn/docs/guides/create_plugin
教程:基于 API 创建一个插件 https://www.Coze.cn/docs/guides/plugin_example
基于已有服务创建插件 https://www.Coze.cn/docs/guides/services
使用 IDE 创建插件 https://www.Coze.cn/docs/guides/ide
通过 JSON 或 YAML 文件导入插件 https://www.Coze.cn/docs/guides/import
使用代码注册插件 https://www.Coze.cn/docs/guides/use_code
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#R7aRd9Gewo6SSCxu3LZc5wicnbF
如何创建Oauth模式插件
Oauth模式插件教程文档 [h](https://bytedance.larkoffice.com/docx/AIcddc7JLouM2bxvZ7pcSpsYncc)ttps://bytedance.larkoffice.com/docx/AIcddc7JLouM2bxvZ7pcSpsYncc
自建的插件试运行正常,在工作流中报错
可能是以下原因导致的:
1.插件服务本身运行不稳定,偶发报错;可以在插件试运行多尝试几次,进行优化调试;
2.插件运行超过1分钟,会触发工作流节点超时限制,需要优化插件配置,保持能在1分钟内稳定运行。
如果确认满足以上要求,可以提供以下信息,我们会进行问题排查
1.插件编辑页面的网址链接
2.插件编辑页面完整截图
3.工作流运行插件报错的logid
-- 打开 Chrome 浏览器,进入扣子平台
-- 打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
-- 工作流中点击【试运行】直到复现问题
-- 查看old_test header - logid
插件发布后可以调用,但是页面显示成功率为0%
插件需要上架商店后被使用,才会纳入成功率统计;
成功率是动态统计,当天的使用,最快需要第二天才会进入数据统计;
多Agent
多Agent跳转逻辑及优化
多Agen[t整体任务推进和](https://www.coze.cn/docs/guides/multiagent)节点切换,会由大模型根据Bot提示词、Agent提示词、Agent场景介绍信息,以及用户的输入内容,去尝试定义用户的使用场景,并调用适合的Agent来处理问题。
您可以参考多Agent文档对上述模块设置做整体优化:https://www.coze.cn/docs/guides/multiagent
1.在Bot提示词中设置详细的整体定位、功能和执行流程(每一步流程由哪个Agent执行)
2.在Agent适用场景中,详细介绍Agent的整体功能、定位和适用场景,帮助前序节点理解什么情况下应该切换到此节点。
例:
- 用于{功能},帮助用户解决{场景}相关的问题;
- 帮助用户解决健身相关的问题。
- 搜索景点并制定旅行规划。
- 根据用户要求生成图片。
3.在Agent提示词中,详细说明当前Agent的运行逻辑和处理问题的步骤。
4.在每个Agent中,设置“切换节点设置”,推荐“由独立于当前节点的模型识别”+“大模型语言”,并在“Prompt”中根据示例详细设置跳转逻辑。
5.设置全局跳转调试:添加节点-全局跳转条件。
6.在每个Agent中,尝试调整模型设置,降低生成随机性将可以让模型更严格遵守指令的要求(但会降低生成创新性)。
7.在每个Agent中,尝试切换不同模型进行测试使用。不同模型对不同场景的理解能力会有差异,可以具体测试,选择最适合当前场景的模型进行使用。
多Agent教程
[多Agent教程文档
官方文](https://www.coze.cn/docs/guides/multiagent)档:多 Agent 模式 https://www.Coze.cn/docs/guides/multiagent
使用Coze的muilt-agent驯服GPT-4 h[ttps://mp.weixin](https://www.bilibili.com/video/BV1MC411h7ok/).qq.com/s/sjRFE44cjBfn4p3[_3vv4vg
Multi-agent](https://www.bilibili.com/video/BV1Ew4m1S7eq) mode实践 | 用Coze手捏一个Bot https://mp.weixin.qq.com/s/YV7M7othSzMjKpm8xNHU-w
视频:分享一个在Coze上做提示词工程以及设计多智能体应用的最佳实践案例 https://www.bilibili.com/video/BV1MC411h7ok/
视频:【Agent共学第二期】Kai分享 | 一百个字搭谁是卧底-多Agent https://www.bilibili.com/video/BV1Ew4m1S7eq/
API
API发布报错
发布AP**I,需要先完成令**牌创建。ht**tps:**//www.Coze.cn/open
如果发布AP**I遇到报错,可以根据**以下常见原因进行排查:
[
- 配置 key 的时](http://api.coze.com/)候,权限需要覆盖当[前](https://www.coze.cn/docs/developer_guides/coze_api_overview) Bot 所在的空间;
- Bot 需要在自己所拥有的空间内创建,不要在他人空间内创建;
- 确保请求 header 中关于 body 格式的正确设置。Content-Type: application/json,注意大小写。
- 填写 key 和 Botid 时,不要添加{{}}
如果您确认满足以上条件,需要麻烦您在调用接口报错时,记录下接口的返回体 Header 中的 x-tt-logid 字段。提供该信息将有助于排查问题。在初次调用接口时,我们推荐使用接口调试工具( 比如 Postman 、Apifox 等) 发送一次请求,帮助您快速调通接口。
如果您未记录请求 id 信息, 需要麻烦您提供以下信息,以帮助我们定位问题:
请求的接口域名( 比如 api.Coze.com);
Bot_id;
调用接口传入的 query;
其他参考信息:
API 官方文档:https://www.Coze.cn/docs/developer_guides/Coze_api_overview
API是否支持输出语音
API能返回ogg格式的语音数据给用户,需用用户在自己的端内进行解析。
其他渠道
豆包
我的豆包智能体没有上传图片、拍照功能
关于豆包智能体的拍照、上传图片等功能,豆包官方目前没有对用户开放这些功能的白名单申请,只定向邀请极个别智能体开通了该功能。关于何时开通该类功能的申请,您可以持续关注豆包官方的最新动态,也可以直接咨询豆包官方:
反馈邮箱:feedback@mail.doubao.com
APP反馈:豆包APP,点击“我的” -> 点击右上角的设置按钮 -> 找到“帮助与反馈”,进行反馈咨询。
我的豆包智能体不能分享
只使用豆包模型+APP更新到最新版+等待豆包官方审核完成,就可以进行分享了
微信
公众号/订阅号总是提示“继续”
可以参考这里进行优化。受限于微信平台有15秒回复的要求,无法完全避免“继续”的情况 https://www.Coze.cn/docs/guides/wechat_subscription
发布服务号后无响应
**很高兴为您提****供协助。根据微信规则,目**前**服务号需要完成企业认证**后才能发布 Bot 使用。刚发布后可能会有10分钟左右延迟。
发布时,配置步骤需要遵循:先配置扣子,然后配置公众号。复制粘贴公众号AppID等内容时,请注意仔细检查,确保没有多余空格。正确配置成功后,大概会有10分钟左右的延迟,然后就可以进行正常对话。
如果您的账号满足条件,且已完成正确配置。需要麻烦您提供下 Bot 编辑页面网址链接和服务号的 AppID(wx开头的一段字符),我们的技术人员会进行问题排查。
发布到微信客服,提示“回调域名失败”
目前需要完成企业认证后才可以发布到微信客服(还在认证中也无法进行发布)。您也可以先发布到订阅号进行使用,没有认证要求。订阅号发布教程:https://www.Coze.cn/docs/guides/wechat_subscription
发布微信客服失败/无法使用
很高兴为您提供协助。关[于您反馈的问题,可以参考以下信息:
1.需要完成企业认证后才能](https://www.coze.cn/docs/guides/wechat_subscription)发布到微信客服进行使用[。若您没](https://kf.weixin.qq.com/)[有完成认](https://kf.weixin.qq.com/)证,也可以先发布到订[阅号进行](https://kf.weixin.qq.com/)使用(无认证要求)。订阅号发布教程:https://www.Coz[e.cn/docs/guides/wechat_subscr](https://www.coze.cn/docs/guides/content_principles)iption
2.目前扣子支持发布到微信客服,暂未支持发布到企业微信客服。如果您之前的操作是发布企业微信,则可以在微信客服重新进行发布使用。
3.如果您之前是发布微信客服遇到问题,则可以检查下复制相关字符内容时,是否存在多余空格。
4.Bot 发布会经过审核,如果还未通过审核,需要您耐心等待审核通过;如果您的发布申请被拒,需要您修改 Bot 配置后重新提交审核(审核规则参考:https://www.Coze.cn/docs/guides/content_principles)
5.Bot 成功发布到微信渠道后,可能会有10分钟左右延迟才会生效。
6.如果您确认操作没有问题,可以提供 Bot编辑页面网址链接、微信企业ID(ww开头的字符),我们会进行问题核查。
如何让微信客服/公众号的bot直接显示图片,而不是url
需要通过提示词限制Bot在输出图片时不要输出其他文字内容,才可以直接显示图片。
因为微信的限制,bot每次只能回复1条消息,如果同时存在文字和图片,图片就只能以url的形式存在,否则就变成2条消息违反微信规则了。
飞书
Bot发布飞书后需要管理员审核,找不到审核的页面
可以在这个页面进行审核 feishu.cn/admin/appCenter/audit
发布小程序
bot发布页,无法绑定小程序
发布小程序**需要满足**以下要求:
1.一[个 Bot 只能发布到一个微信小程序。
2.小程序主体类型为企业微信程序号。不支](https://developers.weixin.qq.com/miniprogram/product/record/record_guidelines.html)持个人主体的小程序。
3.[已](https://www.coze.cn/docs/guides/publish_to_wechat_app)完成微信小程序备案,备案流程可参考“微信开放平台文档” https://developers.weixin.qq.com/miniprogram/product/record/record_guidelines.html
更多内容,请参考教程文档:https://www.coze.cn/docs/guides/publish_to_wechat_app
发布微信小程序,需要备案证明
[可以在这里查看所需的备案编号等信息: https](https://www.coze.cn/docs/guides/terms-of-llm)://www.coze.cn/docs/guides/terms-of-llm
抖音评论区
发布到抖音评论区后,如何进行对话
在所发布的抖音账号的公开作品中,评论区直接评论作品,即可获得Bot回复;如果是回复其他人的评论,则需要@作者才可以获得回复。
目前Bot不会回复作者本人的评论,不会回复纯图片内容。
评论区Bot只会文字回复,无法生成图片内容。
二、logid查询
Bot 对话页
调试页面-logid
辛苦查询logid信息,复制发送给工作人员:
logid查询方式:
1.在扣子官网打开对应Bot的编辑页面,在对话框内提问直到复现问题
2.点击页面右上角“调试”-复制logid信息发送给工作人员
商店对话页logid
**logid查询方式:**
Chrome 浏览器打开Bot的商店页面
按 F12 打开开发者工具,点击顶部的 "Network"
Bot 对话框内提问,直到复现问题
在开发者工具中,查看chat接口请求头-logid
工作流、图像流
**工作流-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台
2.打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
3.工作流中点击【试运行】直到复现问题
4.查看old_test header - logid
图像流-logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台
2.打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
3.图像流中点击【试运行】直到复现问题
4.查看old_test header - logid
知识库
**知识库无法上传-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台;
2.新建一个知识库,进入文件上传页面先不要上传,按 F12 键打开 开发者工具,点击顶部的 "Network";
3.上传PDF文件直到复现问题;
4.在开发者工具中,在左上角输入框输入“upload”,点击下方搜出的信息,在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
**知识库无法分片-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台;
2.新建一个知识库,进入文件上传页面,按 F12 键打开 开发者工具,点击顶部的 “Network”,在开发中工具左上角输入框输入“creat”;
3.上传文件直到复现问题;
4.在开发者工具中,点击下方搜出的信息(creat?ms..),在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
插件
插件发布异常-logid
**logid查询****方**式:
1.打开 Chro**me 浏览器,****进入扣子平台,打开相关插件详**情页面
2、3.按 F12 键打开 开发者工具,点击顶部的 “Network”,在右侧输入框中,输入“publish”
4.点击插件发布按钮,进行发布操作
5、6.在开发者工具中,点击下方搜出的“publish_pligin”信息,在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
查询Bot发布状态
工作流试运行能查到数据,Bot里查不到 / Bot数据库有数据,工作流试运行查不到
工作流中的测试数据与 Bot 中的真实数据是隔离的。
1.在Bot调试页,无法调取工作流里的测试数据库信息。如果真实数据库为空,需要先插入数据后再进行查、删、改等操作。
2.在工作流中进行数据库节点测试时,无法调取Bot数据表中的真实数据。如果测试数据为空,需要先插入数据,再进行查、删、改等操作的测试。
数组变量批量插入数据库
关[于将数组变量批量插](https://www.coze.cn/docs/guides/use_workflow)入数据库,您可以参考这条SQL语句:insert into table_name (col1,col2,col3) values (v1-1,v2-1,v3-1),(v1-2,v2-2,v3-2)
批量插入在数据库节点拼SQL会比较麻烦,建议您通过代码节点来拼SQL语句,然后传到数据库节点。关于代码节点的使用,您暂时可以参考工作流相关通用教程中的代码节点部分,后续我们会更新专门的数据库相关代码节点教程文档。
数据库底层时间格式
数据库底层是用的 datetime 类型,带时分秒的。
工作流
工作流相关教程
工作流相关[教程](https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#SDGYdohBpoLCdIxfbGEcheSYnBb):
工作流介绍 https://www.Coze.cn/docs/guides/workflow
使用工作流 https://www.Coze.cn/docs/guides/use_workflow
工作流最佳实践 https://www.Coze.cn/docs/guides/workflow_search_news
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#SDGYdohBpoLCdIxfbGEcheSYnBb
提高工作流调用率
可以按照以下方法提高工作流调用率:
- 在提示词加强限制,要求 “每次用工作流处理所有用户对话”,不需要填写其他引导内容;
- 在工作流介绍中增加描述信息,帮助大模型理解和成功调用工作流。
- 工作流名称简洁明了。
工作流超时限制
工作流单个节点有1分钟超时限制,工作流整体有2分钟超时限制,需要您根据要求调整配置,在限制的时间内完成运行。
批处理参考文档
批处理参考文档[ ](https://www.coze.com/docs/guides/llm_batch?_lang=zh)[https://www.Coze.com/docs/guide](https://www.coze.com/docs/guides/llm_batch?_lang=zh)s/llm_batch?_lang=zh
示例:以插件批处理为例,批处理的入参为实际的批处理入参,必须为数组 ; 红框二为每次运行的入参,以这里为例,每次运行的入参是getNews引入的每一项item
如何直接输出工作流内容,不经过bot处理
可以在结束节点中,开启“使用设定的内容直接回答”
插件
插件教程
插件相关教程
插件介绍 https://www.Coze.cn/docs/guides/create_plugin
教程:基于 API 创建一个插件 https://www.Coze.cn/docs/guides/plugin_example
基于已有服务创建插件 https://www.Coze.cn/docs/guides/services
使用 IDE 创建插件 https://www.Coze.cn/docs/guides/ide
通过 JSON 或 YAML 文件导入插件 https://www.Coze.cn/docs/guides/import
使用代码注册插件 https://www.Coze.cn/docs/guides/use_code
社区案例 https://bytedance.larkoffice.com/docx/YNj2dVYo7o4L1Uxilq2c6A3Qnuc#R7aRd9Gewo6SSCxu3LZc5wicnbF
如何创建Oauth模式插件
Oauth模式插件教程文档 [h](https://bytedance.larkoffice.com/docx/AIcddc7JLouM2bxvZ7pcSpsYncc)ttps://bytedance.larkoffice.com/docx/AIcddc7JLouM2bxvZ7pcSpsYncc
自建的插件试运行正常,在工作流中报错
可能是以下原因导致的:
1.插件服务本身运行不稳定,偶发报错;可以在插件试运行多尝试几次,进行优化调试;
2.插件运行超过1分钟,会触发工作流节点超时限制,需要优化插件配置,保持能在1分钟内稳定运行。
如果确认满足以上要求,可以提供以下信息,我们会进行问题排查
1.插件编辑页面的网址链接
2.插件编辑页面完整截图
3.工作流运行插件报错的logid
-- 打开 Chrome 浏览器,进入扣子平台
-- 打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
-- 工作流中点击【试运行】直到复现问题
-- 查看old_test header - logid
插件发布后可以调用,但是页面显示成功率为0%
插件需要上架商店后被使用,才会纳入成功率统计;
成功率是动态统计,当天的使用,最快需要第二天才会进入数据统计;
多Agent
多Agent跳转逻辑及优化
多Agen[t整体任务推进和](https://www.coze.cn/docs/guides/multiagent)节点切换,会由大模型根据Bot提示词、Agent提示词、Agent场景介绍信息,以及用户的输入内容,去尝试定义用户的使用场景,并调用适合的Agent来处理问题。
您可以参考多Agent文档对上述模块设置做整体优化:https://www.coze.cn/docs/guides/multiagent
1.在Bot提示词中设置详细的整体定位、功能和执行流程(每一步流程由哪个Agent执行)
2.在Agent适用场景中,详细介绍Agent的整体功能、定位和适用场景,帮助前序节点理解什么情况下应该切换到此节点。
例:
- 用于{功能},帮助用户解决{场景}相关的问题;
- 帮助用户解决健身相关的问题。
- 搜索景点并制定旅行规划。
- 根据用户要求生成图片。
3.在Agent提示词中,详细说明当前Agent的运行逻辑和处理问题的步骤。
4.在每个Agent中,设置“切换节点设置”,推荐“由独立于当前节点的模型识别”+“大模型语言”,并在“Prompt”中根据示例详细设置跳转逻辑。
5.设置全局跳转调试:添加节点-全局跳转条件。
6.在每个Agent中,尝试调整模型设置,降低生成随机性将可以让模型更严格遵守指令的要求(但会降低生成创新性)。
7.在每个Agent中,尝试切换不同模型进行测试使用。不同模型对不同场景的理解能力会有差异,可以具体测试,选择最适合当前场景的模型进行使用。
多Agent教程
[多Agent教程文档
官方文](https://www.coze.cn/docs/guides/multiagent)档:多 Agent 模式 https://www.Coze.cn/docs/guides/multiagent
使用Coze的muilt-agent驯服GPT-4 h[ttps://mp.weixin](https://www.bilibili.com/video/BV1MC411h7ok/).qq.com/s/sjRFE44cjBfn4p3[_3vv4vg
Multi-agent](https://www.bilibili.com/video/BV1Ew4m1S7eq) mode实践 | 用Coze手捏一个Bot https://mp.weixin.qq.com/s/YV7M7othSzMjKpm8xNHU-w
视频:分享一个在Coze上做提示词工程以及设计多智能体应用的最佳实践案例 https://www.bilibili.com/video/BV1MC411h7ok/
视频:【Agent共学第二期】Kai分享 | 一百个字搭谁是卧底-多Agent https://www.bilibili.com/video/BV1Ew4m1S7eq/
API
API发布报错
发布AP**I,需要先完成令**牌创建。ht**tps:**//www.Coze.cn/open
如果发布AP**I遇到报错,可以根据**以下常见原因进行排查:
[
- 配置 key 的时](http://api.coze.com/)候,权限需要覆盖当[前](https://www.coze.cn/docs/developer_guides/coze_api_overview) Bot 所在的空间;
- Bot 需要在自己所拥有的空间内创建,不要在他人空间内创建;
- 确保请求 header 中关于 body 格式的正确设置。Content-Type: application/json,注意大小写。
- 填写 key 和 Botid 时,不要添加{{}}
如果您确认满足以上条件,需要麻烦您在调用接口报错时,记录下接口的返回体 Header 中的 x-tt-logid 字段。提供该信息将有助于排查问题。在初次调用接口时,我们推荐使用接口调试工具( 比如 Postman 、Apifox 等) 发送一次请求,帮助您快速调通接口。
如果您未记录请求 id 信息, 需要麻烦您提供以下信息,以帮助我们定位问题:
请求的接口域名( 比如 api.Coze.com);
Bot_id;
调用接口传入的 query;
其他参考信息:
API 官方文档:https://www.Coze.cn/docs/developer_guides/Coze_api_overview
API是否支持输出语音
API能返回ogg格式的语音数据给用户,需用用户在自己的端内进行解析。
其他渠道
豆包
我的豆包智能体没有上传图片、拍照功能
关于豆包智能体的拍照、上传图片等功能,豆包官方目前没有对用户开放这些功能的白名单申请,只定向邀请极个别智能体开通了该功能。关于何时开通该类功能的申请,您可以持续关注豆包官方的最新动态,也可以直接咨询豆包官方:
反馈邮箱:feedback@mail.doubao.com
APP反馈:豆包APP,点击“我的” -> 点击右上角的设置按钮 -> 找到“帮助与反馈”,进行反馈咨询。
我的豆包智能体不能分享
只使用豆包模型+APP更新到最新版+等待豆包官方审核完成,就可以进行分享了
微信
公众号/订阅号总是提示“继续”
可以参考这里进行优化。受限于微信平台有15秒回复的要求,无法完全避免“继续”的情况 https://www.Coze.cn/docs/guides/wechat_subscription
发布服务号后无响应
**很高兴为您提****供协助。根据微信规则,目**前**服务号需要完成企业认证**后才能发布 Bot 使用。刚发布后可能会有10分钟左右延迟。
发布时,配置步骤需要遵循:先配置扣子,然后配置公众号。复制粘贴公众号AppID等内容时,请注意仔细检查,确保没有多余空格。正确配置成功后,大概会有10分钟左右的延迟,然后就可以进行正常对话。
如果您的账号满足条件,且已完成正确配置。需要麻烦您提供下 Bot 编辑页面网址链接和服务号的 AppID(wx开头的一段字符),我们的技术人员会进行问题排查。
发布到微信客服,提示“回调域名失败”
目前需要完成企业认证后才可以发布到微信客服(还在认证中也无法进行发布)。您也可以先发布到订阅号进行使用,没有认证要求。订阅号发布教程:https://www.Coze.cn/docs/guides/wechat_subscription
发布微信客服失败/无法使用
很高兴为您提供协助。关[于您反馈的问题,可以参考以下信息:
1.需要完成企业认证后才能](https://www.coze.cn/docs/guides/wechat_subscription)发布到微信客服进行使用[。若您没](https://kf.weixin.qq.com/)[有完成认](https://kf.weixin.qq.com/)证,也可以先发布到订[阅号进行](https://kf.weixin.qq.com/)使用(无认证要求)。订阅号发布教程:https://www.Coz[e.cn/docs/guides/wechat_subscr](https://www.coze.cn/docs/guides/content_principles)iption
2.目前扣子支持发布到微信客服,暂未支持发布到企业微信客服。如果您之前的操作是发布企业微信,则可以在微信客服重新进行发布使用。
3.如果您之前是发布微信客服遇到问题,则可以检查下复制相关字符内容时,是否存在多余空格。
4.Bot 发布会经过审核,如果还未通过审核,需要您耐心等待审核通过;如果您的发布申请被拒,需要您修改 Bot 配置后重新提交审核(审核规则参考:https://www.Coze.cn/docs/guides/content_principles)
5.Bot 成功发布到微信渠道后,可能会有10分钟左右延迟才会生效。
6.如果您确认操作没有问题,可以提供 Bot编辑页面网址链接、微信企业ID(ww开头的字符),我们会进行问题核查。
如何让微信客服/公众号的bot直接显示图片,而不是url
需要通过提示词限制Bot在输出图片时不要输出其他文字内容,才可以直接显示图片。
因为微信的限制,bot每次只能回复1条消息,如果同时存在文字和图片,图片就只能以url的形式存在,否则就变成2条消息违反微信规则了。
飞书
Bot发布飞书后需要管理员审核,找不到审核的页面
可以在这个页面进行审核 feishu.cn/admin/appCenter/audit
发布小程序
bot发布页,无法绑定小程序
发布小程序**需要满足**以下要求:
1.一[个 Bot 只能发布到一个微信小程序。
2.小程序主体类型为企业微信程序号。不支](https://developers.weixin.qq.com/miniprogram/product/record/record_guidelines.html)持个人主体的小程序。
3.[已](https://www.coze.cn/docs/guides/publish_to_wechat_app)完成微信小程序备案,备案流程可参考“微信开放平台文档” https://developers.weixin.qq.com/miniprogram/product/record/record_guidelines.html
更多内容,请参考教程文档:https://www.coze.cn/docs/guides/publish_to_wechat_app
发布微信小程序,需要备案证明
[可以在这里查看所需的备案编号等信息: https](https://www.coze.cn/docs/guides/terms-of-llm)://www.coze.cn/docs/guides/terms-of-llm
抖音评论区
发布到抖音评论区后,如何进行对话
在所发布的抖音账号的公开作品中,评论区直接评论作品,即可获得Bot回复;如果是回复其他人的评论,则需要@作者才可以获得回复。
目前Bot不会回复作者本人的评论,不会回复纯图片内容。
评论区Bot只会文字回复,无法生成图片内容。
二、logid查询
Bot 对话页
调试页面-logid
辛苦查询logid信息,复制发送给工作人员:
logid查询方式:
1.在扣子官网打开对应Bot的编辑页面,在对话框内提问直到复现问题
2.点击页面右上角“调试”-复制logid信息发送给工作人员
商店对话页logid
**logid查询方式:**
Chrome 浏览器打开Bot的商店页面
按 F12 打开开发者工具,点击顶部的 "Network"
Bot 对话框内提问,直到复现问题
在开发者工具中,查看chat接口请求头-logid
工作流、图像流
**工作流-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台
2.打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
3.工作流中点击【试运行】直到复现问题
4.查看old_test header - logid
图像流-logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台
2.打开遇到问题/报错的页面,按 F12 打开开发者工具,点击顶部的【Network】
3.图像流中点击【试运行】直到复现问题
4.查看old_test header - logid
知识库
**知识库无法上传-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台;
2.新建一个知识库,进入文件上传页面先不要上传,按 F12 键打开 开发者工具,点击顶部的 "Network";
3.上传PDF文件直到复现问题;
4.在开发者工具中,在左上角输入框输入“upload”,点击下方搜出的信息,在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
**知识库无法分片-**logid
logid查询方式:
1.打开 Chrome 浏览器,进入扣子平台;
2.新建一个知识库,进入文件上传页面,按 F12 键打开 开发者工具,点击顶部的 “Network”,在开发中工具左上角输入框输入“creat”;
3.上传文件直到复现问题;
4.在开发者工具中,点击下方搜出的信息(creat?ms..),在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
插件
插件发布异常-logid
**logid查询****方**式:
1.打开 Chro**me 浏览器,****进入扣子平台,打开相关插件详**情页面
2、3.按 F12 键打开 开发者工具,点击顶部的 “Network”,在右侧输入框中,输入“publish”
4.点击插件发布按钮,进行发布操作
5、6.在开发者工具中,点击下方搜出的“publish_pligin”信息,在右侧下滑查看X-Tt-Logid,将该串数字复制发送给扣子工作人员。
查询Bot发布状态
Coze优化排名服务指南
来源:https://bluefocus.feishu.cn/docx/PPz8dDG70ombJSxyF6Jceyycntf
本报价单旨在提供一项专为开发者设计的服务,旨在优化您在Coze平台上的bot排名,确保您的bot在推荐榜单中获得更高的位置。通过我们的专业优化服务,您将能够:
-
提升曝光率:我们利用先进的算法和策略,提升您的bot在Coze推荐榜单上的排名,增加其曝光率和用户访问量。
-
增加用户互动:通过提高排名,吸引更多用户与您的bot互动,提升用户参与度和满意度。
-
实现商业变现:更高的排名和更多的用户互动,将直接促进您的bot实现更好的商业变现效果。
我们承诺为您的bot提供最佳的排名优化方案,并提供持续的支持和服务,确保您的bot能够在激烈的市场竞争中脱颖而出。
如果您对我们的服务有任何疑问或需要进一步了解,请随时与我们联系。我们期待与您合作,共同提升您的bot在Coze平台上的表现。
联系方式
wx:jin_yucheng
邮箱:yucheng.jin@bluefocus.com
coze国内版插件汇总
来源:https://bluefocus.feishu.cn/docx/NyqQdmdaRohYG9xeCdncPAZ3nch
目前国内版总共有多少个插件?都有什么插件?
是首页商店看到的这个 36个 吗?
是,它们叫 插件,但在 工作流 里,我们用到的是 插件工具!!!比如这个 文生图 的 插件:
它包含了三个 插件工具,前面讲过 插件和节点 的本质都是 API接口调用的封装,那么插件和插件工具的区别:
答:插件指定** →【B**aseUrl + 默认请求头】,插件工具 指定 → 【调用接口、输入/输出参数】
🐶 所以,使用同一插件的不同插件工具,本质上就是调用 同一域名下的不同的接口。😄 好,修正下问题:
国内版总共有多少个插件工具?
😑 官方****并没有说明,想知道得自己统计,在折腾工具流时,我发现 插件搜索 并没那么好用,比如,我想要用 文生图 的 插件,搜 “图”:
明显是根据 插件名 来匹配的,支持文生图的 ByteArtist 插件就没显示出来。😳 另外,我之前好像看到官方的Bot的工作流用到了 隐藏插件,用户 没法直接搜到,但是可以通过 间接的方式来使用它:
打开官方Bot的工作流,点击右上角 创建副本 来拷贝工作流到自己的工作空间,就可以用它了。2333,之前云雀大模型抽风的时候,群里有人有人通过这样的方式拷贝了 更牛批的 Seed大模型。😄 不过现在不行了,默认只能用云雀了,如果想调其它大模型,可以在代码节点使用 request_async库 来调用第三方的API来实现。
😆 综上,笔者想做的事情就是:
-
统计能搜到插件工具,做下汇总输出,方便Bot玩家对内置插件工具进行检索,快速找到心仪的工具。
-
发掘下官方Bot的工作流中有没有隐藏的插件工具。
🤡 手动统计肯定是不可能的,爬虫走一波~
- 爬取思路
😜 先调皮下,搭个Bot,看用 LinkReaderPlugin插件 能否直接提取,写下简易提示词:
试试:
🤣 哈哈哈,明显不行,需要登录,F12看下请求:
看到 msToken 这么长的加密参数,就不用想接口模拟了。数据量不大,浏览器自动化(selenium) + 请求拦截(BrowserMob Proxy) 走一波看看,随手写下爬取代码:
代码解读
复制代码
import osimport timefrom browsermobproxy import Serverfrom selenium import webdriverimport cp_utilscoze_save_dir = os.path.join(os.getcwd(), "coze")explore_list_file = os.path.join(coze_save_dir, "explore_list.txt")def init_browser(): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('ignore-certificate-errors') 无视证书验证 chrome_options.add_argument('--start-maximized') 开始时直接最大屏幕 chrome_options.add_argument(r'--user-data-dir=D:\ChromeUserData') 设置用户数据目录,避免每次登陆 chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy)) 设置请求的代理 return webdriver.Chrome(options=chrome_options)模拟登陆,只需调用一次,以后登陆失效了主动调用下就好def login(): browser.get("https://www.coze.cn/home")获取Bots列表def get_explore_list(): proxy.new_har("get_explore_list", options={ 'captureContent': True, 'captureHeaders': True }) browser.get('https://www.coze.cn/explore') time.sleep(5) result = proxy.har for entry in result['log']['entries']: if entry['request']['url'].find('/explore/get_explore_list') != -1: content = entry['response']['content'] print(content) with open(explore_list_file, "w+", encoding='utf-8') as f: f.write(content['text']) print(explore_list_file, " 文件写入完毕...") proxy.close() browser.close()if name == '__main__': cp_utils.is_dir_existed(coze_save_dir) server = Server(os.path.join(os.getcwd(), r'browsermob-proxy-2.1.4\bin\browsermob-proxy')) server.start() proxy = server.create_proxy({'trustAllServers': True}) browser = init_browser() login() get_explore_list()
先调login(),完成登录后关闭浏览器,注释掉,调用get_explore_list(),此时打开浏览器就处于登录态了,拦截包含 /explore/get_explore_list 字符串的URL,保存text到本地。运行后报错:
没有text,难道是 二进制数据?proxy.new_har的option参数再加个 ‘captureBinaryContent’: True,运行:
🙃 淦,读是能读到了,但text这字符串明显就是 字符串加密 + Base64 啊,yue了,但打开 浏览器 数据确是正常的:
明显是执行某个解密js后加载出来的,破解就算了🙃,先不谈水平不够,浪费时间之余意义不大。
-
😑 那 自**动化+Xpath抠页面节点 **?算了吧,又low又费劲,无计可施才会用这个方法。
-
🤔️感觉得搞个C**hrome插件 **做下接口监听了,但那是我的知识盲区…
-
🤨 说到Chrome插件,突然想到一个神级插件 → Tampermonkey(油猴/篡改猴)。会点js看下文档就能耍,简单瞄了下《油猴开发指南》,看了几个案例,加之这里的需求也比较简单:请求加载url、监听特定url的响应内容,保存数据到本地。
-
😏 感觉应该不复杂,而且有GPT加持,可以一试
-
😄 浏览器装下 油**猴 **插件,直接开始边写代码边测试~
2.1. 浏览器跳特定URL
直接设置下 window.location.href 的属性就好了,代码如下:
JavaScript
代码解读
复制代码
// ==UserScript==// @name 扣子插件工具信息爬取// @namespace http://tampermonkey.net/// @version 2024-02-21// @description try to take over the world!// @author CoderPig// @match https://www.coze.cn/*// @grant GM_xmlhttpRequest// ==/UserScript==(function() { 'use strict'; console.log('插件加载...') // 浏览器跳转特定url function locationUrl(url) { window.location.href = url; } // 脚本加载后3s跳转掘金 setTimeout(function() { locationUrl("https://juejin.cn/"); }, 3000);}
运行后,控制台输出 插件加载中… 3s后自动跳转掘金。对了,如果是想发起一个请求不跳转,可以使用 Tampermonkey 提供的API → GM_xmlhttpRequest,用于发起跨域 HTTP(S) 请求。它的参数是一个对象,包含了 请求的各种设置。可选参数如下:
-
method :HTTP 请求方法,如 “GET”、“POST” 等。
-
url :请求的 URL。
-
headers :一个包含 HTTP 请求头的对象,如:{ “Content-Type”: “application/x-www-form-urlencoded” }。
-
data :要发送的数据。只有在 method 为 “POST” 时才会使用。
-
binary :如果为 true,responseText 将包含未处理的二进制数据。
-
timeout :请求超时时间,单位为毫秒。如果在这段时间内没有收到响应,将触发 ontimeout 事件。
-
context :一个可以在回调函数中使用的值,这个值会在调用回调函数时作为 this 参数传入。
-
responseType :期望的响应类型。可能的值有 “arraybuffer”、“blob”、“json” 等。
-
overrideMimeType :覆盖响应的 MIME 类型。
-
anonymous :如果为 true,请求将不会发送 cookies 或 HTTP 认证信息。
然后是可选的 回调函数:
-
onload:请求成功时调用的函数。
-
onerror:请求失败时调用的函数。
-
onreadystatechange:当 readyState 值改变时调用的函数。
-
ontimeout:请求超时时调用的函数。
上述回调函数都会接收一个响应对象,包含下述属性:
-
responseText:服务器的响应文本。
-
responseXML:如果服务器的响应是一个 XML 文档,这个属性将包含该文档。
-
response:服务器的响应。其类型由 responseType 参数决定。
-
status:服务器的响应状态码。
-
statusText:服务器的响应状态文本。
-
readyState:请求的当前状态。可能的值有 0(未初始化)、1(已打开)、2(已发送头部)、3(正在接收响应)、4(已完成)。
-
finalUrl:响应的最终 URL,考虑到可能的重定向。
一个发起请求,并在请求成功后,显示响应文本的简单代码示例如下:
JavaScript
代码解读
复制代码
// 浏览器发起请求 function sendRequest(url) { GM_xmlhttpRequest({ method: "GET", url: url, onload: function(response) { console.log(response.responseText); } }); }
2.2. 监听特定URL的响应数据
通过重写 XMLHt****tpRequest.prototype.open() 方法,在请求发起前对其进行拦截和修改。判断url中如果包含特定字符串,给当前的 XMLHttpRequest 对象添加一个 load 的事件监听器,请求完成时会触发回调,在这里获取响应数据。代码如下:
JavaScript
代码解读
复制代码
// 拦截url中有特定关键词的请求并下载响应内容function interceptAndSaveResponse(keyword) { var originalOpen = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function() { if (arguments[1].includes(keyword)) { this.addEventListener('load', function() { console.log('监听到请求,响应结果:', this.responseText); }, false); } return originalOpen.apply(this, arguments); };}interceptAndSaveResponse("explore/get_explore_list")
保存脚本,刷新页面,控制台可以看到请求的响应结果被打印出来了:
2.3. 下载响应数据到本地
油猴提供了 GM_download 函数 → 使用浏览器的默认下载器进行下载,官方文档 给出了代码示例:
但,这个函数只能处理url**,不支持直接**保存其它数据,这里需要先创建一个 Blob对象 并获取它的URL:
JavaScript
代码解读
复制代码
// 拦截url中有特定关键词的请求并下载响应内容 function interceptAndSaveResponse(keyword) { var originalOpen = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function() { if (arguments[1].includes(keyword)) { this.addEventListener('load', function() { console.log('监听到请求', arguments[1]); // 创建Blob块并获取该Blob对象的URL var blob = new Blob([this.responseText], {type: 'application/json;charset=utf-8'}); var blobUrl = URL.createObjectURL(blob); console.log('文件的url', blobUrl); GM_download({ url: blobUrl, name: "response.json", saveAs: false, }); // 下载完释放URL避免内存泄露 URL.revokeObjectURL(blobUrl); }, false); } return originalOpen.apply(this, arguments); }; }
运行后,控制台能看到创建的Blob对象的url:
注释掉URL.revokeObjectURL(blobUrl)运行,打开url也能看到文件内容,但文件并没有下载,应该是报错了。GM_download里设置下 onerror 参数,打印下下载失败的而原因:
JavaScript
代码解读
复制代码
onerror: function (error) { //下载错误回调 console.log(error)},
保存脚本后刷新页面,控制台输出错误信息如下:
查询文档得知:
出于安全原因,文件扩展名需要在Tampermonkey的选项页面中进行白名单设置。not_whitelisted - 请求的文件扩展名未列入白名单。
我们保存文件的扩展名是 .json,需要把它添加到白名单中,具体操作:
打开油猴插件的设置** → 通用 → 配置模式 → 点击下拉选中 高级 →** 定位到 下载BETA → 文件扩展名白名单中加上 .json
保存后,再次刷新页面,json文件就自动下载到本地啦~
😁 行吧,使用油猴爬XHR的关键三步都已经跑通,接着执行具体的爬取过程~
- 爬取过程
3.1. 能搜到插件工具
浏览器F12开下抓包,访问首页 商店-插件,搜索 必应搜索
定位到请求url为:
bash
代码解读
复制代码
/marketplace/product/list?entity_type=2&sort_type=1&page_num=1&page_size=20&keyword=&msToken=xxx
直接调用函数:
JavaScript
代码解读
复制代码
interceptAndSaveResponse("marketplace/product/list?entity_type=2")
做了分页加载,需要手动滑下页面到底部,触发第二页的加载,合并下两个json文件,总共有36个插件:
不难看出这个 plugin_extra/tools 里的就是插件列表了
接着写下python脚本解析下json,抠下想要的数据,最终结果以列表的形式输出,包含三个字段:插件工具名、所属插件、工具作用,没啥难度,直接写出Python代码:
JavaScript
代码解读
复制代码
def fetch_index_plugins_info(): json_file = 'coze_index_plugins.json' plugins = json.loads(read_file_text_content(json_file))['data']['products'] result_str = "|**插件工具名**|**所属插件**|**工具作用**|\n|:----|:----|:----|\n" for plugin in plugins: meta_info = plugin['meta_info'] for tool in plugin['plugin_extra']['tools']: result_str += "|**{}**|{}|{}|\n".format(tool['name'], meta_info['name'], tool['description'].replace("\n", "\t")) print(result_str)
运行输出结果如下 (共计68个插件工具):
3.2. 官方Bot工作流中的隐藏插件工具
改下脚本的传参:interceptAndSaveResponse(“explore/get_explore_list”) ,刷新页面,滑动到底部,合并下两个json文件。这里没法拿到Bot的信息,主要是获取 Bot ID,然后跳转Bot详细信息页:explore/{Bot ID} 。抓包看到跳转详情页后,有两个接口可以获得工作流相关的信息:
看了下数据差不多,点击 工作流 跳转 工作流详情页,跳转后的URL是这样的:
work_flow?from=explore&space_id=7330891910967525417&workflow_id=7337224205123239971
两个可能变化的参数:
-
workflow_id:明显就是工作流id,前面可以获取到。
-
space_id:工作流所属的团队空间id,打开了另外一个官方Bot的工作流,发现也是这个值,7330891910967525417 估计就是扣子团队空间的id了,直接写死就好。
进入工作流详情页后,api/workflowV2/query 请求的 schema_json字段 能拿到所有节点的信息:
可以过滤 type=4** 的插件节点(1**为起始、2为结束、3为LLM),然后关注 subtitle 字段就行了~
3.2.1. 提取Bot ID
接着写代码时间,python处理下首页bot的数据,提取下bot名称和id,打印一句定义js数组的代码:
scss
代码解读
复制代码
def fetch_bot_ids_list(): json_file = 'coze_index_bots_info.json' bots = json.loads(read_file_text_content(json_file))['data']['bot_draft_list'] result_str = "const botInfoArray = [" for bot in bots: result_str += '"{}-{}",'.format(bot['id'], bot['name']) print(result_str[:-1] + "]")
运行输出结果:
3.2.2. 遍历获取Bot详情数据
接**着新开一个油猴****脚本,CV下上面生成的**数组,**这里不能直接定义ind**ex,因为每次页面加载时,都会重新运行脚本,从而导致死循环。需要做下 跨页面状态保存, Tampermonkey 提供了两个API → GM_setValue 和 GM_getValue,@grant那里声明下这两个函数,就可以开搞了,直接写出js代码:
代码解读
复制代码
// ==UserScript==// @name 爬取Coze Bot详细信息// @namespace http://tampermonkey.net/// @version 2024-02-21// @description try to take over the world!// @author CoderPig// @match *://*/*// @grant GM_xmlhttpRequest// @grant GM_download// @grant GM_setValue// @grant GM_getValue// ==/UserScript==(function() { 'use strict'; console.log('爬取Bot信息的插件加载...') const botInfoArray = ["7337223627307401231-工作规划大师","7332475242608246821-新春萌宠大拜年","7332511402818846755-龙年守护灵","7332899804240150562-东北大哥拜年啦","7332511402818666531-龙年限量盲盒","7332907205143953442-我是一只龙","7326151847062945818-旅游大师","7334216846788558860-逼婚大挑战","7330080702177787941-春联大王","7331804785265475618-相亲模拟器(女生版)","7325774753346650139-看图讲故事","7330496997293752359-卡通头像","7330306326565830682-米其林星探","7327691806693490724-简历诊断","7330217698355544115-小红书文案输出大师","7329855229166600204-马歇尔音箱粉丝","7330292680737423411-求职助手","7329857057623031847-MBTI性格专家","7328607141122670626-快递查询助手","7328364654592573467-书法老师","7326166527584157746-公司分析助手","7330144269849886747-穿越二次元","7332430138480607247-本子上的游戏","7326604198378831923-数学老师","7330070214572392485-周报不用写","7330144975906258995-SWOT专家","7330144975906422835-山顶洞人","7328609700545855523-小冒险家","7328709492403634191-购车小帮手","7325772186130874418-论文搜索助手","7328064633946816563-图书旅人","7328749946491076642-天蓬元帅猪八戒","7326127566006468617-健康饮食","7326149183642140709-尾尾小阿姨","7325782706489491482-足球大师","7325765993006006282-占星师"] // 拦截bot信息 function interceptRequests() { const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function (method, url) { if (url.includes('draftbot/get_bot_info')) { this.addEventListener('load', function () { var blob = new Blob([this.responseText], {type: 'application/json;charset=utf-8'}); var blobUrl = URL.createObjectURL(blob); const currentIndex = GM_getValue('currentIndex', 0) - 1; const infoArray = botInfoArray[currentIndex].split("-"); // 拼接文件名 const fileName = `${infoArray[1]}_${infoArray[0]}.json` console.log('文件的url', blobUrl); GM_download({ url: blobUrl, name: fileName, saveAs: false }); }); } originalOpen.apply(this, arguments); }; } // 跳转到下一个页面 function navigateToNextUrl() { const currentIndex = GM_getValue('currentIndex', 0); if (currentIndex >= botInfoArray.length) { return; } // 拼接Bot详情页URL const nextUrl = "https://www.coze.cn/explore/"botInfoArray[currentIndex].split("-")[0]; console.log(nextUrl); setTimeout(() => { window.location.href = nextUrl; GM_setValue('currentIndex', currentIndex + 1); }, 3000); // 3秒跳转一次 } interceptRequests(); navigateToNextUrl();})();
随便打开一个新的网页,每个3s会自动跳转一个页面,拦截到 draftbot/get_bot_info 的XHR请求会自动下载。
😏 Nice,36个全爬下来了,接着Python脚本遍历下有工作流的Bot,并提取出工作流ID~
3.2.3. Bot工作流ID提取
遍历json文件,然后抠字段而已,直接写出代码:
JavaScript
代码解读
复制代码
def filter_workflow_id_list(): # 读取所有Json文件 json_file_list = search_all_file(os.path.join(os.getcwd(), "bot_detail"), ".json") for json_file in json_file_list: data = json.loads(read_file_text_content(json_file))['data'] workflow_list = json.loads(data['work_info']['workflow']) # 只输出有工作流的Bot if len(workflow_list) > 0: # 遍历工作流列表 (看下有哪些Bot有多个工作流) for workflow in workflow_list: print("【{}】{}".format(data['name'], workflow))
运行结果如下:
行吧,只有这12个Bot有工作流,而且都只有一个工作流,接着访问这些工作流详情,提取节点信息~
3.2.4. 提取插件节点信息
稍微改下上面的输出,返回一个js数组,每个字符串的组成:Bot名-工作流名称-工作流ID:
新建一个油猴脚本,CV下上面的代码,稍微改改:
JavaScript
代码解读
复制代码
(function() { 'use strict'; console.log('爬取工作流信息的插件加载...') const workflowInfoArray = ["龙年守护灵-Lucky_Dragon_Girl-7332517540213768244","图书旅人-recommend_book-7328085556632600626","工作规划大师-creat_doc-7337224205123239971","龙年限量盲盒-dragon-7332516682319249408","本子上的游戏-game-7332431820975423503","工作规划大师-creat_doc-7337224205123239971","我是一只龙-create_image-7332914063535538216","穿越二次元-cross-7330147381364801573","相亲模拟器(女生版)-characters_appear-7331804700762832911","卡通头像-Avatar001-7330497573985239081","购车小帮手-search_car-7328713305206292495","旅游大师-recommended_places-7326176553195339802"] // 拦截bot信息 function interceptRequests() { const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function (method, url) { if (url.includes('workflowV2/query')) { this.addEventListener('load', function () { var blob = new Blob([this.responseText], {type: 'application/json;charset=utf-8'}); var blobUrl = URL.createObjectURL(blob); const currentIndex = GM_getValue('currentIndex', 0) - 1; const infoArray = workflowInfoArray[currentIndex].split("-"); // 拼接文件名 const fileName = `${infoArray[0]}_${infoArray[1]}.json` console.log('文件的url', blobUrl); GM_download({ url: blobUrl, name: fileName, saveAs: false }); }); } originalOpen.apply(this, arguments); }; } // 跳转到下一个页面 function navigateToNextUrl() { const currentIndex = GM_getValue('currentIndex', 0); if (currentIndex >= workflowInfoArray.length) { return; } // 拼接Bot详情页URL const nextUrl = "https://www.coze.cn/work_flow?from=explore&space_id=7330891910967525417&workflow_id="workflowInfoArray[currentIndex].split("-")[2]; console.log(nextUrl); setTimeout(() => { window.location.href = nextUrl; GM_setValue('currentIndex', currentIndex + 1); }, 3000); // 3秒跳转一次 } interceptRequests(); navigateToNextUrl();})();
运行后,随便打开一个网页,装杯水回来就好了:
写个脚本筛一筛,看这些工作流都用到了什么插件:
JavaScript
代码解读
复制代码
def filter_workflow_plugin_list(): # 读取所有Json文件 json_file_list = search_all_file(os.path.join(os.getcwd(), "workflow_detail"), ".json") for json_file in json_file_list: schema = json.loads(json.loads(read_file_text_content(json_file))['data']['workflow']['schema_json']) for node in schema['nodes']: # 过滤插件节点,输出子标题 if node['type'] == "4": print("【{}】 → {}".format(json_file.split(os.path.sep)[-1].replace(".json", ""), node['data']['nodeMeta']['subtitle']))
运行输出结果:
🤡 好吧,都****是能搜到的插件工具,并没有发现 隐藏插件工具,试下把type改为 3,打印下 大模型节点 的模型信息,看看有没有什么惊喜:
😏 懂得都懂。行吧,关于内置插件工具的统计分析就到这,最后写个脚本,把每个Bot的提示词汇总下,输出一个md文件,闲着没事可以学学怎么写prompt。
JavaScript
代码解读
复制代码
def generate_prompts_md(): json_file_list = search_all_file(os.path.join(os.getcwd(), "bot_detail"), ".json") md_content = "# Coze(扣子)-官方Bots提示词汇总\n" for json_file in json_file_list: data = json.loads(read_file_text_content(json_file))['data'] md_content += "\n## {}\n\n".format(data['name']) prompt_list = json.loads(data['work_info']['system_info_all']) md_content += '\n{}\n\n---\n'.format(prompt_list[0]['data']) write_text_to_file(md_content, "coze_bots_prompts.md")
生成md文件如下:
😁 取需:《coze_bots_prompts.md》
作者:coder_pig
链接:https://juejin.cn/post/7338229082923122703
来源:稀土掘金
最后
如果本文对你有帮助或对AI Agent感兴趣,可以联系我们或者加入我们的AI洞察中心交流群~
- 当然我也很希望看到你根据本文亲手捏的应用,联系我!我一定为你点赞👍
参考资料:AI Agent 智能体榜单
官方群聊
智能体搭建交流群
bot互助群
如果您想与高手切磋,与AI爱好者一起热烈讨论,发表观点,分享作品,欢迎加入我们的官方群聊
智能体搭建交流群:智能体搭建的互助交流群,群里有coze、扣子等各路技术流大佬实时解答技术问题,想交流的欢迎进群
如果您想与更多让自己制作的智能体冲上热门推荐页,获得更多曝光,欢迎加入由bot创建爱好者自发建立的bot互助群
AI Agent深度文章
来源:https://bluefocus.feishu.cn/docx/VDMbdAdkLoKdKOxp1thcg04vnng
何谓Agent,为何Agent?
来源:https://bluefocus.feishu.cn/docx/NFkldViqZo1BmHxUrukcGf8EnXg
原文地址:https://mp.weixin.qq.com/s/jFf0fmZLehLDaNNzgqeAIQ
浅看是LLM造就了AI应用
深入思考才发现是AI应用救赎了LLM
归根到底是LLM还不足够强大
**<Human in the loop **>将会成为未来主流,未来无标品只有定制化
AI应用层出不穷爆发式涌现出来,在深思护城河深度之后,市场的玩家齐刷刷地转向到AI Agent
是模型能力的不断提升?还是资方的倒逼?本质上是每个人都想有解决特定任务的AI
在探寻了算法,工程,数据等核心要素价值后,AI应用设计方到底能抓住什么呢?
场景的不断探索,又带来了什么?不可能三角中,市场更加看好的又是什么呢?
生成式AI的评级—@ZhenFund
根据AI App的智能化能力和解决问题的能力进行等级划分及整体描述,我们可以近似得到以上的能力划分表。随着智能化的程度递增,App能解决的问题范围也逐渐在扩大。
LLM的过渡状态:
操作工具➡建议者➡执行者➡控制器(决策者)➡高级智能体
角色的变化背后是智能属性的增强,当然也是AI能力类脑发展的一个趋势。如果这样一个发展趋势是成立的,那么已经跑通了PMF的微软Copilot已经算是L3的顶级应用了。他的Moat本质上在于场景和深耕多年的B端资源。
当场景的价值弱化,那么工程深度就需要增加“厚度”或技术增强来建立起整体的应用,以保证此类AI应用的Moat足够深。
在AutoGPT、BabyGPT和GPT-Engineer的demo爆火之后,以LLM作为核心控制器来构建L4的Agent成为一个很酷的概念。应用场景的想象空间被打开,我们发现LLM的潜力不仅限于生成写得很好的副本、故事、文章和程序,它还可以作为一种强大的工具解决通用问题。
Agent System Overview—@Lilian Weng
Weng, Lilian. (Jun 2023). “LLM-powered Autonomous Agents”. Lil’Log. https://lilianweng.github.io/posts/2023-06-23-agent/.Autonomous Agent系统由LLM驱动,LLM作为代理的大脑,辅以几个关键的组件。
-
Planning
-
拆解子目标和任务分解:Agent能够将大型任务分解为较小,易于管理的子目标,从而高效地处理复杂任务。
-
自查与自纠:Agent能够对过去的actions进行自我批评和自我反省,从错误中吸取教训,并在今后的工作中加以改进,从而提高最终结果的质量(本质上是产生RL的数据,RL并不需要HF)
-
Memory
-
短期记忆:所有in-context learning都是利用模型的短期记忆来进行学习的。(在这背后的主要支撑是Prompt Engineering)
-
长期记忆:为Agent提供了在较长时间内保留和recall(无限)信息的能力,通常是利用外部的向量存储和快速检索(借助向量数据库的力量实现)[召回率的高低也直接决定了Agent复杂内容记忆及检索的效果]
-
Tool Use
-
Agent学习调用外部应用程序的API,以获取模型训练数据权重中缺失的“额外信息”(任务相关,预训练后通常难以更改),包含当前信息、代码执行能、专有信息源的访问权限等。(code interpreter的出现本质上也是OpenAI继plugin之后对于Agent的进一步探索)
a16z提出的LLM App的新型架构,与论文中的介绍也是异曲同工。究其本质,是生物性的发展过程和整体类比的结果,将LLM进行类脑比较,定位为整体中枢,进行分工合作。七月初流出的GPT4的设计也有类似的影子,MOE的存在。
第一部分:Planning
一项复杂任务通常会包含很多步骤,Agent需要了解这些步骤是什么并提前规划。
任务拆解:
Chain of thought (CoT; Wei et al. 2022) 已经成为一种标准的Prompting技术,用于提高模型在复杂任务中的性能。模型被要求“think step by step”利用更多的时间进行计算,将艰难的任务分解成更小,更简单的步骤。CoT将大型任务转化为多个可管理的任务,并对模型的思维过程进行了阐释。
Tree of Thoughts (Yao et al. 2023) 进一步扩展CoT,在每一步都探索多种推理的可能性。它首先将问题分解为多个思考步骤,并在每个步骤中生成多个思考,从而创造一个树形结构。搜索过程可以是BFS(广度优先搜索)或DFS(深度优先搜索),每个状态由分类器(通过一个prompt)或少数服从多数的投票原则来决定。
任务分解可通过以下几种方式实现:
-
给LLM一个简单的提示词“Steps for XYZ.\n1.”,“What are the subgoals for achieving XYZ?”
-
使用针对具体任务的指令,例如对一个写小说的任务先给出“Write a story outline.”指令
-
使用者直接输入
Graph of Thoughts(Besta et al. 2023)同时支持多链、树形以及任意图形结构的Prompt方案,支持各种基于图形的思考转换,如聚合、回溯、循环等,这在CoT和ToT中是不可表达的。将复杂问题建模为操作图(Graph of Operations,GoO),以LLM作为引擎自动执行,从而提供解决复杂问题的能力。某种程度上,GoT囊括了单线条的CoT和多分枝的ToT。
Fig.4. GoT与其他Prompt策略的比较
无论是CoT还是ToT,本质上是通过Prompt的精心设计,激发出模型原有的Metacognition
只是如何通过某条神经元的线索能更加精准的调动出大脑中最擅长Planning的部分
另一种截然不同的方式,LLM+P (Liu et al. 2023),通过借助一个外部的经典Planner来进行一个更加长序列的整体规划。这种方法利用规划域定义语言(Planning Domain Definition Language, PDDL)作为中间接口来描述规划问题。整个使用过程,首先LLM将问题翻译成“问题PDDL”,接着请求经典Planner根据现有的“领域PDDL”生成一个PDDL Plan,最后将PDDL计划翻译回自然语言(LLM做的)。根本上讲,Planning Step是外包给外部工具的,当然也有一个前提:需要有特定领域的PDDL和合适的Planner。
模型自我反省
Self-reflection是非常重要的一环,它允许Agent通过完善过去的行动决策和纠正以前的错误来不断改进。现实世界中的任务中,试错仍然是无法避免的,自我反思在其中发挥着至关重要的作用。
ReAct** (Yao et **al. 2023)即Reson+Act通过将Action Space扩展为特定任务的离散动作和语言空间的组合,在LLM内部整合了推理(Reasoning)和行动(Action)。前者使LLM能够与环境交互(例如,使用Wikipedia Search的 API),后者通过提示词使得LLM用自然语言生成整体的推理过程。
ReAct提示词模板包含了提供LLM思考的明确步骤,其大致格式为:
Thought: ...
Action: ...
Observation: ...
在知识密集型任务和决策任务的两个实验中,ReAct的表现比去掉Thought…的单一Act…方式更加优异Reflexion (Shinn & Labash 2023)是一个让Agent具备动态记忆和自我反思能力以提高推理能力的框架。Reflexion采用标准的RL设置,其中奖励模型提供简单的二进制奖励,而Action Space则采用ReAct中的设置,即在特定任务的行动空间中加入语言,以实现复杂的推理步骤。在每一个Action a(t)之后,Agent会计算一个启发式函数h(t),并根据自我反思的结果决定是否重置环境以开始一个新的循环
启发式函数判断何时整个循环轨迹是低效的或者何时因为包含了幻觉需要停止。低效规划指的是耗时过长却未成功的循环轨迹。幻觉是指在环境中遇到一连串相同的行动,而这些行动会导致相同的观察结果。
自我反思过程通过给LLM一个two-shot例子创造,每个例子都是一对(失败的轨迹、在计划中指导进一步变化的理想反思)。接着,reflections将会被添加到Agent的工作记忆中作为查询LLM的上下文,最多三个。
Chain of Hindsight (CoH; Liu et al. 2023) 通过向模型明确展示一系列过去的输出结果,鼓励模型改进自己的输出结果。人类的反馈数据收集为,其中是提示词,每个是一个模型生成的文本,表示人类对的打分,是相应的人类对于过去输出结果的反馈。假设反馈源按照奖励值来进行排序,。这一过程本质上是监督微调,在这个过程中数据是一个序列,形式如下,其中。这个模型被微调以前序列内容为条件去预测,这样模型就能够根据反馈序列进行自我反思,以产生更好的输出。在测试的时候,模型可以选择接受人类注释者的多轮指导。
为了避免过拟合,CoH增加了一个正则化项,来最大化预训练数据集的对数似然概率。我为了避免捷径化和复制(因为反馈序列中有许多常见单词),在训练过程中他们随机屏蔽了0%-5%的过去的token。
他们在实验中的训练数据集是 WebGPT comparisons, summarization from human feedback和 human preference dataset。
CoH的理念是结合实际情况,展示连续改进产出的历史结果,并训练模型能够顺应趋势,产生更好的输出结果。Algorithm Distillation (AD; Laskin et al. 2023)将同样的理念应用于强化学习任务中的跨周期轨迹,算法被封装在一个长历史条件策略中。考虑到Agent会与环境多次交互,并且每个周期内Agent都会变得更好,AD将这些学习历史连接起来并将其喂到模型里。因此,我们应该期待下一次预测的行动会比之前的试验取得更好的结果。目标是AD学习RL算法的过程,而不是训练特定任务的策略本身。
这篇论文假设,任何能生成一组学习历史记录的算法,都可以通过对action克隆提炼出一个神经网络。历史数据由一组源策略生成,每个策略都针对特定任务进行过训练。在训练阶段,每次运行RL时,都会随机抽取一个任务。并使用多集历史数据的子序列进行训练从而使学习到的策略与任务无关。
实际上,模型的上下文窗口长度是有限的,所以每一小节应该足够短,以构建更多的历史小节。需要2-4个小节的多节上下文来学习一个接近最优的上下文内强化学习算法。上下文内的强化学习的出现需要足够长的上下文内容。
与其他三种基线相比较,a)ED(专家提炼,用专家轨迹代替学习历史的行为克隆),b)源策略(用于生成UCB的蒸馏轨迹),c)(Duan et al. 2017;用作上限,但是他需要在线RL)AD展示了在上下文中的强化学习,其性能接近RL^2,尽管只使用了离线强化学习,并且比其他基线学习得更快。当基于源策略的部分训练历史进行调节时,AD的改进速度也比ED基线快得多。
只有更好的Plan,没有最好的Plan
一边从历史长河中学习,一边向前思考向外求索
第二部分:Memory
记忆类型:
记忆可以定义为用于获取、存储、保留和随后检索信息的过程。人脑中有多种类型的记忆。
-
**感官记忆:**这是记忆的最早期阶段,在接受了原始刺激后保留的感官信息(视觉、听觉等)印象的能力。感官记忆通常只能持续几秒钟。其中包含图标记忆(视觉)、回声记忆(听觉)和触碰记忆(触觉)。
-
短时记忆(STM)或工作记忆:它存储了我们当前意识到的信息,以及执行复杂认知任务(如学习和推理)所需的信息。短期记忆被认为有大约7个项目的容量,并能够持续20-30秒。
-
长时记忆(LTM):长时记忆可以将信息存储很长时间,从几天到几十年不等,存储容量基本上是无限的。长时记忆分为两种:
-
显性/陈述性记忆:对事实和事件的记忆,指那些可以有意识地回忆起的记忆,包括外显记忆(事件和经历)和语义记忆(事实和概括)。
-
隐形/程序性记忆:这种记忆是无意识的,设计自动执行的技能和例行程序,如骑车、在键盘上打字。
大致的将这些记忆内容映射到LLM中
-
感官记忆作为对原始输入(包括文本、图像或其他模态)的学习嵌入表示
-
短期记忆作为上下文学习。它是短暂且有限的,因为它受到了transformer结构的上下文窗口长度的限制
-
长期记忆作为Agent在查询时可以关注的外部向量存储,可以通过快速检索来进行访问
**最大内部产品搜索(Maximum Inner **Product Search,MIPS)
通过使用外部存储器可以缓解关注范围有限的限制。一种标准的做法是将信息的嵌入表示法保存到向量数据库中,该数据库能够支持快速的最大内积搜索(MIPS)。为了优化检索速度,常见的选择是近似相邻(Approximate Nearest Neighbors,ANN)算法,返回近似的top k个近邻,用损失少量的精度来换取速度的巨大提升。
几种常见的ANN算法选择进行快速MIPS
-
LSH (Locality-Sensitive Hashing,局部敏感的哈希算法):它引入了一种哈希函数,这种哈希函数能够最大限度地将相似的输入项映射到同一个桶中,其中桶的数量要远小于输入内容的数量。
-
ANNOY (Approximate Nearest Neighbors Oh Yeah):核心数据结构是随机投影树,它是一个二叉树集合,每个非叶子节点表示将输入空间划分为两半的一个超平面,每个叶子节点存储一个数据点。这些树是独立随机构建的,在某种程度上,它模拟了一个哈希函数的作用。ANNOY 的搜索发生在所有树中,迭代地搜索最接近查询的那一半,然后聚合结果。其思想与 KD 树非常相关,但是可扩展性更强。
-
HNSW (Hierarchical Navigable Small World):HNSW的设计思想来源于小世界网络,在小世界网络中,每个节点只需要通过很少的步数就可以连接到任何其他节点。比如社交网络中的“六度分隔”理论。HNSW构建了多层的小世界网络结构,底层包含实际的数据点。中间层创建了一些“快捷键”来加速搜索过程。在进行搜索时,HNSW从顶层的一个随机节点开始,逐步导航向目标节点移动。如果在一层无法接近目标,它就会下降到下一层,直到到达底层。在上层每一步导航都能潜在地跨越数据空间中的大距离,而在下层每一步导航可以提高搜索的质量。
-
FAISS (Facebook AI Similarity Search):它基于这样一个假设,即在高维空间中,节点之间的距离遵循高斯分布,因此应该存在数据聚类。FAISS通过向量量化来实现,先将向量空间划分为若干集群,然后在每个集群内进行更精细的量化。在搜索时,首先使用粗粒度的量化查找可能的集群候选,然后在每个候选集群内使用更细致的量化进行进一步查找。
-
ScaNN (Scalable Nearest Neighbors):ScaNN算法的主要创新在于使用了各向异性向量量化。他对数据点到进行向量化,使得内积<q,>尽可能与∠q和的原始距离相似,而不是选择最接近的量化质心点。
在 ann-benchmarks.com 上查看更多 MIPS 算法和性能比较。
记忆的获取在某种程度上会提高Planning整体质量,但同时也会拉长整体服务的时延,因此如何快速且精准的捕捉相关的记忆至关重要。Vector Search和Attention Mechanism之间的平衡也是速度与准确性之间的平衡
当然都是因为没有无限的上下文学习
第三部分:Tool Use
使用工具是人类的一个显著特点,我们创造、修改和利用外部物体来完成超越我们身体和认知极限的事情。为LLM配备外部工具可以大大扩展模型的功能。
工具的分类:
确定性工具-API工具-专家模型-物理世界工具
让语言模型只做语言模型该做的事儿,通过文字生成内容传递逻辑。
借助各式各样的工具完成逻辑的执行
使用工具的方法
MRKL (Karpas et al. 2022),是 "模块化推理、知识和语言 "(Modular Reasoning,Knowledge and Language)的简称,是一种用于自主代理的神经符号架构。建议 MRKL 系统包含一系列 "专家 "模块,而通用 LLM 则充当路由器,将查询路由到最合适的专家模块。这些模块可以是神经模块(如深度学习模型),也可以是符号模块(如数学计算器、货币转换器、天气 API)。
他们用算术作为测试案例,做了一个微调 LLM 以调用计算器的实验。他们的实验表明,由于 LLM(7B Jurassic1-large 模型)无法可靠地提取基本算术的正确论据,因此解决口算数学问题比解决明确表述的数学问题更难。这些结果突出表明,当外部符号工具能够可靠地发挥作用时,了解何时以及如何使用这些工具至关重要,这取决于 LLM 的能力。
TALM (工具增强型语言模型Tool Augmented Language Models; Parisi et al. 2022)和Toolformer (Schick et al. 2023)都做了微调LM,学习使用外部工具。数据集的扩展与否取决于新添加的API调用注释能否提高模型输出的质量。更多详情,参阅Prompt Engineering的 “External APIs” section。
ChatGPT Plugins 和 OpenAI API 函数调用就是增强了工具使用能力的 LLM 在实践中发挥作用的良好范例。工具应用程序接口集合可以由其他开发人员提供(如插件)或自行定义(如函数调用)。
HuggingGPT (Shen et al. 2023)是一个使用 ChatGPT 作为任务规划器的框架,用于根据模型描述选择 HuggingFace 平台中可用的模型,并根据执行结果总结响应。
该系统包括4个阶段
(1)任务规划(Task planning):LLM 充当大脑,将用户请求解析为多个任务。每个任务都有四个相关属性:任务类型、ID、依赖关系和参数。他们使用少量的示例来指导 LLM 进行任务解析和规划。
(2)模型选择(Model selection):LLM 将任务分配给专家模型,其中的要求是一个多选题。LLM 会收到一份可供选择的模型列表。由于上下文长度有限,因此需要进行基于任务类型的过滤。
(3)任务执行(Task execution):专家模型执行特定任务并记录结果。
(4)返回结果(Response generation):LLM 接收执行结果,并向用户提供汇总结果。
如果要将 HuggingGPT 投入实际应用,需要解决几个难题:
-
需要提高效率,因为 LLM 推理轮和与其他模型的交互都会减慢进程;
-
它依赖于较长的上下文窗口来交流复杂的任务内容;
-
提高 LLM 输出和外部模型服务的稳定性。
模型评估
API-Bank (Li et al. 2023) 是评估工具增强型LLMs性能的基准。它包含了53个常用的API工具,一个完整的工具增强型LLM的工作流,以及264个注释对话其中涉及了568个API的调用。可供选择的 API 种类繁多,包括搜索引擎、计算器、日历查询、智能家居控制、日程管理、健康数据管理、账户认证工作流程等。由于有大量的 API,LLM 首先可以访问 API 搜索引擎,找到要调用的正确 API,然后使用相应的文档进行调用。
在 API-Bank 工作流程中,LLM 需要做出几个决定,我们可以在每个步骤中评估该决定的准确性。
决策包括:
-
是否需要调用 API。
-
确定要调用的正确 API:如果不够好,LLM 需要反复修改 API 输入(例如,决定搜索引擎 API 的搜索关键词)。
-
根据 API 结果做出响应:如果结果不满意,模型可以选择改进并再次调用。
该基准从三个层面对代理的工具使用能力进行评估:
-
Level1-评估调用 API 的能力。根据 API 的描述,模型需要确定是否调用给定的 API、正确调用 API 以及正确响应 API 的返回。
-
Level2-检查检索 API 的能力。模型需要搜索可能解决用户需求的 API,并通过阅读文档学习如何使用这些 API。
-
Level3-评估除检索和调用外规划 API 的能力。对于不明确的用户请求(如安排小组会议、预订旅行机票/酒店/餐厅),模型可能需要调用多个 API 才能解决。
AgentBench(Liu et al. 2023)是一个多维度且不断发展的Agent Benchmark,目前选择8个不同的场景(操作系统、数据库、知识图谱、数字卡牌游戏、侧向思维谜题、家务管理、网络购物和网页浏览),用于评估LLM作为Agent在多轮开放式生成环境中的推理和决策能力。系统性测试了25个LLM在八个环境中的表现,从整体得分来看GPT4遥遥领先。在数据库,卡牌游戏,知识图谱等复杂任务处理场景中也展现出潜力。
案例研究:
自ChatGPT爆火以来Agent相关领域的研究蓬勃发展,目前Agent方向的相关论文已累计高达160篇。其中的Agent根据其各自的能力共分为四类:
-
Tool Agent(工具Agent):利用各种外部工具(如搜索引擎,知识库等)来辅助完成任务,代表论文有WebGPT、Toolformer等
-
Simulation Agent(仿真Agent):用于构建仿真环境,通常包含多个代理用于多角色互动、对话等。代表论文有Social Simulacra、Generative Agents等
-
General Agent(通用代理):追求通用性,可应用于多领域任务。代表论文有AutoGPT、LangChain等
-
Domain Agent(领域Agent):针对特定领域或任务进行优化设计。代表论文有ChemCrow(化学),ChatDev(软件开发)等
科学研究Agent
ChemCrow (Bran et al. 2023)是一个针对特定领域的例子,其中LLM使用13种专家设计工具来完成有机合成,药物发现和材料设计等任务。这个工作流在Langchain中实施,使用了ReAct和MRKL中之前描述的内容,并将CoT推理与任务相关的工具相结合:
-
LLM 会收到一份工具名称清单、工具用途说明以及预期输入/输出的详细信息。
-
然后指示它在必要时使用所提供的工具回答用户给出的提示。指示建议该模型遵循 ReAct 格式
-
Thought-Action-Action Input-Observation
一个有趣的现象是,虽然基于 LLM 的评估认为 GPT-4 和 ChemCrow 的性能几乎相当,但由专家对解决方案的完成度和化学正确性进行的人工评估显示,ChemCrow 的性能远远超过 GPT-4。这表明,在需要深厚专业知识的领域中,使用 LLM 评估自身性能存在潜在问题。专业知识的缺乏可能导致 LLM 不知道自己的缺陷,从而无法很好地判断任务结果的正确性。
Boiko et al. (2023)还研究了用于科学发现的 LLM-empowered Agent,以处理复杂科学实验的自主设计、规划和执行。这种代理可以使用工具浏览互联网、阅读文档、执行代码、调用机器人实验 API 并利用其他 LLM。
例如,当要求 "开发一种新型抗癌药物 "时,模型得出了以下推理步骤:
-
询问当前抗癌药物研发的趋势;
-
选择一个靶点;
-
要求提供针对这些化合物的支架;
-
确定化合物后,模型尝试进行合成。
这篇文章还讨论了各种风险,特别是非法药物和生物武器的风险。他们开发了一个测试集包含了一系列已知的化学武器制剂列表,并要求Agent合成这些制剂。在11项请求中,有4项(36%)被接受以获得合成解决方案,Agent试图查阅文件以执行程序。被拒绝的7个例子中,5个是在网络搜索后被拒绝的,2个是在prompt提交后就直接拒绝的。
生成式Agent模拟
Generative Agents (Park, et al. 2023)是一个超级有趣的实验,受《模拟人生》的启发,25 个虚拟角色在沙盒环境中生活和互动,每个角色都由一个 LLM 驱动的代理控制。生成代理为互动应用创建了可信的人类行为模拟。
生成式代理的设计将 LLM 与记忆、规划和反思机制结合起来,使代理的行为以过去的经验为条件,并与其他代理互动。
-
Memory stream(记忆流):这是一个长期记忆的模块(外部数据库),用自然语言记录了一系列Agent的经验
-
每个元素都是观察结果,由Agent直接提供的事件。-Agent之间的交流可以触发新的自然语言语句
-
Retrieval model(检索模型):根据相关性,就近原则和重要性,取出上下文为Agent的行为提供信息
-
近期性:近期事件得分较高
-
重要性:区分普通记忆和核心记忆。直接询问 LM
-
相关性:基于它与当前情况/查询的相关程度
-
Reflection mechanism(反思机制):随着时间推移,将记忆合成为更高层次的推理,指导Agent未来行为。这些内容是对过去事件的更高层次的总结(注意,这与在上下文中的自我反思有些不同)
-
Prompt LM提出 100 个最新的观察结果,并根据一组观察结果/陈述提出 3 个最突出的高层次问题。然后请 LM 回答这些问题。
-
Planning & Reacting(规划和反应):将反思和环境信息转化为行动
-
Planning本质上是为了优化当下和未来的可信度
-
Prompt模板:{Intro of an agent X}. Here is X’s plan today in broad strokes: 1)
-
Agent之间的关系以及一个Agent对另一个Agent的观察结果都会被纳入到规划和反应的考虑范围
-
环境信息以树形结构呈现
这种有趣的模拟产生了新的社会行为,如信息扩散、关系记忆(如两个Agent继续对话主题)和社会事件协调(如举办聚会并邀请许多其他人)。
Chance 机会
Challenge 挑战
在了解了构建以 LLM 为中心的Agent的主要想法和Demo之后,也开始发现一些共同的局限性:
-
Finite context length(有限的上下文长度):有限的上下文容量限制了历史信息、详细指令、API 调用上下文和响应的包含。系统的设计必须考虑到有限的通信带宽,而从过去的错误中吸取教训的自我反省等机制将从较长或无限的上下文窗口中受益匪浅。虽然矢量存储和检索可以提供对更大知识库的访问,但其表示能力不如attention那么强大
-
Challenges in long-term planning and task decomposition(长序列规划和任务拆解):长期规划和有效探索解决方案空间仍然具有挑战性。LLM 在遇到意外错误时很难调整计划,这使得它们的鲁棒性不如从试验和错误中学习的人类
-
Reliability of nature language interface(自然语言界面的可靠性):当前的Agent System依赖自然语言作为 LLM 与存储器和工具等外部组件之间链接的界面。然而,模型输出的可靠性值得怀疑,因为 LLM 可能会出现格式错误,偶尔还会表现出反叛行为(rebellious behavior,如:拒绝执行指令)。因此,大部分Agent demo code都集中在解析模型输出上。
Agent的九种模式
来源:https://bluefocus.feishu.cn/docx/TjXxdyqNkolBLGxHpyQckN2Fn5e
一、ReAct 模式
这是 LLM Agent 第一文,发表于 2022 年 10 月,现在看起来特别简单,但当时ChatGPT还没有面世,能够提出让 LLM 学会使用工具,具有一定的开创性。
React 原理
ReAct 原理很简单,没有 ReAct 之前,Reasoning 和 Act 是分割开来的。举个例子,你让孩子帮忙去厨房里拿一个瓶胡椒粉,告诉 ta 一步步来(COT提示词策略):
-
先看看台面上有没有;
-
再拉开灶台底下抽屉里看看;
-
再打开油烟机左边吊柜里看看。
没有 React 的情况就是:
不管在第几步找到胡椒粉,ta 都会把这几个地方都看看(Action)。
有 React 的情况是:
Action1:先看看台面上有没有;
Observation1: 台面上没有胡椒粉,执行下一步;
Action2:再拉开灶台底下抽屉里看看;
Observation2:抽屉里有胡椒粉;
Action3: 把胡椒粉拿出来。
是的,就是这么简单,在论文的开头作者也提到人类智能的一项能力就是 Actions with verbal reasoning,即每次执行行动后都有一个“碎碎念(Observation”:我现在做了啥,是不是已经达到了目的。这相当于让 Agent 能够维持短期记忆。
ReAct 实现(通过代码理解原理)
在看过几个人的开源代码后,拿出一个最容易被产品经理理解的代码来解读。看完你会发现本质上所有的 Agent 设计模式都是将人类的思维、管理模式以结构化prompt的方式告诉大模型来进行规划,并调用工具执行,且不断迭代的方法— 明白这一点非常重要。
代码链接: https://github.com/samwit/langchain-tutorials/blob/main/agents/YT_Exploring_ReAct_on_Langchain.ipynb
我将代码逻辑梳理为下图(要仔细看):
接下来结合代码内容详细解读。
1.生成提示词。
首先,将代码中预设好 ReAct 的提示词模板(格式为Quesion->Thought->Action->Observation)和用户的问题进行合并。得到的提示词是这样的。
如果需要针对你自己的领域定制,需要将 fewshot 里的内容更换为更合适的内容,比如你的 Action 里可能会有"Send message to someone", 这里的 Action “Send message” 可能就对应一个外部工具的 API 接口。
2.调用大模型生成Thought+Action。
接下来将 few shot 提示词发给大模型。如果直接将上述提示词发给大模型,大模型生成将针对用户问题生成一堆 Thought,Action 和 Observation,但显然这里 Action 还没有展开,我们并不希望大模型输出 Observation。在代码里通过 Stop.Observation 来控制大模型遇到Observation后停止输出,于是大模型仅仅返回 Thought 和 Action,而不会把 Observation 给生成出来。
3.调用外部工具。
拿到 Action 之后,大模型就可以调用外部工具了。首先判断这里的 Action 是不是 Finish,如果不是我们就可以利用大模型把 Action 后面的自然语言转换为外部工具能识别的 API 接口,这个转换过程就是大模型的 function calling 功能,本质上是对大模型进行微调,专门用于语言格式转换的模型,但并非所有的大模型都支持 function calling。
4.生成Observation。
API 接口返回后,还会将接口返回内容转换为自然语言输出,生成 Observation,然后将 Observation 的内容,加上刚刚的 Thought, Action 内容输入给大模型,重复第 2,3 步,直至 Action 为Finish 为止。
5.完成输出。
将最后一步的 Observation 转化为自然语言输出给用户。
由此,我们可以看到 Agent 要落地一个场景,需要定制两项内容。
-
Prompt 模板中 few shot 中的内容。
-
function calling 中的外部工具定义。
而 Prompt 模板中 fewshot 本质上就是人类思维模式的结构化体现,通过查阅各个设计模式的 prompt 模板是很好的学习 Agent 设计模式的方法,习得这个方法,可以用同样的方法理解其他的设计模式,以下模式不再进行代码解读。
二、Plan and solve 模式
顾名思义这种设计模式是先有计划再来执行。如果说 ReAct更适合 完成“厨房拿胡椒粉”的任务,那么 Plan & solve 更适合完成“西红柿炒鸡蛋”的任务:你需要计划,并且过程中计划可能会变化(比如你打开冰箱发现没有西红柿时,你将购买西红柿作为新的步骤加入计划)。
提示词模板方面,论文标题中说得很直白,《Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models》,简言之就是 Zero shot 的提升,下图是作者代码中给出的一些 PS-Plan and Solve 提示词。
架构上它的组成是这样的:
-
规划器:负责让 LLM 生成一个多步计划来完成一个大任务。代码中有 Planner 和和 Replanner,Planner 负责第一次生成计划;Replanner 是指在完成单个任务后,根据目前任务的完成情况进行 Replan,所以 Replanner 提示词中除了 Zeroshot,还会包含:目标,原有计划,和已完成步骤的情况。
-
执行器:接受用户查询和规划中的步骤,并调用一个或多个工具来完成该任务。
三、Reason without Observation
REWOO(Reason without Observation)这种方法是相对 ReAct中的Observation 来说的,ReAct 提示词结构是 Thought→ Action→ Observation, 而 REWOO 把 Observation 去掉了。但实际上,REWOO 只是将 Observation 隐式地嵌入到下一步的执行单元中了,即由下一步骤的执行器自动去 observe 上一步执行器的输出。
举个例子,常见的审批流都是环环相扣的,比如我们的目标是完成 c,我们的步骤是:
-
我们需要从部门 A 中拿到 a 文件,
-
然后拿着 a 文件去部门 B 办理 b 文件,
-
然后拿着 b 文件去部门 C 办理 c 文件- 任务完成。
这其中第 2,3 步骤中 B,C 部门对 a,b 文件的审查本身就是一类Observation。又比如下面提示词模板中给出 one shot 内容中定义出每一步的 plan 都会依赖上一步的输入。
架构上它由三个组件组成:
-
Planner:负责生成一个相互依赖的“链式计划”,定义每一步所依赖的上一步的输出。
-
Worker:循环遍历每个任务,并将任务输出分配给相应的变量。当调用后续调用时,它还会用变量的结果替换变量。
-
Solver:求解器将所有这些输出整合为最终答案。
四、LLMCompiler
Compiler-编译一词在计算机科学的意义就是如何进行任务编排使得计算更有效率,原论文题目是《An LLM Compiler for Parallel Function Calling》,很直白,就是通过并行Function calling来提高效率,比如用户提问张译和吴京差几岁,planner 搜索张译年龄和搜索吴京年龄同时进行,最后合并即可。
提示词里对 Planner 的要求是这样的,重点是希望生成一个 DAG(Direct Acyclic Graph, 有向无环图。
架构上有一个 Planner(规划器),有一个 Jointer(合并器)。
五、Basic Reflection
Basic Reflection 可以类比于学生(Generator)写作业,老师(Reflector)来批改建议,学生根据批改建议来修改,如此反复。
提示词就是复刻师生之间的交互。
架构上有一个 Generator,一个 Reflector。
六、Reflexion
Reflexion 是 Basic reflection 的升级版,相应论文标题是《Reflexion: Language Agents with Verbal Reinforcement Learning》,本质上是强化学习的思路。和 Basic reflection 相比,引入了外部数据来评估回答是否准确,并强制生成响应中多余和缺失的方面,这使得反思的内容更具建设性。
提示词方面:会让大模型针对问题在回答前进行反思和批判性思考,反思包括有没有漏掉(missing)或者重复(Superfluous),然后回答问题,回答之后再有针对性的修改(Revise)
架构上,有一个 Responder:自带批判式思考的陈述 Critique;有一个 Revisor:以 Responder 中的批判式思考作为上下文参考对初始回答做修改。
七、Language Agent Tree Search
LATS 相应论文标题是《Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models》,很直白:是 Tree search + ReAct+Plan&solve 的融合体。在原作的图中,我们也看到 LATS 中通过树搜索的方式进行 Reward(强化学习的思路),同时还会融入 Reflection,从而拿到最佳结果。所以:
LATS = Tree search + ReAct+Plan&solve + Reflection + 强化学习
提示词模板方面和之前的 reflection,plan&solve,ReAct 差别不大,只是上下文中多了对树搜索结果的评估和返回结果。
架构上,就是多轮的 Basic Reflection, 多个 Generator 和 Reflector。
八、Self-Discover
Self-discover 的核心是让大模型在更小粒度上 task 本身进行反思,比如前文中的 Plan&Slove 是反思 task 是不是需要补充,而 Self-discover 是对 task 本身进行反思。
提示词方面,Self-discover 列出一系列的反思方式让 agent 来选择:
结构上,Self-Discover 如下图所示:
-
Selector: 从众多的反省方式中选择合适的反省方式;
-
Adaptor: 使用选择的反省方式进行反省;
-
Implementor: 反省后进行重新 Reasoning;
九、Storm
Storm 相应论文标题是《 Assisting in Writing Wikipedia-like Articles From Scratch with Large Language Models》,很直白:可以从零生成一篇像维基百科的文章。主要思路是先让 agent 利用外部工具搜索生成大纲,然后再生成大纲里的每部分内容。
提示词模板方面主要围绕如何生成大纲,如何丰富大纲内容来展开。
架构上,就是先有 topic, 然后生成大纲,根据大纲丰富内容。这里会有一个大纲生成器,一个内容生成器。
总结
以上就是目前所总结的 Agent 九大设计模式,其实 Agent 中没有最好的设计模式,只有最适合的设计模式 ,最终还是要从用户需求出发来选择。
原文地址:https://mp.weixin.qq.com/s/9CRzuNgnwyq3-tkqnTA6TA
大语言模型(LLM)阶梯学习
来源:https://bluefocus.feishu.cn/docx/YStOdhUaYo4RvVxrHkyctypHncg
AI大模型
大模型能干什么?
大模型,全称「大语言模型」,英文「Large Language Model」,缩写「LLM」。例如以下这些都是目前访问量较高的大语言模型,我们能够看到越来越多的头部公司、创业公司开始布局大模型,给大家放了访问地址,大家可以自行体验:
ChatGPT:https://chatgpt.com/
Bing Chat:https://www.bing.com/
文心一言:https://yiyan.baidu.com/
讯飞星火:https://xinghuo.xfyun.cn/
智谱清言:https://chatglm.cn/
推荐视频:
大语言模型介绍原理视频(李宏毅)
LLM概述
大语言模型(Large Language Model, LLM)是一种具有许多参数的人工神经网络构成的模型,不熟悉神经网络的读者可以看下面一篇回答,对于神经网络这里就不再赘述:
机器学习,深度学习,神经网络,深度神经网络之间有何区别?
大语言模型通常指的就是这些参数量在成亿的深度学习模型,并且这些模型是通用的,在多个基准测试(benchmark)上都表现出色,并不止对一个特定任务有效。并且通常它们的训练方式是自监督或者半监督的。
LLM的能力
-
比如说几乎所有大模型都具备的基本能力:
-
语言理解能力,如维基百科问答、布尔问答、多选题等任务;
-
语言生成能力,如文本简化、摘要、问题生成等;
-
跨语言能力,如机器翻译、跨语言问答等。
-
还有不少扩展能力:
-
世界知识:很多大模型可以利用其储备的背景知识来回答问题,无需额外提供知识。
-
工具使用:大模型可以学会使用外部工具,如计算器、搜索引擎等,拓展其能力边界。
-
少样本学习:大模型展现出了强大的少样本学习能力,可以从寥寥几个示例中学习新任务。
-
指令遵循:经过指令微调后,大模型可以遵循自然语言指令执行任务。
-
此外,还有一些新兴的前沿能力:
-
推理能力,包括逻辑推理、符号推理、常识推理、算术推理等;
-
任务规划和分解能力与用户交互的能力与外部环境交互的能力,如对虚拟或现实环境采取相应的行动自我修正和迭代优化的能力
当然,目前这些能力还并不完善,其中只有推理能力可以初窥门径,任务规划、环境交互、自我迭代则是通向通用人工智能(AGI)的一些必经之路,仍然有很长的探索之路要走。
详细介绍:https://zhuanlan.zhihu.com/p/645045642
LLM as Controller
ChatGPT、GPT-4等LLM模型最强的能力其实是语言理解力,不需要让一个LLM做任何事情,只需要它能够准确无误的理解人类说的语言,再按照人类的语言去执行对应的任务即可。假如LLM的理解能力可以达到100分,那么只需要准确无误的调取最精确的工具就可以解决任何问题。
上述处理任务的流程总结为以下这个过程,LLM在这个流程中实际上充当的是Controller的角色,或者说是大脑。
任何复杂任务都可以包含在上述流程之中,给定一个输入(包含需要做的事情以及条件),就能通过LLM控制一系列的agent来达成目标,并且得到输出结果。并且agent的数量和多样性是可以无限拓展的,假设LLM的语言理解能力是100分,那么就可以无限拓展LLM的能力边界。另外从算法的角度来理解,plan其实就是split,collect其实就是merge,整个流程就是分治思想的集中体现。
其中从Input到Output会进行3层处理,第一层会对输入目标进行拆解,并且得到一系列有顺序的目标,第二层会对每个子目标安排最合适的agent来进行处理,第三层会对所有的agent得到的结果进行汇总整合。其中agent可以理解为各种能力,可以是模型,可以是网页,也可以是工具,其中LLM作为这3层的总控制,去理解input的含义,并且给出最优的plan、assign和collect的处理。这个过程像极了一个庞大的组织架构的正常运转。
有了上述统一的概念理解之后,下文对最近最流行的LLM as Controller的项目做一个拆解,不同项目的主要差别在于LLM as Controller的逻辑以及各个专项Agent的能力,主要包含Visual ChatGPT、HuggingGPT、Toolformer、AutoGPT等项目。
项目拆解
Visual ChatGPT
实际上Visual ChatGPT的agent的范围是各种视觉的Foundation Models。
Visual ChatGPT实际上是最简单的一种LLM as Controller的项目,范围仅限于Visual Foundation Models,这种形态的项目,虽然能力边界小,但是LLM的负担是最轻的,每一个步骤以及流程是更加的可控,可能总共就只需要十几二十个流程。未来这种形态的工具或者产品对于各种垂直领域来说可能是更为常见的。
HuggingGPT
实际上HuggingGPT的agent的范围是huggingface所有模型。
HuggingGPT将LLM as Controller整个过程总结为4步:
-
任务规划:利用ChatGPT分析用户的请求,了解用户的意图,通过提示分解成可能解决的任务。
-
模型选择:为解决计划任务,ChatGPT 根据模型描述选择托管在Hugging Face 上的专家模型。
-
任务执行:调用并执行每个选定的模型,并将结果返回给ChatGPT。
-
生成结果:最后,使用ChatGPT整合所有模型的预测,为用户生成答案。
HuggingGPT的模式可控性也比较高,而且模型都是放在HuggingFace上进行托管的,输入输出的形式上也是一致的,用户使用以及代码维护都更为方便一些。
Toolformer
实际上Toolformer的agent的范围是各种外部工具。
上图中是Toolformer一种典型的用法,Toolformer可以自主决定调用不同的 API(从上到下:问答系统、计算器、机器翻译系统和维基百科搜索引擎)以获取对完成一段文本有用的信息。这个工作实际上也为后续的AutoGPT和BabyAGI等项目提供了灵感。
AutoGPT
AutoGPT其实就是在上述的基础之上,通过LLM反思input->plan->assign->collect->output整个过程,并且重新规划plan,从而产生一直迭代的auto效果。从外部的表现形式上来看,整个系统不断的交替进行plan和reflect,已经出现了自我思考自我迭代的过程。这实际上已经到了autonomous agents的范畴了。
实际上AutoGPT的agent的范围就是各种网页以及各种工具。
上述流程图来自BabyAGI,下面举一个简单的例子来阐述Autonomous Agent的思想:
假设有一个可以帮助研究的autonomous agent,并且我们想要关于某个主题的最新消息的总结,比如说“关于 Twitter 的新闻”,我们告诉agent你的目标是找出有关 Twitter 的最新消息,然后向我发送摘要”。
-
agent查看目标,使用 OpenAI 的 GPT-4 等LLM模型,使其能够理解正在阅读的内容,并提出第一个任务。 “任务:在谷歌上搜索与 Twitter 相关的新闻”。
-
然后agent在谷歌上搜索 Twitter 新闻,找到热门文章,并返回一个链接列表。 第一个任务完成。
-
现在agent回顾它的主要目标(找到关于 Twitter 的最新消息,然后发送摘要)和它刚刚完成的事情(得到一堆关于 Twitter 的新闻链接)并决定它的下一个任务需要是什么 .
-
agent提出了两个新任务。 1)写新闻摘要。 2) 阅读通过谷歌找到的新闻链接的内容。
-
现在agent在继续之前停止了一秒钟,它需要确保这些任务的顺序正确。 真的应该先写摘要吗? 不,它决定了最优先阅读通过google找到的新闻链接的内容。
-
agent从文章中读取内容,然后再次返回待办事项列表。 它想添加一个新任务来总结内容,但该任务已经在待办事项列表中,所以它没有添加它。
-
agent检查待办事项列表,唯一剩下的项目是总结它阅读的内容,所以它这样做了。 它会按照您的要求向您发送摘要。
目前autonomous agent还比较初级,因为agent的范围太大了,无边无际,非常的不可控,但是这个概念非常的强大,随着不断的发展和实验,未来会慢慢的融入我们的日常生活。
系统稳定性
上文的阐述中都是基于假设LLM语言理解能力为100分的情况,能力边界是可以无限拓展的,但事实上LLM仍然会存在一定的事实性错误。这会影响整个系统的稳定性,并且稳定程度取决于LLM的语言理解能力,以及各个Agent的专项能力。
另外值得注意的是,goal之间、agent之间可以引入相互影响,但是个人认为这样子会使得不同流程的处理变的更加复杂,整个系统的稳定性会下降不少。
自然语言编程
以往的编程方式通常是左边这张图的形式,规范好函数的格式化输入和格式化输出,程序主体可以执行特定的功能,而随着LLM的能力不断增强,事实上未来会发生右图编程形态的转变,自然语言输入通过LLM并行控制多个函数的调用,并且通过LLM将多个函数的调用结果进行总结,最终返回自然语言输出,而LLM在其中的执行方式通常是通过Prompt的形态来执行的,Prompt也是自然语言,这个过程可以认为是自然语言编程。
并且其中的格式化输入、格式化输出以及简单的程序主体通常是标准化的,LLM也可以同时去做所有的标准化任务,未来人类可能只需要编写复杂的、非标准化的程序主体。换句话说,LLM可以用自然语言编程的方式去统一所有标准化的内容。右图中的橙色部分可能都会变成自然语言编程的一部分。
AI操作系统的雏形
首先从原来的Windows/macOS/Linux等操作系统的模式说起,比如Windows操作系统上可能有搜索引擎/办公软件/编辑软件等等,然后搜索引擎有谷歌/百度/搜狗等等,谷歌可以搜索到维基百科/知乎/github等等网站,维基百科可以找到名人/建筑/历史等信息。上图的划分方式是为了下文阐述的简化表达。
-
办公软件比如office全家桶,office全家桶有ppt、word等等,ppt里面又有很多功能点。
-
编辑软件比如adobe全家桶,adobe全家桶有PS、AE、AI等等,PS里面又有很多功能点。
其中每个分叉都可以认为是一个聚合体单元,其实就是对应最开始描述框架下的Agent,只不过Agent在不同层次的概念粒度以及复杂程度是不同的。比如上图中的维基百科就可以认为是各种概念信息的聚合体。
在搜索引擎出现之前,人们找需要的信息时,需要从对应的网站找对应的信息,这是多个输入对应多个输出的情况;而搜索引擎就是通过更强大的搜索算法对各种网站进行了聚合,即出现了更大概念的Agent,这个时候输入口变成了1个,但是输出仍然需要跳转到各个网站上去获取;而LLM的出现会使得输入输出都变成1个口,并且对输入的精确表达程度要求更低。从这个演化过程来看,LLM会导致完全统一输入输出的Agent的出现,这个时候用户可以无需关心Agent内部的具体构造(即Agent内部完全黑盒化,由LLM自己决策中间过程),只需要输入并获取想要的输出。
从上述Agent单元的阐述来看,Windows/macOS/Linux等操作系统都可以简化成上图,即不同概念粒度Agent组成的多层Agent树。每个概念粒度的Agent都会逐渐标准化。从Agent的角度来看,HuggingGPT、Visual ChatGPT实际上就是模型管理功能的Agent。
如果在每一层或者每一个Agent单元配备一个LLM作为控制器,并且所有LLM都是信息互通的,并且LLM的语言理解能力是100分,那么可能就会出现真正的AI操作系统。通过AI操作系统中的所有LLM联动控制,可以将一个复杂任务拆分成不同层次的子任务,然后通过所有的Agent联动处理,最后输出想要的结果。
Windows/macOS/Linux等操作系统通过程序编程给出UI界面,然后用户通过鼠标点击和UI界面进行交互完成工作;而AI操作系统可能会变成只需要理解用户的语言就能完成工作。这个转变可能会导致鼠标点击和UI界面进行交互的方式可能会变得越来越冗余。
如果AI操作系统只需要理解用户的语言就能完成工作,那么所有不同粒度的Agent就能看成一个黑盒子(因为中间的所有决策环节都由LLM决定了),即一个最大聚合体Agent,而它的内核就是AI操作系统。
从AI操作系统的角度来看,实际上AutoGPT试图自顶向下的构建最大范围的Agent,正是因为范围过于广阔,导致中间过程非常的不可控;而类似HuggingGPT、Visual ChatGPT更倾向于自底向上搭建更可控的Agent,Agent能做的事情都是事先知道的。
Reference
https://zhuanlan.zhihu.com/p/626736120
https://www.mattprd.com/p/the-complete-beginners-guide-to-autonomous-agents
thinkthinking:NexusGPT——目前为止看到的最有创意的Autonomous Agents类项目!附该领域进展概览
字节:AutoGPT与LLM Agent解析
Generative Agents
LLM未来研究方向
未来大模型研究的一些重要方向可能包括:
-
更小更高效的语言模型。虽然目前的发展趋势是模型越来越大,很多人“迷信”模型越大,参数越多,性能越好,但随之而来的,却是超高的训练和使用成本。未来一个方向或许是研究如何在保持性能的同时压缩模型体积,提高效率,其中知识蒸馏等技术或将扮演重要角色。
-
超越attention的新型架构。Transformer的attention机制虽然强大,但在处理长文本时却出现效率较低等问题。因此势必要探索新的更有效的机制,来高效的建模长距离依赖。目前已经有一些新的尝试,包括S4,Mamba等架构。
-
多模态大模型。未来大模型不仅需要流畅的处理文本,肯定还要满足流畅的处理图像、视频、语音等多种形态数据的需求,这将极大拓展大模型的应用场景。但是从Sora直到现在仍然不能公测也可以推断,多模态模型对于资源和能源的需求恐怕大到难以想象。
-
改进大模型的使用方法及扩展技术。时至今日,大模型仍然有很多局限性,比如如何解决顽固的幻觉问题,以及如何更好的将大模型用于下游任务,仍然需要大量的研究。提示工程、知识检索、工具使用等领域都有很多工作可以做,基于大模型的智能体研究终会走向通用人工智能。
仅仅发展了短短时间的大模型已经给了我们很多震撼,未来到底会发展到怎样的程度真的很难预测。绘画生成模型的“现世”,让不少小画师心有惴惴,生怕自己哪天被AI淘汰;Suno的惊讶让200多位“音乐人”联合发信抵制。但是不管多么不愿意看到大模型“入侵”自己的领域,大模型的发展脚步终究是无人可以阻止的。
作为一个普通人,我们能做的就是努力跟上时代,跟上大模型发展的步伐,当大模型来到面前的那一天,努力的应用它,让它成为自己的助手,而不是成为它的“手下败将”。
前导知识
python学习
首先要先对python有一个大体的了解,至少要能看懂代码是什么,对应哪个步骤
10 段代码,学会基础 python
在深入学习 AI 时,许多朋友发现需要编程,变得头大。
同时,各类教程都默认了你会打命令行,导致入门十分困难。
鉴于此,就有了这份简明入门,旨在让大家更快掌握 Python 和 AI 的相互调用。
写给不会代码的你:20分钟上手 Python + AI
神经网络和深度学习框架
除此之外,神经网络的知识也是必须掌握的,否则不能理解大语言模型运行的内在逻辑。在前文已有对神经网络的叙述,这里也不再赘述。
那么在代码层面,必须掌握的就是神经网络的框架,比较著名的框架就有 Pytorch,Tensorflow,Caffe 等。都是目前炙手可热的深度学习框架
什么是深度学习框架,和大语言模型又有什么关系呢?
实际上深度学习框架提供了一系列的 API 和工具,用于处理神经网络结构、优化算法、数据加载等任务。每个框架都有自己的风格,下面是以构建单层的神经网络为例子,体现 Pytorch 构建神经网络和 Tensorflow 的不同:
Pytorch 构建
import torch
import torch.nn as nn
# 定义单层全连接模型
class SimplePerceptron(nn.Module):
def __init__(self, input_size, output_size):
super(SimplePerceptron, self).__init()
self.fc = nn.Linear(input_size, output_size)
def forward(self, x):
# 前向传播
return self.fc(x)
# 创建模型实例
input_size = 10
output_size = 1
model = SimplePerceptron(input_size, output_size)
# 输入数据
input_data = torch.randn(1, input_size) # 示例输入数据
# 前向传播
output = model(input_data)
print(output)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)