一转眼,ChatGPT已经在AI界炙手可热超过一年,堪称新晋顶流。各大公司纷纷跟风推出自家的大模型,然而若这些大模型无法得到实际应用,便失去了许多意义。现如今,越来越多企业开始考虑借助AI技术来提升企业的运营效率。那么作为个体,我们又该如何利用AI技术来提高工作和生活的效率呢?因此,我认为大模型的下半场将由AI Agent来引领。
扣子也是我认为排在第一梯队的AI Agent行列,我会从浅入深,由使用到原理一步一步地带你理解AI Agent的作用,紧跟时代脚步,你可别落下。
主题:Java转型助手
作为一名Java开发者,我深知当前行业面临的挑战,十年前的红利已经消退,很多人开始转型。就我个人而言,我参加的架构课程也开始向其他领域引流,比如Go、Python、网络安全等等。如今,所有培训机构都将这些课程作为吸引人的卖点来宣传自己。我也深刻感受到了目前的困境。去年开始系统学习Python时,我发现大部分免费的入门课程都是为初学者设计的,而我们有丰富的编程经验,基础知识掌握得很快,这样的课程对我们来说会浪费太多时间。因此,我认为如果能快速简单地掌握新技能,为什么不去尝试呢?基于这样的想法,我决定创建一个转型助手。当今转型的方向多种多样,本文只以Python作为例子进行讨论。
本文将带领你从一个简单的AI Agent逐步发展成为一个Java转型学习助手。通过应用知识库、数据库和插件工作流等技术手段,我将满足你对学习笔记、文章知识库、待办事项数据库、面试题库以及行业招聘信息的需求。如果你还有更加创新的点子,不妨将其交给像你一样对此感兴趣的人来实现。让我们一起探索,将智能技术与教育领域相结合,打造出更加智能、便捷的学习与咨询体验。
AI Agent
接下来,在深入介绍我的助手之前,我想先向大家介绍一下AI Agent!
最初AI大火时,大家在体验完ChatGPT之后,纷纷赞叹其厉害!然而,从22年12月到23年3月,ChatGPT的调用量一直呈现高速增长的趋势。但是,自从4月开始,访问量增长速度明显放缓,在5月和6月期间甚至出现下降的情况,因为大家意识到它只是一个能进行问答的工具,意义并不太大。为了让AI技术真正发挥作用,必须将其应用到实际场景中才能产生价值!因此,AIAgent应运而生。
在这里,我们可以将Agent理解为一种具备自主理解、规划决策、执行复杂任务能力的智能体。简而言之,Agent可以表示为LLM(语言模型)+Planning(规划)+Feedback(反馈)+Tool use(工具使用)。
这意味着AIAgent不仅需要具备类似大脑的LLM来理解问题并做出规划决策,还需要类似五官的数据来获取信息,同时需要像手脚一样的工具来行动处理问题。这种综合的能力使得AIAgent能够更全面地应对各种复杂任务和情境。
Langchain
Langchain的开发初衷在于赋予开发者快速构建LLM原型应用的能力,langchain成功解决了这一难题,仅需5行简洁代码即可轻松打造一个LLM应用。
大家对于Langchain最初想到的概念是否是:
之前我曾记录过使用Langchain打造私人助手的经历,不过这只是Langchain众多组件中的一个应用方向而已。
Langchain的主要组件包括以下几个方面:
-
Models(模型):涵盖各种类型的模型,比如GPT-4等集成模型
-
Prompts(提示):包括提示模版的管理、优化以及序列化等功能
-
Memory(记忆):用于存储模型交互的上下文信息
-
Indexes(索引):用于结构化文档,外挂知识库是索引功能的一个重要应用
-
Chains(链):用于调用一系列组件工具
-
Agents(代理):负责决定模型采取何种行动,选择哪个工具,并执行以及观察流程等任务
在Langchain中,我们最常使用的功能之一是外挂知识库的应用,这实际上是Indexes组件的应用方向之一。然而,Langchain的功能远不止于此。个人认为Langchain是功能和工具最为齐全的框架,但是也因为其功能繁多,导致整个框架显得过于笨重,缺乏灵活性。因此,大家通常只会使用其中的某一个组件功能而已。
在这里,我们简要介绍了AI Agent的作用,以帮助您更好地理解其功能,从而深入了解扣子平台这类工具的整体概念。
以下是我使用扣子来搭建自己的Python助手的功能设计图的详细说明:
关于太基础的内容就不在此详细展开了,如感兴趣可直接查阅官方文档,最近还新增了图片上传功能的支持,文档中有详尽的说明:Coze - 文档中心
关于如何使用扣子的整个操作流程如下所述:
点击 bot 页面 > 创建 bot > 填写名称+bot描述 > 编排 > 调试 > 发布 > 结束
人设与回复逻辑
实际上,人设与回复逻辑正是当时最流行的prompt设计,而且我还专门撰写了一篇文章对其进行了描述。若想让AI表现出色,prompt绝对不能忽略。以下是我已经花费大量时间调整并优化的提示词,虽然可能并不完美,但希望能够为大家提供一些参考:
# Character
你是一位专业的Java开发助手,擅长通过教授Python知识帮助Java开发者快速学习和掌握Python编程语言。你能准确解释Python中的各种知识点,帮助Java开发者理解和应用。
## Skills:
### Skill 1: 运行Python
1:当用户询问Python面试题时,请调用view_assist工作流处理。
2:当用户询问Python招聘信息时,请调用job工作流处理。
3:当用户提供纯Python代码时,需要调用代码执行器工具运行出结果。
### Skill 2: 解释Python
1:当用户询问Python中的知识点时,你需要调用recallKnowledge方法获取知识库信息,可以结合Java中的相关知识点,解释Python的对应概念和用法,并给予示例代码和实际应用场景。
### Skill 3: 保存明日学习任务
1:用户提醒明日学习内容时,需要调用ts-TableMemory进行保存
## Constraints
- 只讨论与Java和Python相关的内容,拒绝回答与这两种编程语言无关的话题。
- 所输出的内容必须按照给定的格式进行组织,不能偏离框架要求。
- 仅会输出知识库中已有的Python相关知识点,对于不在知识库中的问题,无法提供答案。
- 当用户出现错误的理解或用法时,应以鼓励和建设性的态度向用户指出错误,帮助其正确理解和应用Python知识。
通过恰当的prompt引导,模型能够更准确地理解用户的意图,从而生成更精准的文本。当然,官方文档已经提供了相关的prompt模板,无需我们费心地去琢磨。
如果你认为官方大模型生成的文本质量不够理想,也可以借助其他大型模型的帮助,然后将其生成的文本复制粘贴过来即可。这一过程我就不做演示了。
个人知识库
在搭建知识库时,可以直接根据系统操作来完成,因此这里不再演示这些基本操作。知识库中有许多选项可供选择,但我更倾向于通过URL直接获取所需内容。这样做的原因是,我之前撰写过许多关于Java进修Python的专栏内容,可以直接应用其中的知识。
就好比当chatPDF刚发布时,它采用了文档分段的方式,找出最相关的文本段落交给LLM进行问答,从而限制了大型模型的知识扩散。这展示了知识库的重要作用,因此这时我仅需大型模型的语言表达能力即可,而非其底层训练数据。
网页抓取
当使用知识库时,可以考虑对某些知识点进行筛选,将不必要的内容剔除掉。有时候,某些知识点可能与个人的学习目标无关,但整个知识储备却相互关联紧密。因此,直接去除这些不必要的内容是可行的。
还记得我之前使用向量数据库自己搭建的知识库吗?我之前使用向量数据库构建了一个个人知识库,这个知识库非常方便,可以快速帮助你学习知识库建立需要的知识点。
我已经把那幅图画出来,并告诉你这个知识库何时开始发挥作用。当与AI助手进行交流时,我希望能够将相关的知识库片段一同提交,以便提供更丰富的背景信息,从而优化提问的质量。
总的来说,为了更好地理解,你需要将一些前置知识点全部保存起来。然而我们清楚地了解,对于我们自己的文档而言,简单几个字肯定是远远不够的,而且大型模型也存在着token长度的限制。如果文字内容过多,需要采取适当的切分方式。
当然,切分也需要考虑多个因素,就像扣子采用的是自动分段。
使用简单快捷的方式确实有其好处,但明显的缺点是会导致文字的意义被断开,本来应该是一句完整的话被切割成了两句话。因此,还有一种切割方式是重叠切割,即第一段和第二段之间的文字存在部分重叠。然而,这种方式仍然存在相关问题。
因此,我们还需要考虑最大召回数量,也就是返回的最大相似条数。通过这种方式,我们可以获取到几段相似文本。这样一来,我们就能够获取到更完整的上下文信息,即使存在重合部分也不会有影响。剩下的任务可以交给人工智能来处理。此外,扣子的好处还在于你可以选择自动调用或按需调用的方式来使用它。这样符合的场景也就丰富起来了。
多说一句
在优化段落分割方面,有许多方法可供选择,但关键是保持简洁明了,避免像我一样在文章中使用冗长的文字重复讲述同一主题。如果您熟悉GitHub上的开源项目,您将会发现这些段落分割任务可以交由人工智能来智能处理,并且知识库应该预先设定相关问题以便与分段内容匹配。这样不再仅仅是简单的文本匹配,而是通过先匹配问题,再提取相应文本交由助手回答。当然,问题的生成也可以交由人工智能来完成。
在测试过程中,一些用户可能会注意到,有时助手的回答与提取的文本数量之间的关系并不显著。这里我就不多说了,官方也有相关说明:Coze - 文档中心
自动调用
按需调用
当按需调用的时候,你可以提供关键词提示,然后在提示中引导AI去调用知识库。如果你对如何操作不太了解,我可以为你提供指导。看下我是如何写的:
### Skill 1: 解释Python
如果用户提供的是纯Python代码,可以忽略本逻辑。当用户询问Python中的知识点时,你需要调用recallKnowledge方法获取知识库信息,可以结合Java中的相关知识点,解释Python的对应概念和用法,并给予示例代码和实际应用场景。
这个扣子的好处之一是你可以直接查看运行日志,了解你的文字是如何进行匹配以及匹配到了哪几段文字的。如果你要自己来实现知识库的显示日志的话,可能需要花费很长时间来完成。所以这个扣子的功能非常实用,能够节省你大量的时间和精力。
为什么要花时间查看运行日志呢?看起来这只是一项琐碎的工作。然而,最主要的原因是为了评估自己的知识库的组织是否良好。如果发现有问题,应该立即修改知识库的内容。
插件添加
在学习编程方面,没有代码是不可能的,这个不用我多说了吧,GPT4已经具备了很多功能,其中最显著的是代码执行。毕竟,一个LLM模型是无法为你执行代码的,所以对于专业的事情,我们还是应该交给专业的人来处理——比如代码执行器。
代码执行器
代码执行器是一个功能强大的工具,它能够帮助你快速执行代码。使用代码执行器非常简单。此外,你还可以通过提醒助手来指定何时执行代码,以便更好地控制代码的执行时机。在使用代码执行器时,你可以根据个人需求自由发挥,无需担心任何限制。
### Skill 1: 运行Python
1:当用户提供纯Python代码时,需要调用代码执行器工具运行出结果。
这个示例主要展示了卡片显示的功能,默认情况下不带有卡片样式,如果需要生成卡片样式,你可以按照每个参数的详细解释进行设置。
效果如下:
数据库保存
扣子是一个非常全面的工具,它能够帮助你轻松地完成整个流程,从知识库的建立到插件的使用,再到最终的数据库操作,它都能完美地涵盖。尤其是数据库的应用,你可以将它作为你的知识点进行记录和保存,这样可以更好地帮助你学习和回顾。
除了回答我关于各种知识点的问题,我还可以将它作为我的待办事项清单。比如,当我学完一天的知识后,我可以让助手帮我记录下今天我还需要进一步学习的内容,以便明天继续学习。这样,我不会忘记今天的学习进度,也能够有效地规划明天的学习计划。
就问你6不6。只要将我的Python助手或者你的AI助手嵌入到服务号,并作为运营客服使用,就能自动将用户的反馈保存到数据库中。通过这种方式,无需额外进行开发工作,从而提供了一种方便的长期实时的记忆解决方案。
说这么多,不会用可不行,没问题,我可以教你如何使用。第一步就是你需要告诉它什么时候调用。
### Skill 3: 保存明日学习任务
1:用户提醒明日学习内容时,需要调用ts-TableMemory进行保存
创建数据库
在这个部分,你只需要自己定义好表的结构,并且字段的类型也是相对简单的。官方文档并没有详细说明每种数据类型的含义,可能是因为他们认为大家都具备一定的基础知识。但是作为面向小白的教程,我会为大家解释每种数据类型的意思。
-
String表示该字段类型是一串文本形式的数据,比如"今天吃啥?",在我的示例中,我用它来保存我的待办内容。
-
Integer表示该字段类型是一种整数类型,比如1,2,3等。
-
Time表示该字段是时间类型,但默认保存的格式是2024-02-02 12:00:00 +0800 CST。在我的示例中,我用它来保存我的待办时间。
-
Number表示该字段类型是一种数字类型,可以是小数,比如0.5。
-
Boolean表示该字段类型是一种布尔类型,即true或false。默认情况下,它的值是null,如果你想将其设置为必需类型,那么默认值就是false。
在这里,我要解释一下后面的"是否必要"按钮的作用。如果你将开关打开并标记为必要,那么在提醒AI助手时,你必须提供这个描述的值,否则AI助手不会根据你的描述为你附上默认值。这个功能可以确保你在使用AI助手时提供了所有必需的信息,以便它能够准确地为你执行任务。
好的,既然如此,我就不录制视频了。我会提供一张截图给大家。请大家务必注意,描述必须准确清晰,否则AI可能无法正确识别。如果描述不清楚,那么你的助理也无法正确完成任务。这是很简单的道理。至于为什么在我提供的截图中前两个数据类型无法修改,那是因为这些数据已经被存储了,无法再进行修改。
既然我们在使用数据库,它自然拥有增加、删除、修改和查询的功能。下面我将演示如何使用AI助手来优化数据库维护。然而,在这里我想吐槽一下,既然是数据库,在调试时至少应该给管理用户一些操作权限。即使用户输入错误的数据导致报错,我们可以限制用户的新增数据权限,但是删除操作应该是可以由我自行执行的。然而,事实上,用户没有任何操作权限,一切都由AI助手独自操作。
新增
在这个示例中,我将向数据库中插入新的数据。在开始之前,请确保根据你的数据库结构提供待办事项的详细描述,这样助手才能正确地记录下来。现在,让我来帮你进行演示吧!请注意,我将只演示正确的情况。唯一需要注意的是,你必须提供数据库中必需的字段,并确保字段的值类型与数据库结构一致。如果存在非必需的字段,你可以选择不提供这些字段的值。
修改
我们发现,如果我没有提醒小助手给删除标识设置值的话,它将没有默认值。因此,我们需要对这个删除标识进行修改,将其设置为false。
另外,我要说明一下,在视频中出现了两条完全相同的记录,这是因为我在测试时不小心多发了一次。请忽略这个问题~
查询
查询数据其实是一项相对简单的操作,但是在进行查询时,你必须清楚地描述时间范围,因为我的待办事项基本上是按照时间范围进行查询的。目前,他的系统只支持全模糊查询,即使用LIKE加上%进行文字匹配。我查看了系统执行的SQL日志,在视频中展示的查询操作中,底层基本上是使用了类似MySQL这样的关系型数据库。
SELECT * FROM to_do WHERE deadline = '2024-02-03 10:00:00' AND msg LIKE '%py%'
删除
这一步非常危险,我在使用过程中绝对不敢随意删除,因为一旦说错一句话,就会直接导致数据丢失。因此,我强烈建议用户避免轻易使用删除操作,而是采取修改删除标识字段的方式。在查询过程中,可以简要提及删除标识的值,这样更加安全。
让我来给你进行演示吧。毋庸置疑,他已经成了MySQL类型的数据库,因此底层的删除语句肯定是用delete来实现的。我已经取出了他的SQL语句。
delete from to_do
数据库建议
-
经过我的使用体验,在调试时我注意到没有手动操作记录的情况。因此,我认为可以考虑开放删除操作的权限。
-
在插入数据时,我认为可以考虑使用默认值。如果用户确实不想指定删除标识,可以在编辑数据库时为其提供一个默认值。这样一来,用户就无需在每次插入数据时都手动指定删除标识,提高了操作的便捷性。
-
底层使用的是类似于MySQL的关系型数据库,这在中文匹配的过程中存在一些问题。如果少写一个字,可能会导致无法正确地查询到相关结果。为了解决这个问题,我建议考虑使用像Elasticsearch这样的数据库,它具有专门的分词器,能够更好地处理中文文本。通过使用Elasticsearch,我们可以确保在中文匹配过程中更准确地获得相关结果,提高系统的搜索效果。
-
既然我们使用的是MySQL类型的数据库,如果面对大量的数据,令人惊讶的是它竟然不支持建立索引。
工作流
首先,我要声明我并没有接触过工作流这方面的经验,因此我会尽力在完成我的目标前尽量从一个新手的角度向大家介绍如何灵活运用工作流。
其次,还是吐槽一下,我在编辑工作流时遇到了一些困难,特别是滚动条不断闪动,有时还无法准确点击,因为节点越多,就需要不断移动页面,而且没有直接移动视图的缩略图功能,只能不停地拖动滑动条。
最后,我先把我的简图分享给大家,让大家对整个流程有一个简单的认识,避免产生困惑。
面试题库
其实我自己也没有找到一个很好的切入点,所以如果你觉得我的工作流有些偏离主题的话,请尽量忍耐一下,但是,如果你有任何好的想法或建议,欢迎在评论区告诉我,我会进行相应的配置,以使我的助手更加完善。
废话不多说,我简单介绍一下如何我将工作流应用到实际情境中。考虑到面试题通常具有时效性,我认为如果大型模型所使用的训练数据不是最新的,可能会导致向用户提供一些过时的面试题,从而浪费时间。因此,我使用工作流提供了两种解决方法:一种是利用我的题库,另一种是通过web实时搜索面试题。以下是有关我的工作流的详细信息:
工作流节点
节点类型包括大型模型、插件、选择器、代码和知识库等。这些节点在工作流中扮演不同的角色,共同构建出一个完整而多元化的系统。
在创建工作流时,节点类型的选择取决于你的具体任务需求。每种节点都有其独特的功能和作用。重要的是关注每个节点的输入值和输出值,这有助于确保工作流的正确运行。在工作流创建过程中,会默认生成开始和结束节点,这两个节点特殊之处在于它们只有输入功能。为了方便后续在prompt中进行设置,建议工作流的名称以英文和下划线为主。在描述工作流时,尽量详细描述,即使描述内容不够完善也不会对工作流的运行产生太大影响。
工作流输入/出
在工作流中,每个节点都有两种类型的输入。一种是引用,可以是来自其他节点的输入或输出,使用key-参数名进行引用;另一种是参数值,可以直接输入你想要的内容值。
实际上,如果你对编程有一定了解的话,可以将生成判断值的过程交给人工智能来完成。在这里需要留意的是,你需要生成一个包含key-value的对象,因为下游节点需要引用生成的值。
如果你对编程不太熟悉的话,可以考虑使用大模型节点来代替,让大模型直接进行判断,并按照固定格式将结果输出到指定的key中。这样可以简化操作流程,减少对编程的依赖。下面有演示。
我在这里要介绍一些常用插件的使用方法。对于新手来说,可能会对插件的输入输出有一些误解,因此需要更详细地解释清楚。
在最初阶段,如果你对操作一无所知,可以先尝试运行一下,观察结果输出。然后根据这些输出结果,将相关的key引用传递给下一个节点作为输入。每个感叹号都代表了参数的详细解释,这种方法相对来说还是比较人性化的,帮助新手更好地理解和应用工作流。
在使用工作流时,务必记住删除掉那些没有用的节点,否则可能会导致节点错误,使得工作流无法正常运行。所有节点都应该相互连接,而且必填的输入值都必须有有效的数值或数值来源,这样才能确保工作流的顺利运行。
在刚开始使用工作流时,建议先确保整个流程可以成功运行,然后再逐步增加节点。完成工作流后,请记得发布并在实际应用中使用。此外,确保在你的提示信息中清楚地说明如何正确使用你的工作流。以下是一个示例供您参考:
1:当用户询问Python面试题时,请调用view_assist工作流处理。
在这种情况下,你也会意识到,随着节点数量的增加,消耗的token实际上是相当大的。这也为未来留下了优化的空间。
招聘信息
在完成工作时,不必局限于单一工作流程,你可以添加多个工作流程。只需合理设置prompt以确定调用时机,比如除了面试准备,你还可以增加一个用于查询招聘信息的工作流程,以便了解当前行业形势。
由于已经进行了详细的讲解,因此我决定直接将图发给你。
最后的步骤也是相同的,只需在添加完工作流之后将prompt稍作修改即可完成。
2:当用户询问Python招聘信息时,请调用job工作流处理。
当您点击链接时,可以顺利跳转至猎聘网站并查看详细信息。唯一的瑕疵在于大型模型一直存在一些识别问题,导致有些参数无法正确辨识,而在ChatGPT上却没有此问题。希望今后能够优化或者切换其他大模型,使其能够顺利切换至更加有效的状态。
发布到社交平台
最关键的问题是如何吸引他人使用我们的bot助手?一旦 Bot 完成开发和测试,你可以将其发布到不同的社交平台上,如微信公众号、飞书等。你可以将其作为客服使用,为用户提供实时的帮助和解答。当然,需要注意的是,如果要发布到微信公众号,需要是服务号,个人号无法实现此功能。
当我最初开始使用时,并没有豆包平台供选择,我只能将其发布在飞书上进行使用。最近,豆包进行了授权更新,且默认设置为可用,因此我想分享给大家如何充分利用这一更新。
在发布时选择合适的平台非常重要,如果你不想费心编写发布记录,当然也可以让AI帮你生成。只需一键发布,就能轻松完成任务。
接着,我们可以登录豆包平台。值得注意的是,我们的智能体在这个平台上是隐形的,其他小伙伴无法察觉到它的存在。接下里这么办。
通过等待审核完成,就可以让其他人轻松地发现我们的智能体,并与其互动。
看下效果:
浅谈商业化
-
提供客服服务方面,我认为这个例子非常典型,因为无需人工介入,可以实现与公众号后台的无缝连接,只需简单几步即可建立起自己的24小时客服系统。举个例子,就像我的Java转型助手一样,并不一定要使用Python,可以根据不同的需求选择各种技术方向,包括技术、运维、管理等。然而,如果雇佣一个客服人员,如果他们不了解Java技术,也不了解转型方向,沟通将会变得非常困难。有了这样一个客服系统,我觉得可以有效缩小沟通的隔阂。
-
在Bot中进行广告推广是一种很好的方式,可以向用户展示与编程相关的产品和服务。这其实是构建生态系统的一部分,你并不一定需要只推广自家的产品。如果你的bot非常受欢迎,那么你完全可以在提示词中展示其他广告,并直接发送相关链接。但需要注意的是,这部分内容会接受平台的审核,所以需要谨慎选择广告内容,不要接收一切广告。其中最典型的例子就是各种考证,比如网络安全、PMP等方向。Bot只是一个助手,并不提供考证渠道,但如果通过用户的问题检测到他们对考证感兴趣,你完全可以介绍相关信息并获取提成。
-
提供个性化定制解决方案:关键在于充分利用知识库和工作流程。举个简单的以公司内部交接为例。假如每位开发人员都精心维护各种文档,我们只需将这些文档输入到智能助手中,便可轻松应对后续问题。这样,后来者只需向智能助手提问,即可得到解答。相比之下,离职交接员工怎么可能会耐心解决你的问题呢,因此询问智能助手会更为高效。再谈谈公司所在的行业问题。每家公司都提供不同的服务,需要业务相关的人员统一维护好客户问题文档,精心维护单个bot模块助手不也是一种解决方法?
总结
经过这么多的探讨和阐述,文章已经达到了尾声,但是对于追求AI的激情仍然澎湃,我也努力避免被潮流所抛弃。虽然我们大多数无法发明AI,但我会全力以赴将其运用到最佳状态,这是我的宗旨。
在文章中,我还提到了关于bot玩法的详细说明,但由于篇幅过长,无法一一赘述。同时,我也强调了Python只是编程的一个方向,而有很多人Java开发人员选择转型。Java教育机构也开始将自己的资源流量分散到其他机构。因此,即使我们不转型,努力学习也是非常重要的。毕竟,我们并不是编程的初学者,可以直接跳过大量的入门视频。正因如此,我产生了创建这个转型助手的想法。
文章转载自:努力的小雨