游戏改变者:函数调用改变了我的代码库。
在48小时之内,几乎不停地编写和测试,我开发了一个现在已经非常稳定可靠的解决方案(标题党是的)。这是一个关于如何使用函数调用彻底改变我的代码库和对LLM开发方法的态度的故事。
动机
一段时间以来,我一直在认真开发新的SaaS产品ResumeThinker。这个平台旨在通过阅读简历、提取信息和比较角色尽可能自动化HR工作量。上图所示,相同的代码库被提议用于对齐电子商务供应链内容。但是,代码在可伸缩性和成本(如使用GPT-4或Anthropic)方面存在几个问题。上下文一直是一个问题,但那些时期终于结束了。
解决方案 — 代码的工作流程
这个想法非常简单:将一组数据聚合成一个新的结构(例如JSON)。通常,客户端包含多个来源,需要一些聚合,通常是手动执行的。有了强大的LLM,即使需要加载大量数据以尽可能保留上下文,这项任务也变得微不足道。
提示
这里的提示非常复杂,我会保留大部分内容。但包括:
- 数据的模型结构(包括服务器)。
- 一行数据。
- 提取的签名。
而且,当然还有函数本身。
功能
首先,我一开始并不明白整个API和“如何使用它”,但现在我明白了它真正的潜力。使用案例是原子的,而不是神奇的。以下是一个图示,作为普通人的解释:
您在与函数交互时拥有完全的控制权。您可以更改提示或在再次请求结果时进行添加,因此在开发方面可能会更繁琐,但这是一个很好的折中方案。
与该函数进行交互时,您拥有完全控制权。您可以修改提示或增强请求以再次请求结果。虽然它可能看起来笨重,但这是一种值得的权衡。
数据库服务 - 一层搜索
如果提示缺乏足够的数据,则使用该函数请求潜在的结果。我的实现很简单:
- 它存储在使用Entity Framework Core和OData中间件的数据库中。
- 它接收查询并尝试通过多个“id”或索引检索数据。主要示例是“类型”。
队列/NLP搜索 - 2层搜索
这是当第一层失败时的备选方案。它包含其余的内容(按页面划分),可以查询数据。这个过程通常在所有请求完成后完成,剩下的请求尽可能以批量完成。
调试进行中
您可以在文档中阅读更多关于此的内容,这非常类似。
该函数类似于消息一样是另一个字段。您首先要描述系统(一个API服务器),然后再描述函数。在我的用例中,您需要指定如果某些内容丢失,则应查询服务器的其余部分。这包括请求的结构和函数的名称。
一旦函数的结果得到,它包括使用API请求进行搜索后,数据就会添加到提示中。或者,您可以将其添加到对话中,而不是重构提示。
最终结果是:
结论
函数调用是一个改变游戏规则的功能。它来自于插件所获得的经验,但给用户提供了绝对的控制权。这应该在每个现代的LLM中实现,就像当前提示符标记的大幅增加,不一定是类似这样的方式,但是可以像我们拥有的微调和嵌入方式一样。这提供了一种“链接”的替代方案,这在像LangChain这样的工具中很常见,而无需复杂的额外工具。看到工具带领我们到哪里的确令人兴奋。
PS:我们还缺少代码解释器!!!