在上一部分中,我们介绍了如何在智能功能和产品中使用像GPT这样的大型语言模型(LLMs)的基本架构概念。今天,我们将重点讨论我们的应用程序如何在返回给用户响应之前解释完成情况。
目录
- 概述
- 请求JSON完成
- 管理输出一致性
- 函数调用
- 工具(插件)
01. 概述
在我们(1)准备好提示并(2)将其发送给LLM生成响应之后,(3)我们的应用程序可以读取完成情况以确定后续操作,如触发事件、执行函数、调用数据库或进行其他LLM请求。
02. 请求JSON完成
为了基于LLM的响应程序化地触发操作,我们不想玩一个猜测游戏,试图通过完成中的零散单词和短语来辨别意图。
更可靠的解决方案是提示模型以JSON形式响应,这是一种广泛用于表示结构化数据的文本格式,受到所有主要编程语言的支持,并且易于人类阅读。🧐
以下是描述旅行标准的JSON示例:
{
"departureCity": "New York, USA",
"destination": "Paris, France",
"numberOfTravelers": 2,
"businessTrip": false,
"specialRequests": [
"Room with view of eiffel tower",
"Guided tour arrangements"
],
"budgetRange": {
"min": 3000,
"max": 4000
}
}
描述我们期望的结构
让AI即兴创作数据结构既不可靠又不可操作。我们的提示必须描述我们正在寻找的内容。
💡 为此,即使我们希望获得JSON输出,使用GPT的常见做法是使用 Typescript风格的类型定义。这是一个简单的语法,可以描述数据类型(文本字符串、数字、布尔值等)、可选属性(使用?
)和指导LLM的注释(以//
开头)。
这种**"技术"提示工程**可能需要有编码知识的人。🤝 但如果多个人在提示的不同部分工作,确保他们紧密合作,因为他们的指示可能会相互干扰。
03. 管理输出一致性
LLMs的惊人的非确定性能力是有代价的:它们不总是遵循格式指令。😩 有几个因素在起作用:
模型的代码流利度
你的模型最初接受的培训越少,它可能需要的指令就越冗长。如果它根本没有学到任何代码,我认为你不能用提示来弥补这一点。
微调
另一方面,如果你对LLM进行微调,只提供你正在寻找的JSON结构的示例,它将学会执行此任务,不再需要格式指令。
提示工程
对于像GPT这样足够强大的模型,输出一致性仍然可以受到以下因素的影响:
-
指令的措辞
-
提示中指令的位置
-
以及提示/聊天历史的其余部分,因为它们可能包含混淆模型的句子。
👍 使用GPT的技巧:
-
当使用大提示时,将格式指令放在最后,靠近预期的响应。
-
要求模型在````json` 和 ````` 之间包装JSON,这似乎有助于它编写有效的代码并便于提取。
关于LangChain的热门观点 🦜🔥
LangChain是最受欢迎的 Python/JavaScript框架,简化了LLM应用程序的开发,提供即插即用的提示链接、RAG、代理/工具,以及多AI提供商支持。
背后的社区从最新的研究论文中策划提示和架构最佳实践。这是一个很好的灵感来源,非常适合原型制作和解决常见用例(例如,与知识库聊天)。
但我认为,真实的生产应用程序需要更多地控制你的系统,这并不是火箭科学(这是这一系列文章的原因)。🤓
使用LangChain,你依赖于他们的底层选择和更新,比如这个格式指令提示在5月份增加了令牌大小的两倍(参见之前和之后)。如果你只使用GPT,不需要解释什么是JSON。你只是支付额外的令牌,减少你的上下文窗口,并冒着混淆模型注意力的风险。🍗🙄
04. 函数调用
让我们回到我们的应用程序!现在,如果我们用可能的操作列表提示模型,并请求一个JSON格式的完成,我们的应用程序可以轻松地解释它,并为每个操作执行相应的代码。
这允许AI与我们应用程序的各个组件(内存、数据库、API调用等)进行交互。
安全问题
显然,如果不受控制,让一个非确定性的AI玩你的系统会暴露你的安全问题,比如prompt injection(一个黑客制作一个消息,让模型做他们想要的事情)。为了减轻这种情况:
-
避免让AI执行任意代码,比如运行它自己的SQL查询。相反,限制它的交互到一组预先批准的操作。
-
以用户级权限执行AI操作,以确保它不能访问其他用户的数据。
-
确保你在使用它们之前了解AI工具能做什么。这里需要工程专业知识和批判性思维。
OpenAI的函数调用
在2023年6月,OpenAI发布了他们的GPT函数调用功能,这与chat prompts类似,引入了一种新的专有API语法抽象化了已经可以通过提示完成的内容,并对他们的模型进行了微调,以提高可靠性。
☝ 他们的实现是可靠的,但尚未成为AI模型和提供商之间的标准。就像LangChain一样,它代表了易用性和技术控制之间的权衡。
05. 工具(插件)
结合JSON响应、函数调用和prompt chaining,我们可以组装一个智能助手,能够完成涉及外部资源的任务。
-
我们首先运行一个LLM查询,为模型提供一个任务和一组工具。
-
根据它的响应,我们执行相应的函数,并在后续查询中将结果反馈给模型。
-
我们重复这个过程,让AI决定下一步直到它得到一个最终答案。
👀 使用GPT聊天提示,我使用"用户"消息表示AI感知到的环境,即使它不是用户的消息。这似乎更符合模型的微调方式。
🙃 我这里没有使用Typescript风格的格式指令,因为JSON是一个示例的一部分(few-shot prompting),并且不需要可选属性或注释。唯一的规则是实验并找到适合你特定用例的方法。
🧠 提示AI口头表达其思考过程已知可以大大提高输出的质量。这种技术被称为Chain of Thought.
📆 LLM不知道当前的日期和时间。如果你的用例需要它,将它添加到你的提示中(就像ChatGPT那样)。
👩🏽 最后,你不需要向用户展示所有的AI内部思考。但你可以通过给出操作反馈(例如,"检查日历")来减少等待时间的感知,就像ChatGPT在他们的插件中所做的那样。