发布于 2026-01-06 0 阅读
0

我不用 Langchain 就创建了一个 Slack 代理 📌 使用 Agentica 和 OpenAI 构建 Slack 代理 1. 引言 2. 了解技术栈 3. 设置 Slack 机器人 4. 构建 AI 驱动的 Slack 功能 5. 使用 LLM 处理 Slack 消息 6. 总结与未来方向

我创建了一个没有使用 langchain 的 Slack 代理。

📌使用 Agentica 和 OpenAI 构建 Slack 代理

1.引言

2.了解技术栈

3.设置 Slack 机器人

4.构建人工智能驱动的 Slack 功能

5.使用LLM处理Slack消息

6.结论与未来方向

📌使用 Agentica 和 OpenAI 构建 Slack 代理

图片描述

1.引言

图片描述

人工智能技术的进步为各行各业和各种任务带来了显著的创新。尤其值得一提的是,将人工智能集成到办公工具中,对于高效自动化日常任务和提升人类工作能力至关重要。而这一变革的关键领域之一,便是将人工智能集成到诸如Slack之类的沟通工具中,从而打造更智能、更高效的工作环境。

Agentica是一款基于 TypeScript 的 AI 服务,它简化了在 Slack 等平台上构建和运行对话机器人的流程。Agentica 利用大型语言模型 (LLM),能够基于 Slack 消息实现无缝、上下文感知的交互,为用户提供更高效、更自然的体验。值得一提的是,Agentica 无需依赖外部数据库,即可通过 Slack 线程自动管理对话历史记录,从而使 AI 机器人能够持续进行与上下文相关的对话。

本文探讨了如何使用 Agentica 构建 Slack 机器人,并深入分析了如何在工作场所利用人工智能。此外,本文还重点阐述了人工智能集成对服务开发人员的重要性,并探讨了未来的潜在发展方向。

1.1. Agentica是什么?

Agentica 是一个开源的 TypeScript 库,它通过简化 LLM(大型语言模型)的函数调用,从而简化了 AI 开发。开发者可以使用 TypeScript 类或 Swagger(OpenAPI)定义来定义 AI 代理,使前端和后端开发者都能轻松集成 AI。Agentica 利用 TypeScript 编译器,自动验证和纠正 AI 生成的响应,从而增强了可靠性。借助 Agentica,开发者可以构建 AI 应用,这些应用不仅可以生成文本,还可以执行实际操作,例如发送电子邮件、管理文件以及与 API 交互。

1.1.1. 了解更多关于 Agentica 的信息

如需更详细地了解 Agentica,请访问官方教程:Agentica 教程

本教程提供了丰富的实用示例,包括如何将 Agentica 与文件系统和常用服务集成。您无需了解复杂的 AI 概念或编写复杂的代码。

  • 前端开发人员:如果您了解 TypeScript 并且能够使用类,那就没问题了。
  • 后端开发人员:只需将您的 Swagger 定义插入到提供的代码片段中,Agentica 将处理其余部分。

1.2. 为什么选择 Agentica 来管理 Slack 代理?

1.2.1. 简化 Slack Agent 的开发

使用 Agentica 可以极大地简化 Slack 代理的开发流程。您可以从示例代码中轻松看出它的简洁性。要与像 Slack 这样复杂的系统集成,您只需定义一个 TypeScript 类。然后,只需将该类作为泛型传递给 `<type>`application部分,并在 ` execute<type>` 部分提供该类的实例即可。就是这么简单。

import { Agentica } from "@agentica/core";
import typia from "typia";
import dotenv from "dotenv";
import { OpenAI } from "openai";

import { SlackService } from "@wrtnlabs/connector-slack";

dotenv.config();

export const agent = new Agentica({
  model: "chatgpt",
  vendor: {
    api: new OpenAI({
      apiKey: process.env.OPENAI_API_KEY!,
    }),
    model: "gpt-4o-mini",
  },
  controllers: [
    {
      name: "Slack Connector",
      protocol: "class",
      application: typia.llm.application<SlackService, "chatgpt">(),
      execute: new SlackService(),
    },
  ],
});

const main = async () => {
  console.log(await agent.conversate("What can you do?"));
};

main();

Enter fullscreen mode Exit fullscreen mode

这种结构简洁明了,避免了不必要的配置和复杂性,为开发者提供了极大的便利。尤其是在处理像 Slack 这样需要多个 API 集成的系统时,Agentica 可以轻松地组合不同的 API。这得益于 TypeScript 强大的类型推断功能,它能够轻松应对这种复杂性。

此外,Agentica 内置了历史记录管理功能,因此开发人员无需手动管理请求和响应的历史记录。它会自动跟踪这些记录,您可以灵活地修改或管理历史记录,从而使流程更加顺畅。

因此,Agentica 不仅适用于开发 Slack 代理,还可用于整合各种工具,从而高效管理复杂系统。开发人员可以消除不必要的复杂性,专注于核心逻辑,从而大幅提高工作效率。

1.3 预期收益和主要特点

使用 Agentica 开发 Slack 代理的主要优势如下:

1.3.1. 简化的开发流程

使用 Agentica,您无需直接操作 Slack API。通过利用 TypeScript 类和清晰的类型定义,您可以轻松集成 Slack 服务。这显著加快了开发速度,因为您无需手动解析复杂的响应或处理原始 API 请求。

1.3.2. TypeScript 的强类型系统和类型推断

使用 Agentica 时,TypeScript 的类型系统是一大优势。凭借强大的类型推断功能,您可以自信地处理像 Slack 这样复杂的集成。使用typiaTypeScript 进行类型验证,您可以确保代码按预期运行,而无需担心错误或不一致。

1.3.3. 无缝 API 集成

Slack 需要多个 API 来处理不同的任务。Agentica 可以实现多个 API 的无缝集成,抽象化管理各种请求和响应的复杂性。开发者可以专注于构建代理的逻辑,而无需担心系统之间的交互方式。

1.3.4. 便于开发者使用的文档和教程

Agentica 提供易于理解的文档和教程。凭借清晰的示例和分步指南,即使是 AI 集成经验有限的开发人员也能构建功能强大的 Slack 代理,而无需经历陡峭的学习曲线。

2.了解技术栈

2.1. Agentica 如何简化 LLM 函数调用

Agentica显著简化了 LLM 函数调用。传统上,与 LLM API 交互涉及复杂的身份验证、有效负载处理和响应解析,而Agentica抽象化了所有这些复杂性。通过使用Agentica,开发人员可以专注于编写简单的 TypeScript 类,而后端复杂性则由该工具处理。通过集成typia等工具,开发人员可以确保函数参数和响应经过强类型验证,从而减少错误并提高函数调用期间的代码稳定性。

2.2. Slack API 和事件订阅概述

Slack API是一款功能强大的工具,可将外部服务与 Slack 集成,使用户能够在 Slack 内发送消息、管理频道并自动化工作流程。它允许开发人员构建自定义应用程序、机器人和工作流程,与 Slack 频道、用户和消息进行交互。该 API 提供了一系列端点,用于执行诸如发布消息、管理频道、发送文件和处理用户交互等任务。

Slack API 的一项关键特性是事件订阅。事件订阅允许开发者监听 Slack 中发生的特定事件,例如频道中发布的消息或用户加入工作区。这种实时事件驱动模型使应用程序能够对 Slack 中的变化做出即时反应,因此非常适合构建交互式、响应迅速的机器人和集成应用。

订阅事件时,开发者需要指定要监听的事件类型,例如消息事件、用户事件或频道事件。这些事件随后会被发送到指定的请求 URL,应用程序可以在该 URL 上处理事件并执行相应的操作,例如向 Slack 发送响应或触发其他工作流。事件订阅通过提供实时数据,可以极大地增强 Slack 集成的功能和交互性。

3.设置 Slack 机器人

3.1 创建和配置 Slack 应用

要将您的代理集成到 Slack 机器人中,第一步是创建一个 Slack 应用。请按照以下步骤操作:

  1. 创建 Slack 应用:
    • 访问Slack API网站,然后点击“创建新应用”。
    • 选择“从头开始”,然后输入应用程序的名称以及应用程序的安装位置。
    • 应用创建完成后,您将被引导至应用的设置页面。
  2. 配置机器人权限:

    在“OAuth 和权限”下,设置您的机器人与 Slack 交互所需的权限范围。例如,要监听消息并做出响应,需要app_mentions:read相应的权限。chat:write

    此外,我建议添加以下权限范围,以确保您的机器人能够全面访问 Slack 的各种功能:

- `channels:read`: To view basic information about channels.
- `channels:history`: To read messages in channels.
- `users.profile:read`: To read users' profile information.
- `im:read`: To read direct messages.
- `groups:read`: To read information about private groups.
- `chat:write`: To send messages.
- `users:read`: To read user information.
- `usergroups:read`: To access user group information.
- `files:read`: To access files in Slack.
- `team:read`: To read team-level information.

These scopes will provide your bot with the necessary permissions to interact seamlessly within your Slack workspace.
Enter fullscreen mode Exit fullscreen mode
  1. 设置机器人配置文件:
    • 在“应用主页”部分,您可以自定义机器人的显示名称和头像。这有助于个性化机器人在 Slack 频道中的形象。
  2. 请记下您的应用凭据:
    • 请务必从“OAuth 和权限”页面记录机器人用户 OAuth 令牌,因为需要此令牌来验证来自机器人的 API 请求。

3.2. 启用事件订阅

Slack 中的事件订阅功能允许您的机器人对提及、消息或频道活动等事件做出反应。要为您的 Slack 机器人设置事件订阅,请按照以下步骤操作:

  1. 启用事件订阅:
    • 在 Slack 应用的设置中,导航至“事件订阅”部分。
    • 切换开关以启用事件订阅。这将允许你的机器人监听 Slack 工作区中发生的特定事件。
  2. 请提供请求网址:
    • 您需要输入请求 URL。此 URL 是 Slack 发送事件数据的端点,也是您的服务器监听事件的位置。
    • 如果你在本地进行测试,可以使用像ngrok这样的服务将你的本地服务器暴露给互联网。
    • 确保您的服务器能够响应 Slack 的验证请求,返回challengeSlack 发送的用于确认您的端点的参数。
  3. 订阅活动:
    • 在“订阅机器人事件”下,选择与您的机器人相关的事件。例如,您可以订阅app_mention当您的机器人在 Slack 频道中被提及时触发的事件。
    • 这样可以确保你的机器人能够在 Slack 中被提及时收到消息。

完成这些步骤后,您的机器人将能够监听 Slack 事件并实时做出响应,从而为用户创造完全互动的体验。

4.构建人工智能驱动的 Slack 功能

4.1. 在 TypeScript 项目中设置 Agentica

在 TypeScript 项目中配置 Agentica 的方法有很多种,具体取决于您的偏好和需求。以下是两种常用的方法:

  1. 使用 Agentica CLI
    运行以下命令即可快速设置功能齐全的 Slack Agent:

    npx agentica start slack-agent
    

    CLI 将引导您完成设置过程,包括安装所需的软件包、选择软件包管理器、选择 Slack 控制器以及输入您的OPENAI_API_KEY. 完成后,Agentica 会自动生成必要的代码、创建.env文件并安装所有依赖项。

  2. 使用预构建的存储库
    或者,您可以克隆wrtnlabs/agentica.slack.bot 存储库,配置环境变量,并开始使用预制解决方案。

4.2. 使用类型注释定义 AI 代理函数

您可以通过创建 TypeScript 类并指定输入/输出类型来定义 AI 代理的功能。以下是一个定义文件系统代理类的简化示例:

import { Agentica } from "@agentica/core";
import dotenv from "dotenv";
import OpenAI from "openai";
import typia from "typia";

dotenv.config();

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

class FsClass {
  async __dirname(): Promise<string> {
    return __dirname;
  }

  async readdirSync(input: { path: string }): Promise<string[]> {
    return fs.readdirSync(input.path);
  }

  async readFileSync(input: { path: string }): Promise<string> {
    return fs.readFileSync(input.path, { encoding: "utf-8" }) as string;
  }

  async writeFileSync(input: { file: string; data: string }): Promise<void> {
    return fs.writeFileSync(input.file, input.data);
  }
}

export const FileSystemAgent = new Agentica({
  model: "chatgpt",
  vendor: {
    api: openai,
    model: "gpt-4o-mini",
  },
  controllers: [
    {
      name: "File Connector",
      protocol: "class",
      application: typia.llm.application<FsClass, "chatgpt">(),
      execute: new FsClass(),
    },
  ],
});

Enter fullscreen mode Exit fullscreen mode

有关更详细的示例,包括使用文件系统模块,请查看本教程

如果您更喜欢使用预构建的解决方案,可以使用wrtnlabs 团队提供的Slack 连接器。

4.3. 使用 AI 响应处理 Slack 事件

您提供的代码演示了如何将Agentica与 Slack 集成,以处理事件并使用 OpenAI 的 GPT 模型生成 AI 驱动的回复。该过程包括接收 Slack 事件(尤其是在提及机器人时),并使用 AI 驱动的智能回复进行响应。以下是此集成的工作原理详解:

4.3.1.处理 Slack 交互事件

handleInteractivity方法旨在处理来自 Slack 的交互请求。该方法:

  • 验证 URL:如果事件类型为url_verification,则返回挑战参数以完成 Slack 应用验证过程。
  • app_mention事件处理:机器人仅处理被提及的事件(app_mention)。它会检查事件是否被提及,以及机器人是否已做出响应,以避免重复处理。
  • 检查重复事件:该方法使用cacheManager存储事件并防止响应重叠。

4.3.2.确保机器人只对相关的提及做出回应

  • 机器人提及验证:机器人会检查它是否被明确提及,方法是验证事件是否text包含机器人的用户 ID(<@bot_id>)。
  • 防止自身回复:机器人通过检查事件是否user与其自身的用户 ID 匹配来避免回复自己的消息。
  • 线程锁定:为了防止同一线程中同时出现多个响应,使用锁定机制(threadLock映射)来确保每个线程一次只处理一个请求。

4.3.3.处理线程回复和构建历史记录

  • 检索线程回复:机器人使用该slackService.getReplies方法获取对话历史记录(线程中的回复)。
  • 排除机器人自身的回复:如果最后一条回复是由机器人发送的,则不会再发送回复。
  • 构建对话历史记录:机器人会histories根据对话串中的回复构建一个对话历史记录(数组)。该历史记录将用于在使用 Agentica 生成回复时维护上下文。

4.3.4生成人工智能响应

  • 创建 Agentica 实例:机器人初始化一个Agentica实例,传入 OpenAI API、对话历史记录以及任何必要的控制器(例如 GitHub 和 KakaoMap 连接器)。该systemPrompt实例用于指导 AI 在对话期间的行为。
  • 生成并发送回复:人工智能会根据对话串中的最新消息生成回复。回复内容经过筛选提取文本,并作为回复发送回 Slack。

4.3.5.响应处理和最终步骤

  • 发送最终答案:机器人检查有效回复(lastAnswer),并使用将其发送回 Slack 线程slackService.sendReply
  • 释放线程锁:处理完成后,锁将被释放,允许机器人处理未来的事件。

这段代码实现了一个 Slack 机器人,它可以监听提及、收集对话回复历史记录,并使用人工智能(通过 Agentica)生成回复。然后,回复会被发送回 Slack,从而通过智能的、上下文感知的消息增强互动体验。

这种结构确保机器人仅在适当的时候做出回应,防止重复回复,并利用人工智能根据对话上下文提供有意义的答案。这是一种将人工智能高效集成到 Slack 工作流程中的方法,同时避免冗余或冲突的回复。

5.使用LLM处理Slack消息

5.1. 使用 Agentica 管理 Slack 对话历史记录

Agentica 利用 Slack 线程来管理 Slack 消息事件的对话历史记录。它不会将数据单独存储在数据库中,而是直接检索并使用与事件关联的线程内容。每个 Slack 线程都充当对话历史记录的容器,LLM 会引用此历史记录来生成回复。

当用户与 Slack 机器人互动时,Agentica 会抓取对话线程中的回复,构建对话历史记录,以此指导 LLM 生成回复。通过这种自动管理对话历史记录的方式,机器人无需外部存储系统即可提供与上下文相关的回复。

5.2 生成上下文感知响应

Agentica 利用 Slack 对话线程中的历史记录,确保回复能够反映整个对话的上下文。这种方法可以避免重复或与上下文无关的回复,从而保持对话的自然性和相关性。

由于线程如同数据库一般运作,用户可以在同一线程中持续互动,保持对话的流畅性。此外,用户可以在对话过程中调用客服,客服会无缝生成回复,不会中断对话流程。即使在对话进行中调用客服,上下文信息也会被保留,从而实现流畅的交互,并确保对话顺利进行。

5.3 生成上下文感知响应

Agentica 使用 Slack 线程作为数据库来管理对话的上下文。每个 Slack 线程在维持讨论流程中都发挥着关键作用。当收到事件时,Agentica 会获取线程内容并了解对话的进展情况。这使得对话能够自然地继续进行,Slack 中的所有互动都成为一个连贯流程的一部分。

有趣的是,用户可以随时呼叫客服,即使是在 Slack 中与其他人聊天时也可以。例如,如果用户正在与同事聊天,然后呼叫客服,客服可以理解对话的上下文并生成相应的回复。在此过程中,无需手动存储或管理之前的对话或消息——Slack 线程本身会自动处理这些。这意味着在对话过程中呼叫客服不会造成任何问题。

6.结论与未来方向

6.1.从使用 Agentica 开发 Slack 机器人中汲取的经验教训

通过将人工智能与 Slack 等热门商业工具集成,该服务变得更加用户友好和实用。人们常说人工智能可以增强人类能力,但它的作用远不止于此——它还能提升现有服务,使其更具吸引力和集成度。这种方法不仅改善了用户体验,还提高了客户满意度,使产品更受用户喜爱。因此,服务开发者,而不仅仅是人工智能专家,都需要更加重视将人工智能集成到他们的产品中。这不再仅仅是人工智能开发者的领域;这是一个更广泛的机遇,可以为任何服务增添巨大的价值,使其更具吸引力和效率。

6.2潜在改进和新功能

通过使用 Agentica,我们发现仅仅依赖 Slack 消息有时会限制语言学习者 (LLM) 回忆对话深层内容的能力。当 LLM 在回复前处理多个思考步骤,但 Slack 只发送一条消息时,这些中间步骤的上下文信息可能会丢失。这会导致 LLM 在后续回复中缺乏上下文信息。为了解决这个问题,我们需要通过单独存储和引用 LLM 的深层思考过程来增强记忆管理,从而确保上下文信息能够长期保持完整。

此外,扩展 Agentica 与其他应用程序的集成并改进 API 支持对于使用户能够创建功能更丰富、用途更广的聊天机器人至关重要。这包括处理跨渠道对话并提供更流畅的交互体验。

6.3开源贡献和后续步骤

作为开源项目,Agentica 的发展离不开社区的贡献。展望未来,我们致力于与用户和开发者携手合作,添加更多功能,完善文档,并提供示例,帮助其他用户将 AI 解决方案集成到自己的项目中。通过进一步优化响应生成逻辑并支持与更多平台集成,Agentica 将助力服务开发者打造更智能、更具情境感知能力的机器人。此外,通过提供实时反馈和高级配置,我们将帮助用户创建高度定制化的 AI 助手,满足其特定需求。

文章来源:https://dev.to/kakasoo/i-made-slack-agent-without-langchain-3dac