创建调用系统API的ChatGPT代理 - ServiceStack

作者:API传播员 · 2025-12-13 · 阅读时间:6分钟
本文介绍如何通过GptMeetingAgent项目,结合ChatGPT的推理能力与ServiceStack API,创建智能代理以完成复杂任务,如会议预订。利用思维链、情境学习和自定义API工具,代理能够根据上下文推理并调用系统API,实现任务自动化。

简介

我们一直在探索如何通过不同的模式和概念验证,使 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.TeamsTags.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 定义,帮助代理生成正确的请求结构并填充数据。


情境学习

通过“情境学习”的提示技术,代理可以使用工具返回的数据,并在后续提示中利用这些数据。例如:

  1. 使用 SearchUsers 工具查找用户的电子邮件地址:
{
  "commandName": "SearchUsers",
  "commandResponse": [
    {
      "displayName": "Lynne Schoen",
      "email": "Lynne_Schoen9@gmail.com",
      "id": 6
    }
  ]
}
  1. 使用 GetUserSchedule API 检查用户的日程安排:
获取用户的日程安排:“GetUserSchedule”,定义:type GetUserSchedule = { userId: number, schedules: string[], startTime: string, endTime: string, availabilityViewInterval: number }

代理可以将 SearchUsers 返回的 userId 用于 GetUserSchedule 请求,从而实现任务的连续性。


输出格式

每次与代理交互时,我们都会得到一个包含 commandthoughts 对象的 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