创建调用系统API的ChatGPT代理 - ServiceStack
简介
我们一直在探索如何通过不同的模式和概念验证,使 ChatGPT 能够利用应用程序的 ServiceStack API 来完成特定任务。这一目标通过多种提示技术得以实现,这些技术允许代理根据对话的上下文进行推理,并在尝试实现特定目标时,决定使用不同的“工具”(即 API)。
这些工具是您自定义的 ServiceStack API,可以通过 GptMeetingAgent 项目中的插件进行配置。例如:
var gptAgentFeature = new GptAgentFeature();
gptAgentFeature.RegisterAgent(new GptAgentData
{
Name = "BookingAgent",
PromptBase = File.ReadAllText($"{Path.Combine("Prompts", "BasePromptExample.txt")}"),
Role = "在员工之间进行会议预订的 AI(人工智能)。"
}, agentFactory: data => new OpenAiChatGptAgent(chatGptApiKey, data), includeApis: new List
{
Tags.Teams,
Tags.Calendar,
});
上述代码注册了一个名为“BookingAgent”的代理,并为其定义了角色描述。代理还被配置为使用带有 Tags.Teams 和 Tags.Calendar 标签的 API,这些 API 将用于实现其目标。代理只能在提示的上下文中访问这些 API,并通过 API 的“描述”字段来理解如何以及何时使用它们。
例如:
[Tag("Teams"), Description("按名称搜索用户")]
public class SearchUsers : IReturn
{
public string Name { get; set; }
}
工作原理
为了实现这一功能,我们结合了多种技术和方法。以下将介绍这些技术的核心概念,并说明如何在您的项目中使用 AI 代理。
OpenAI ChatGPT 和大型语言模型
OpenAI 的 ChatGPT 是一种基于大型语言模型的聊天产品。ChatGPT 中的“GPT”代表“生成预训练 Transformer”,这是一种用于训练模型的神经网络架构。
这些大型语言模型通过预测句子中的下一个“标记”或单词的一部分来生成文本。模型通过“提示”初始化,结合上下文生成后续内容。
Transformer 架构在学习语言结构和语义方面表现出色,随着模型规模的扩大,其语言模式的复杂性和生成能力也随之提升。一些最先进的模型甚至展现了推理和解决问题的能力,这正是我们在此概念验证中所利用的。
思维链
通过简单的提示,我们可以让模型以循序渐进的方式进行推理,并在输出中提供计划、推理、批评和步骤反思的详细信息。例如:
确保以循序渐进的方式对任务进行推理,并在思想输出中提供有关你的计划、推理、批评和步骤反思的详细信息。
这种方法允许模型将任务分解为更小的步骤,并通过上下文推理如何完成这些步骤。这种方式不仅强化了模型的决策过程,还能影响其后续决策。
代理的功能
我们将模型的推理能力与使用“工具”采取行动的能力结合,创建了一个可以解决多种任务的“代理”概念。通过提示描述工具,代理可以访问这些工具。例如:
[Tag(Tags.Teams)]
[Description("按名字或姓氏搜索用户,并获取他们的 ID 和电子邮件")]
public class SearchUsers : IReturn
{
public string Name { get; set; }
}
这段代码会生成一个服务命令,提示中包含以下内容:
按名字或姓氏搜索用户,并返回他们的 ID 和电子邮件:“SearchUsers”,定义:type SearchUsers = { name: string }
每个服务命令都包含请求 DTO 的名称、描述和 TypeScript 定义,帮助代理生成正确的请求结构并填充数据。
情境学习
通过“情境学习”的提示技术,代理可以使用工具返回的数据,并在后续提示中利用这些数据。例如:
- 使用
SearchUsers工具查找用户的电子邮件地址:
{
"commandName": "SearchUsers",
"commandResponse": [
{
"displayName": "Lynne Schoen",
"email": "Lynne_Schoen9@gmail.com",
"id": 6
}
]
}
- 使用
GetUserScheduleAPI 检查用户的日程安排:
获取用户的日程安排:“GetUserSchedule”,定义:type GetUserSchedule = { userId: number, schedules: string[], startTime: string, endTime: string, availabilityViewInterval: number }
代理可以将 SearchUsers 返回的 userId 用于 GetUserSchedule 请求,从而实现任务的连续性。
输出格式
每次与代理交互时,我们都会得到一个包含 command 和 thoughts 对象的 JSON 结构。例如:
{
"command": {
"name": "GetUserSchedule",
"body": {
"userId": 6,
"schedules": ["primary"],
"startTime": "2023-05-09T00:00",
"endTime": "2023-05-09T23:59"
}
},
"thoughts": {
"reasoning": "我现在正在查看 Lynne 的日程安排。",
"plan": "获取 Lynne 的空闲时间段。",
"criticism": "需要确保时间段考虑到时区差异。"
}
}
command 对象包含所使用命令的名称及其请求体,而 thoughts 对象则包含模型的推理、计划和批评。
综合应用
通过结合上述概念,我们可以创建一个能够与同事预订会议的代理。在 GptMeetingAgent 概念验证中,浏览器客户端代表代理与 API 交互,发送请求并返回响应。
我们还可以通过 [ConfirmationRequired] 属性添加额外的安全措施。例如:
[Tag(Tags.Calendar)]
[Description("创建会议")]
[ConfirmationRequired("您确定要创建会议吗?")]
public class CreateCalendarEvent : IReturn
{
public string Subject { get; set; }
public string Body { get; set; }
[Input(Type = "datetime-local")]
public DateTime Start { get; set; }
public int? MeetingRoomId { get; set; }
}
GptMeetingAgent 项目
我们构建了一个简单的 API 示例,用于搜索用户、列出日程安排并预订会议。该示例还可以扩展,例如添加 ListMeetingRooms API:
[Tag(Tags.Teams)]
[Description("获取会议室及其资源列表。")]
public class ListMeetingRooms : QueryDb
{
}
通过扩展 CreateCalendarEvent API,我们可以支持会议室预订:
public enum MeetingRoomResource
{
SmartBoard,
Projector,
Whiteboard,
VideoConferencing,
SpeakerPhone
}
代理可以使用新的 API 查找会议室资源,并在预订会议时传递正确的 MeetingRoomId。
总结
通过 GptMeetingAgent 项目,我们展示了如何结合 ChatGPT 的推理能力与 ServiceStack API,创建一个智能代理来完成复杂任务。此项目的灵活性和可扩展性使其适用于多种场景。我们期待您的反馈,以便进一步优化和完善这一工具。
原文链接: https://servicestack.net/posts/chat-gpt-agents
最新文章
- 创建调用系统API的ChatGPT代理 – ServiceStack
- 逐步指南:如何创建一个API – Kodezi博客
- API开发指南:如何构建一个API?- Emizentech
- 智能语音新革命:有道与Azure的API服务对决
- 使用 ClickHouse Cloud API 和 Terraform 进行 CI/CD
- 用ASP.NET Core 给你的API接口打造一个自定义认证授体系
- REST API与WebSocket API区别?
- 如何在Python中使用免费的DeepL翻译API
- 如何获取tavily搜索API平台秘钥(分步指南)
- API可观察性:需要监控的5个指标
- 图和图谱的区别:深入解析与应用场景
- Railyard:我们如何快速训练机器学习模型…… – Stripe