如何在 Slack 中构建类似 Perplexity 的聊天机器人?
TL;DR
我在 Slack 上花费了大量时间,经常需要深入研究信息。为此,我不得不去谷歌搜索,手动研究各种主题,这在人工智能时代似乎效率低下。
因此,我构建了一个 Slack 聊天机器人来访问互联网并查找带有引文的相关信息,类似于 Perplexity。
以下是我构建它的方法;
- 在工作区中配置 SlackBot。
- 机器人将工作区中的所有消息转发给事件监听器。
- 解析消息事件中的信息并将其传递给 AI 代理。
- 配备 Exa 和 Tavily 等工具的 AI 代理会在互联网上搜索主题并返回响应。
- 然后,代理的回复将作为评论发布在主消息线程中。
立即在 Composio Playground👇 上试用 Agent。
什么是人工智能代理?
在继续之前,让我们先了解一下什么是 AI 代理。
人工智能代理是由人工智能模型驱动的系统,可以自主执行任务、与环境交互并根据其编程和处理的数据做出决策。
您的 AI 代理工具平台🛠️
Composio 是一个开源平台,提供超过 150 种可用于生产的工具和集成,例如 GitHub、Slack、Code Interpreter 等,使 AI 代理能够完成复杂的现实世界工作流程。

请帮我们加一颗星。🥹
这将有助于我们创作更多这样的文章💖
让我们开始吧🔥
从创建虚拟环境开始。
python -m venv slack-agent
cd slack-agent
source bin/activate
现在,安装库。
pip install composio-core composio-llamaindex
pip install llama-index-llms-openai python-dotenv
图书馆的简要描述
- 这
composio-core
是访问和配置工具及集成的主要库。它还具有 CLI API,可方便地管理集成和触发器。 - 这
composio-llamaindex
是 Composio 的LlamaIndex 插件。它允许您将 LlamaIndex 的所有功能与 Composio 工具一起使用。 - 这
llama-index-llms-openai
是 LlamaIndex 的一个附加库,可让您在其框架内使用 OpenAI 模型。 python-dotenv
将文件中的环境变量加载.env
到 Python 项目的环境中,从而更容易管理配置设置。
接下来,创建一个 .env
文件并为 OpenAI API 密钥添加环境变量。
OPENAI_API_KEY=your API key
配置集成 *🔧 *
Composio 允许您配置 SlackBot,而无需为集成编写任何代码。Composio 会处理所有用户身份验证和授权流程,因此您可以专注于更快地交付。
您可以使用 Composio 的专用 CLI API 从终端执行此操作。
但在此之前,请从 CLI 登录 Composio 并通过运行以下命令来更新应用程序。
composio login
composio apps update
完成登录流程以使用 Composio CLI API。
执行以下命令来配置 Slackbot 和 GitHub 用户帐户。
composio add slackbot
现在,完成身份验证流程以添加 Slackbot 集成。
完成集成流程后,您的实时集成将出现在 “集成” 部分。
一旦 SlackBot 集成,请转到工作区中的应用程序部分,获取 BOT ID,并将其添加到 .env
文件中。
设置 SlackBot 触发器⚙️
触发器是预定义的条件,当满足这些条件时会激活代理。Composio 提供了一个内置的事件监听器来捕获这些触发事件。
在这里,我们设置了一个 SlackBot 触发器,当新消息添加到工作区时获取事件数据,当新消息添加到线程时设置另一个触发器。
composio triggers enable slack-receive-message
composio triggers enable slackbot_receive_thread_reply
转到触发器部分并添加您需要的触发器。
此外,您还可以从SlackBot 页面的仪表板添加触发器。
转到触发器部分并添加您需要的触发器。
构建 Agentic 工作流程
现在我们已经设置了集成和触发器,让我们继续编码部分。
步骤 1:导入包并定义工具
创建一个main.py
文件并粘贴以下代码。
import os
from dotenv import load_dotenv
from composio_llamaindex import Action, App, ComposioToolSet
from composio.client.collections import TriggerEventData
from llama_index.core.agent import FunctionCallingAgentWorker
from llama_index.core.llms import ChatMessage
from llama_index.llms.openai import OpenAI
load_dotenv()
llm = OpenAI(model="gpt-4o")
# Bot configuration constants
BOT_USER_ID = os.environ["SLACK_BOT_ID"] # Bot ID for Composio. Replace with your bot member ID, once the bot joins the channel.
RESPOND_ONLY_IF_TAGGED = (
True # Set to True to have the bot respond only when tagged in a message
)
# Initialize the Composio toolset for integration with the OpenAI Assistant Framework
composio_toolset = ComposioToolSet()
composio_tools = composio_toolset.get_tools(
apps=[App.CODEINTERPRETER, App.EXA, App.FIRECRAWL, App.TAVILY]
)
上面的代码块是这样的,
- 我们导入了项目所需的包和模块。
- 使用 将变量设置
.env
为环境变量load_dotenv()
。 - 设置全局变量BOT_USER_ID和RESPOND_ONLY_IF_TAGGED。
- 初始化 Composio 工具集。
- 添加代码解释器、Exa、Fire Crawl 和 Tavily 服务作为工具。
第 2 步:定义代理
现在使用工具和 llm 定义 Slack 代理。
# Define the Crew AI agent with a specific role, goal, and backstory
prefix_messages = [
ChatMessage(
role="system",
content=(
"You are now an integration agent, and whatever you are requested, you will try to execute utilizing your tools."
),
)
]
agent = FunctionCallingAgentWorker(
tools=composio_tools,
llm=llm,
prefix_messages=prefix_messages,
max_function_calls=10,
allow_parallel_tool_calls=False,
verbose=True,
).as_agent()
- 我们定义了代理使用
FunctionCallingAgentWorker
带有前缀的消息作为系统提示。 - 这为法学硕士提供了有关角色和期望的更多背景信息。
- 已为代理提供了定义的工具。
- 该
max_function_calls
参数设置遇到任何错误时代理将重试的次数。 - 详细程度设置为 True 以记录完整的代理工作流程。
注意:FunctionCallingAgentWorker
仅支持具有函数调用能力的 LLM,如 GPT、Mistral 和 Anthropic 模型。
步骤3:定义事件监听器
下一步是设置事件监听器。它将接收来自 Slack 中触发事件的有效负载。
有效载荷包含所需的事件信息,例如频道 ID、消息文本、时间戳等。您可以检索所需的信息、处理它并执行操作。
# Create a listener to handle Slack events and triggers for Composio
listener = composio_toolset.create_trigger_listener()
# Callback function for handling new messages in a Slack channel
@listener.callback(filters={"trigger_name": "slackbot_receive_message"})
def callback_new_message(event: TriggerEventData) -> None:
payload = event.payload
user_id = payload.get("event", {}).get("user", "")
# Ignore messages from the bot itself to prevent self-responses
if user_id == BOT_USER_ID:
return
message = payload.get("event", {}).get("text", "")
# Respond only if the bot is tagged in the message if configured to do so
if RESPOND_ONLY_IF_TAGGED and f"<@{BOT_USER_ID}>" not in message:
print("Bot not tagged, ignoring message")
return
# Extract channel and timestamp information from the event payload
channel_id = payload.get("event", {}).get("channel", "")
ts = payload.get("event", {}).get("ts", "")
thread_ts = payload.get("event", {}).get("thread_ts", ts)
# Process the message and post the response in the same channel or thread
result = agent.chat(message)
print(result)
composio_toolset.execute_action(
action=Action.SLACKBOT_CHAT_POST_MESSAGE,
params={
"channel": channel_id,
"text": result.response,
"thread_ts": thread_ts,
},
)
listener.listen()
callback_new_message
当 Slack 中的触发事件匹配时,会调用回调函数slackbot_receive_message
。- 从事件负载中提取用户 ID。如果与机器人 ID 匹配,则跳过该流程。
- 如果没有,代码会检查消息中是否含有所提到的机器人 ID。
- 我们提取消息、频道 ID 和时间戳。
- 该消息传递给您之前定义的 Slack 代理。
- 然后将代理的响应发送到 Slack。
现在,一旦一切设置完毕,运行 Python 文件。
确保已在频道中正确设置 Slack 机器人。以下是如何将 Slack 机器人添加到频道👇。
当您在 Slack 中发送标记机器人的消息时,事件监听器会接收有效负载,代理会对其采取行动,然后将响应发送回同一个 Slack 频道。
这是 Slack 机器人运行的完整视频。
让我们联系吧!🔌
您可以加入我们的社区,与维护人员互动,并以开源开发者的身份做出贡献。欢迎访问我们的 GitHub 代码库,贡献代码并创建与 Composio 相关的 issue。
本教程的源代码也可以在这里找到,请查看其他框架的实现:
感谢您的阅读!
文章来源:https://dev.to/composiodev/how-to-build-a-perplexity-like-chatbot-in-slack-533j