使用 Qdrant、CAMEL-AI 和 OpenAI 构建基于 Agentic RAG 的 Discord 聊天机器人
与传统被动检索上下文并生成响应的 RAG 技术不同,Agentic RAG 涉及聊天机器人的主动决策和多步推理。聊天机器人不再只是获取数据,而是进行决策,动态地与各种数据源交互,并根据上下文进行调整,从而使其具有更动态和智能的方法。
在本教程中,我们将使用 Qdrant、CAMEL-AI 和 OpenAI 开发一个功能齐全的聊天机器人。
让我们开始吧!
工作流程概述
下面是 Agentic RAG 工作流程的高级视图
步骤 | 描述 |
---|---|
1. 环境设置 | 安装所需的库(camel-ai 、qdrant-client 、discord.py )并设置 Python 环境。 |
2. 设置 OpenAI 嵌入实例 | 创建一个 OpenAI 账户,生成 API 密钥,并配置嵌入模型。 |
3. 配置 Qdrant 客户端 | 注册 Qdrant Cloud,创建一个集群,配置 QdrantStorage ,并设置 API 连接。 |
4. 抓取和处理数据 | 使用 VectorRetriever 抓取 Qdrant 文档,分割文本,并将嵌入存储在 Qdrant 中。 |
5. 设置 CAMEL-AI ChatAgent | 使用 OpenAI 模型实例化 CAMEL-AI ChatAgent ,以实现多步推理和上下文感知响应。 |
6. 创建和配置 Discord Bot | 在 Discord Developer Portal 中注册一个新的 bot,邀请它加入服务器,并启用权限。 |
7. 构建 Discord Bot | 将 Discord.py 与 CAMEL-AI 和 Qdrant 集成,以检索上下文并生成智能响应。 |
8. 测试 Bot | 在实际的 Discord 服务器中运行 bot,并验证它是否提供了相关且上下文丰富的答案。 |
架构图
下面是表示聊天机器人工作流程和交互的架构图
工作流程首先使用 vector_retriever.process()
方法从 URL 抓取、分块和上传插入内容,该方法使用 OpenAI 嵌入实例生成嵌入向量。然后,这些嵌入向量及其元数据通过 QdrantStorage
类被索引并存储在 Qdrant 中。
当用户通过 Discord Bot 发送查询时,查询会由 vector_retriever.query()
处理,该方法首先使用 OpenAI Embeddings 嵌入查询,然后通过 QdrantStorage
从 Qdrant 中检索最相关的匹配项。然后,检索到的上下文(例如,相关的文档片段)会被传递给 CAMEL-AI 下的 OpenAI 驱动的 Qdrant Agent,由其生成最终的、上下文感知的响应。
Qdrant Agent 使用 GPT_4O_MINI
语言模型处理检索到的向量,生成与用户查询相关的上下文响应。然后,此响应通过 Discord Bot 发送回用户,完成整个流程。
步骤 1:环境设置
在深入实现之前,这里是我们将使用的技术栈的高级概述
组件 | 用途 |
---|---|
Qdrant | 用于存储和查询文档嵌入向量的向量数据库。 |
OpenAI | 用于生成向量表示和聊天机器人响应的嵌入和语言模型。 |
CAMEL-AI | 用于管理对话流程、检索和 AI Agent 交互的框架。 |
Discord API | 用于部署聊天机器人并与之交互的平台。 |
安装依赖项
我们将安装 CAMEL-AI,它包含所有必要的依赖项
!pip install camel-ai[all]==0.2.17
步骤 2:设置 OpenAI 嵌入实例
创建 OpenAI 账户:前往 OpenAI,如果您还没有账户,请注册一个。
生成 API 密钥:
登录后,单击右上角的个人资料图标,然后选择 API keys。
单击 Create new secret key。
复制生成的 API 密钥并安全存储。您将无法再次看到它。
以下是如何在代码中设置 OpenAI 客户端
在您的项目目录中创建一个 .env
文件并添加您的 API 密钥
OPENAI_API_KEY=<your_openai_api_key>
请务必将 <your_openai_api_key>
替换为您实际的 API 密钥。
现在,启动 OpenAI 客户端
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai_client = openai.Client(
api_key=os.getenv("OPENAI_API_KEY")
)
为了设置嵌入实例,我们将使用 text embedding 3 large
from camel.embeddings import OpenAIEmbedding
from camel.types import EmbeddingModelType
embedding_instance = OpenAIEmbedding(model_type=EmbeddingModelType.TEXT_EMBEDDING_3_LARGE)
步骤 3:配置 Qdrant 客户端
对于本教程,我们将使用 Qdrant Cloud 免费套餐。设置方法如下
创建账户:在 Qdrant Cloud 注册一个 Qdrant Cloud 账户。
创建集群:
- 导航到 Overview 部分。
- 按照 Create First Cluster 下的新手引导说明设置您的集群。
- 创建集群时,您将收到一个 API 密钥。复制并安全存储它,稍后会用到。
等待集群配置完成:
- 您的新集群将出现在 Clusters 部分下方。
获取您的 Qdrant Cloud 详细信息后,将其添加到您的 .env
文件中
QDRANT_CLOUD_URL=<your-qdrant-cloud-url>
QDRANT_CLOUD_API_KEY=<your-api-key>
配置 QdrantStorage
QdrantStorage
将处理与 Qdrant 客户端的连接,以执行对您的集合进行所有必要操作。
from camel.retrievers import VectorRetriever
# Define collection name
collection_name = "qdrant-agent"
storage_instance = QdrantStorage(
vector_dim=embedding_instance.get_output_dim(),
url_and_api_key=(
qdrant_cloud_url,
qdrant_api_key,
),
collection_name=collection_name,
)
请务必更新 <your-qdrant-cloud-url>
和 <your-api-key>
字段。
步骤 4:抓取和处理数据
我们将使用 CamelAI 的 VectorRetriever
库来帮助我们处理来自文件或 URL 的内容,将其分割成块,并将嵌入存储在指定的 Qdrant 集合中。
from camel.retrievers import VectorRetriever
vector_retriever = VectorRetriever(embedding_model=embedding_instance,
storage=storage_instance)
qdrant_urls = [
"https://qdrant.org.cn/documentation/overview",
"https://qdrant.org.cn/documentation/guides/installation",
"https://qdrant.org.cn/documentation/concepts/filtering",
"https://qdrant.org.cn/documentation/concepts/indexing",
"https://qdrant.org.cn/documentation/guides/distributed_deployment",
"https://qdrant.org.cn/documentation/guides/quantization"
# Add more URLs as needed
]
for qdrant_url in qdrant_urls:
vector_retriever.process(
content=qdrant_url,
)
步骤 5:设置 CAMEL-AI ChatAgent 实例
定义 OpenAI 模型并创建一个 CAMEL-AI ChatAgent 实例。
from camel.configs import ChatGPTConfig
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.agents import ChatAgent
# Create a ChatGPT configuration
config = ChatGPTConfig(temperature=0.2).as_dict()
# Create an OpenAI model using the configuration
openai_model = ModelFactory.create(
model_platform=ModelPlatformType.OPENAI,
model_type=ModelType.GPT_4O_MINI,
model_config_dict=config,
)
assistant_sys_msg = """You are a helpful assistant to answer question,
I will give you the Original Query and Retrieved Context,
answer the Original Query based on the Retrieved Context,
if you can't answer the question just say I don't know."""
qdrant_agent = ChatAgent(system_message=assistant_sys_msg, model=openai_model)
步骤 6:创建和配置 Discord Bot
现在让 bot 活跃起来!它将作为用户与您构建的 agentic RAG 系统交互的接口。
创建新的 Discord Bot
前往 Discord Developer Portal 并使用您的 Discord 账户登录。
单击 New Application 按钮。
为您的应用程序命名并单击 Create。
导航到左侧边栏的 Bot 选项卡,然后单击 Add Bot。
Bot 创建后,在 Token 部分下单击 Reset Token 以生成新的 bot 令牌。安全地复制此令牌,稍后会用到。
邀请 Bot 加入您的服务器
转到 OAuth2 选项卡,然后转到 URL Generator 部分。
在 Scopes 下,选择 bot。
在 Bot Permissions 下,选择必要的权限
发送消息
读取消息历史记录
复制生成的 URL 并将其粘贴到您的浏览器中。
选择您想邀请 bot 加入的服务器,然后单击 Authorize。
授予 Bot 权限
返回 Bot 选项卡。
在 Privileged Gateway Intents 下启用以下选项
服务器成员意图
消息内容意图
现在,bot 已准备好与您的代码集成。
步骤 7:构建 Discord Bot
添加到您的 .env
文件中
DISCORD_BOT_TOKEN=<your-discord-bot-token>
我们将使用 discord.py
创建一个简单的 Discord Bot,它与用户交互,并在响应前从 Qdrant 检索上下文。
from camel.bots import DiscordApp
import nest_asyncio
import discord
nest_asyncio.apply()
discord_q_bot = DiscordApp(token=os.getenv("DISCORD_BOT_TOKEN"))
@discord_q_bot.client.event # triggers when a message is sent in the channel
async def on_message(message: discord.Message):
if message.author == discord_q_bot.client.user:
return
if message.type != discord.MessageType.default:
return
if message.author.bot:
return
user_input = message.content
retrieved_info = vector_retriever.query(
query=user_input, top_k=10, similarity_threshold=0.6
)
user_msg = str(retrieved_info)
assistant_response = qdrant_agent.step(user_msg)
response_content = assistant_response.msgs[0].content
if len(response_content) > 2000: # discord message length limit
for chunk in [response_content[i:i+2000] for i in range(0, len(response_content), 2000)]:
await message.channel.send(chunk)
else:
await message.channel.send(response_content)
discord_q_bot.run()
步骤 9:测试 Bot
使用 Discord Developer Portal 中的 OAuth2 URL 邀请您的 bot 加入您的 Discord 服务器。
运行 Notebook。
在您的 Discord 服务器中开始与 bot 聊天。它将从 Qdrant 检索上下文,并根据您的查询提供相关答案。
结论
干得好!您已经构建了一个基于 agentic RAG 的 Discord Bot,它使用 Qdrant 检索相关信息,使用 OpenAI 生成智能响应,并使用 CAMEL-AI 处理多步推理。这里是快速回顾
智能知识检索:您的聊天机器人现在可以使用 Qdrant 的向量搜索从大型数据集中提取相关信息。
使用 CAMEL-AI 实现自主推理:实现多步推理,而不仅仅是重复文本。
实时 Discord 部署:您已将聊天机器人部署到 Discord,使其具有交互性,并准备好为真实用户提供帮助。
CAMEL-AI 最大的优势之一在于它提供的抽象层,让您可以专注于设计智能交互,而无需担心低级实现细节。
您现在已经具备了处理更复杂的实际问题所需的知识,这些问题需要可扩展的、自主的知识系统。