Чат-бот для Discord с агентным подходом к извлечению информации (RAG), использующий Vector DB, CAMEL-AI и OpenAI#

В отличие от традиционных методов, RAG пассивно извлекающих контекст и генерирующих ответы, агентный RAG предполагает активное принятие решений и многошаговую логику рассуждений со стороны чат-бота. Вместо простого извлечения данных бот принимает решения, динамически взаимодействует с различными источниками данных и адаптируется в зависимости от контекста, обеспечивая гораздо более динамичный и интеллектуальный подход.

В этом руководстве будет разработан полностью функциональный чат-бот, используя Platform V Vector DB (далее - Vector DB), CAMEL-AI и OpenAI.

Обзор рабочего процесса#

Ниже приведен обзор высокого уровня рабочего процесса с агентным RAG:

Шаг

Описание

1. Настройка среды

Установите необходимые библиотеки (camel-ai, qdrant-client, discord.py), настройте среду Python

2. Настройка экземпляра встраивания OpenAI

Создайте учетную запись OpenAI, создайте ключ API и сконфигурируйте модель встраивания

3. Настройка клиента Vector DB

Cоздайте кластер, настройте QdrantStorage и установите соединение по API

4. Извлечение и обработка данных

Используйте VectorRetriever для парсинга документации Vector DB, разбиения текста на части и хранения вложений в Vector DB

5. Настройка агента чата CAMEL-AI

Инициализируйте агента чата CAMEL-AI с моделями OpenAI для многоэтапных рассуждений и ответов, учитывающих контекст

6. Создание и настройка бота Discord

Зарегистрируйте нового бота в панели разработчиков Discord, пригласите его на сервер и предоставьте разрешения

7. Построение бота Discord

Интегрируйте Discord.py с CAMEL-AI и Vector DB для получения контекста и генерации умных ответов

8. Тестирование бота

Запустите бота на живом сервере Discord и убедитесь, что он предоставляет релевантные, насыщенные контекстом ответы

Диаграмма архитектуры#

Ниже представлена диаграмма архитектуры, отражающая рабочий процесс и взаимодействие компонентов чат-бота:

Диаграмма архитектуры

Рабочий процесс начинается с того, что контент из URL-адресов скачивается, разбивается на куски и вставляется с помощью метода vector_retriever.process(), который создает вложения с помощью экземпляра встраиваний OpenAI. Эти вложения вместе с их метаданными затем индексируются и хранятся в Vector DB посредством класса QdrantStorage.

Когда пользователь отправляет запрос через бота Discord, он обрабатывается vector_retriever.query() следующим образом: сначала запрос встраивается с помощью вложений OpenAI, а затем наиболее соответствующие совпадения извлекаются из Vector DB через QdrantStorage. Полученный контекст (например, соответствующие фрагменты документации) передается агенту Vector DB под управлением CAMEL-AI, работающему на базе модели OpenAI, который формирует окончательный ответ, учитывающий контекст.

Агент Vector DB обрабатывает полученные векторы с помощью языковой модели GPT_4O_MINI, создавая ответ, соответствующий запросу пользователя. Этот ответ отправляется обратно пользователю через бота Discord, завершая цикл обработки запроса.

Шаг 1: настройка среды#

Прежде чем приступить к реализации, рассмотрите высокоуровневый обзор стека технологий, который будет использоваться:

Компонент

Назначение

Vector DB

Векторная база данных для хранения и поиска вложений документов

OpenAI

Модели встраивания и языка для создания векторных представлений и ответов чат-бота

CAMEL-AI

Фреймворк для управления потоком диалога, поиском и взаимодействиями агентов искусственного интеллекта

API Discord

Платформа для развертывания и взаимодействия с чат-ботом

Установка зависимостей#

Установите CAMEL-AI, которая включает все необходимые зависимости:

pip install camel-ai[all]==0.2.17

Шаг 2: настройка экземпляра встраивания OpenAI#

  1. Создание аккаунта OpenAI: перейдите на сайт OpenAI и зарегистрируйтесь, если еще нет аккаунта.

  2. Генерация ключа API:

    • После входа нажмите на иконку профиля в правом верхнем углу и выберите пункт Ключи API.

    • Нажмите кнопку Создать новый секретный ключ.

    • Скопируйте полученный ключ API и сохраните его безопасно.

  3. Настройка клиента 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")
      )
      

Для настройки экземпляра встраивания используется текстовое вложение большой размерности версии 3 :

from camel.embeddings import OpenAIEmbedding
from camel.types import EmbeddingModelType

embedding_instance = OpenAIEmbedding(model_type=EmbeddingModelType.TEXT_EMBEDDING_3_LARGE)

Шаг 3: настройка клиента Vector DB#

В рамках данного руководства будет использоваться бесплатный тарифный план облака Vector DB Cloud. Вот как это сделать:

  1. Регистрация аккаунта: зарегистрируйтесь в облачной платформе Vector DB по адресу Qdrant Cloud.

  2. Создание кластера:

    • Перейдите в раздел Обзор.

    • Следуйте инструкциям по созданию первого кластера в разделе Создать первый кластер, чтобы создать кластер.

    • При создании кластера отобразится ключ API. Скопируйте и надежно храните его, так как он потребуется позже.

  3. Ожидание подготовки кластера:

    • Новый кластер появится в разделе Кластеры.

Получив данные об аккаунте в облаке Vector DB, добавьте их в файл .env:

QDRANT_CLOUD_URL=<your-qdrant-cloud-url>
QDRANT_CLOUD_API_KEY=<your-api-key>

Настройка хранилища Vector DB#

QdrantStorage будет отвечать за подключение к клиенту Vector DB и выполнение всех необходимых операций над коллекцией.

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, разделить его на фрагменты и сохранить вложения в указанной коллекции Vector DB.

from camel.retrievers import VectorRetriever

vector_retriever = VectorRetriever(embedding_model=embedding_instance,
                                   storage=storage_instance)

qdrant_urls = [
    "https://qdrant.tech/documentation/overview",
    "https://qdrant.tech/documentation/guides/installation",
    "https://qdrant.tech/documentation/concepts/filtering",
    "https://qdrant.tech/documentation/concepts/indexing",
    "https://qdrant.tech/documentation/guides/distributed_deployment",
    "https://qdrant.tech/documentation/guides/quantization"
    # Add more URLs as needed
]

for qdrant_url in qdrant_urls:
  vector_retriever.process(
      content=qdrant_url,
  )

Шаг 5: настройка агента чата CAMEL-AI#

Определите модель OpenAI и создайте экземпляр агента чата CAMEL-AI.

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#

Бот Discord является интерфейсом, через который пользователи смогут взаимодействовать с построенной системой агентного RAG.

Создание нового бота Discord#

  1. Перейдите в панель разработчиков Discord и войдите в систему с помощью учетной записи Discord.

  2. Нажмите кнопку Новая заявка.

  3. Дайте приложению имя и нажмите Создать.

  4. Перейдите во вкладку Бот слева и нажмите Добавить бота.

  5. После создания бота перейдите в раздел Токен и нажмите Сгенерировать токен заново, чтобы получить новый токен бота. Скопируйте этот токен и сохраните его безопасным способом, поскольку он понадобится позднее.

Приглашение бота на сервер#

  1. Перейдите во вкладку OAuth2 и далее в раздел Генератор URL.

  2. Под заголовком Области действия выберите опцию бот.

  3. Под заголовком Разрешения бота отметьте следующие разрешения:

    • Отправлять сообщения.

    • Читать историю сообщений.

  4. Скопируйте полученную ссылку и вставьте ее в браузер.

  5. Выберите сервер, куда хотите пригласить бота, и нажмите Авторизовать.

Предоставление разрешений боту#

  1. Вернитесь во вкладку Бот.

  2. Активируйте следующие параметры в разделе Привилегированные намерения шлюза:

    • Намерение членов сервера

    • Намерение содержимого сообщений

Теперь бот готов интегрироваться с кодом.

Шаг 7: Построение бота Discord#

Добавьте в файл .env следующее содержимое:

DISCORD_BOT_TOKEN=<your-discord-bot-token>

Используйте discord.py для создания простого бота Discord, который взаимодействует с пользователями и получает контекст из Vector DB перед тем, как ответить.

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()

Шаг 8: Тестирование бота#

  1. Пригласите бота на сервер Discord, используя URL OAuth2 из панели разработчиков Discord.

  2. Запустите блокнот.

  3. Начните общение с ботом на сервере Discord. Он будет получать контекст из Vector DB и предоставлять релевантные ответы на основе запросов.

agentic-rag-discord-bot-что-такое-квантование

Заключение#

В результате был создан чат-бо создан чат-бот для Discord с поддержкой агентного подхода RAG, способного извлекать актуальную информацию с помощью Vector DB, генерировать разумные ответы с помощью OpenAI и обрабатывать многоступенчатые рассуждения с помощью CAMEL-AI.

Подведем итоги:

  • Умное получение знаний: Чат-бот теперь может извлекать соответствующую информацию из больших наборов данных с помощью векторного поиска Vector DB.

  • Автономное рассуждение с помощью CAMEL-AI: Позволяет проводить многоэтапные рассуждения вместо простого повторения текста.

  • Живое развертывание на Discord: Запустите чат-бота на платформе Discord, сделав его интерактивным и готовым помогать настоящим пользователям.

Одним из главных преимуществ CAMEL-AI является предоставляемая им абстракция, позволяющая сосредоточиться на проектировании интеллектуальных взаимодействий, а не беспокоиться о деталях низкоуровневой реализации.