Агентная система RAG с использованием CrewAI и векторной базы данных Vector DB#
Объединив мощь Platform V Vector DB (далее - Vector DB) для поиска по векторам и возможности CrewAI для координации модульных агентов, можно создавать системы, которые не просто отвечают на вопросы, но анализируют, интерпретируют и действуют.
Традиционные системы RAG сосредоточены на извлечении данных и генерации ответов, однако они лишены способности глубоко рассуждать или обрабатывать многошаговые процессы.
В этом руководстве продемонстрирован процесс создания агентной системы RAG. В конце будет рабочая структура для хранения данных в базе данных векторов Vector DB и извлечения инсайтов с помощью агентов CrewAI совместно с поиском по векторам данных.
Данное приложение уже создано. Склонируйте репозиторий и следуйте инструкциям руководства.
Цели и задачи#
В этом практическом руководстве описан процесс создания системы, которая:
Использует Vector DB для хранения и получения транскрипций встреч в виде векторных вложений
Использует агентов CrewAI для анализа и обобщения данных о встречах
Представляет инсайты в простом интерфейсе Streamlit для удобного взаимодействия
Этот проект демонстрирует, как создать рабочий процесс агентной обработки, основанный на поиске по векторам, чтобы извлекать инсайты из записей встреч. Объединяя возможности поиска по векторам от Vector DB с агентами CrewAI, пользователи могут искать и анализировать содержание встреч.
Приложение сначала преобразует транскрипт встречи в векторные вложения и сохраняет их в векторную базу данных Vector DB. Затем оно использует агентов CrewAI для запроса к векторной базе данных и извлечения инсайтов из содержания встречи. Оно использует Anthropic Claude для генерации естественных языковых ответов на запросы пользователей на основе извлеченных инсайтов из векторной базы данных.
Основные принципы работы#
Сначала пользователь отправляет запрос системе. В данном примере продемонстрировано как узнать среднюю продолжительность маркетинговых встреч. Поскольку одним из показателей данных о встречах является длительность встречи, агент может вычислить среднюю продолжительность встреч путем усреднения длительности всех встреч с ключевым словом «Маркетинг» в теме или содержании.

Далее агент использовал инструмент search_meetings для поиска в векторной базе данных Vector DB наиболее семантически похожих точек встречи. Был задан вопрос о маркетинговых встречах, поэтому агент искал в базе данных с инструментом поиска встреч все встречи с ключевым словом «Маркетинг» в теме или содержании.

Затем агент использовал инструмент calculator для нахождения средней продолжительности встреч.

Агент использовал инструмент Information Synthesizer для синтеза анализа и представления его в формате естественного языка.

Пользователь видит окончательный результат в интерфейсе чата.

После этого пользователь может продолжить взаимодействие с системой, задавая дополнительные вопросы.
Архитектура#
Система построена на трех основных компонентах:
Векторная база данных Vector DB: хранит транскрипты и резюме встреч в виде векторных вложений, обеспечивая возможность семантического поиска.
Фреймворк CrewAI: координирует агентов искусственного интеллекта, отвечающих за различные аспекты анализа встреч.
Anthropic Claude: обеспечивает понимание естественного языка и генерацию ответов.
Пайплайн обработки данных
Обрабатывает транскрипты встреч и метаданные.
Создает вложения с помощью SentenceTransformer.
Управляет коллекцией Vector DB и загрузкой данных.
Система агентов ИИ
Реализует логику агента CrewAI.
Обрабатывает интеграцию поиска по векторам.
Обрабатывает запросы с помощью Claude.
Пользовательский интерфейс
Предоставляет веб-интерфейс в стиле чата.
Показывает обратную связь в реальном времени во время обработки.
Поддерживает историю разговора.
Начало работы#
Получение учетных данных API для Vector DB:
Зарегистрируйтесь на сайте Vector DB Cloud.
Создайте новый кластер и скопируйте URL-адрес кластера (формат: https://xxx.gcp.cloud.qdrant.io).
Перейдите в раздел Контроль доступа к данным и создайте ключ API.
Получение учетных данных API для сервисов искусственного интеллекта:
Настройка#
Склонируйте репозиторий:
git clone https://github.com/qdrant/examples.git cd agentic_rag_zoom_crewaiСоздайте и активируйте виртуальное окружение Python с версией Python 3.10 для совместимости:
python3.10 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activateУстановите зависимости:
pip install -r requirements.txtНастройте переменные окружения: создайте файл
.env.localсо следующим содержимым:openai_api_key=your_openai_key_here anthropic_api_key=your_anthropic_key_here qdrant_url=your_qdrant_url_here qdrant_api_key=your_qdrant_api_key_here
Использование#
1. Обработка данных о встрече#
Скрипт data_loader.py обрабатывает данные о встречах и хранит их в Vector DB:
python vector/data_loader.py
После выполнения этого скрипта можно увидеть новую коллекцию в аккаунте Vector DB Cloud под названием zoom_recordings. Эта коллекция содержит векторные вложения транскриптов встреч. Точки в коллекции содержат исходные данные о встречах, включая тему, содержание и резюме.
2. Запуск интерфейса#
Скрипт streamlit_app.py находится в папке vector. Чтобы запустить его, выполните следующую команду:
streamlit run vector/streamlit_app.py
При запуске этого скрипта можно взаимодействовать с системой через интерфейс в стиле чата. Задавайте вопросы о содержании встреч, а система будет использовать агентов искусственного интеллекта для поиска самой актуальной информации и представит ее в естественном языковом формате.
Пайплайн обработки данных#
В центре системы лежит пайплайн обработки данных:
class MeetingData:
def _initialize(self):
self.data_dir = Path(__file__).parent.parent / 'data'
self.meetings = self._load_meetings()
self.qdrant_client = QdrantClient(
url=os.getenv('qdrant_url'),
api_key=os.getenv('qdrant_api_key')
)
self.embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
Шаблон Singleton в файле data_loader.py реализован посредством класса MeetingData, который использует методы Python new и init. Класс поддерживает приватную переменную instance для отслеживания существования экземпляра и флаг initialized для обеспечения однократного запуска кода инициализации. При создании нового экземпляра с помощью MeetingData(), метод new сначала проверяет наличие instance - если он отсутствует, создается экземпляр и устанавливается флаг инициализации в значение False. Метод init затем проверяет этот флаг, и если он равен False, выполняется код инициализации и флаг устанавливается в значение True. Это гарантирует, что все последующие вызовы MeetingData() возвращают один и тот же экземпляр с теми же инициализированными ресурсами.
При обработке встреч необходимо учитывать как содержимое, так и контекст. Каждая встреча преобразуется в богатое представление текста перед тем, как превратиться в вектор:
text_to_embed = f"""
Topic: {meeting.get('topic', '')}
Content: {meeting.get('vtt_content', '')}
Summary: {json.dumps(meeting.get('summary', {}))}
"""
Эта структурированная форма обеспечивает полное сохранение контекста каждой встречи векторными вложениями. Однако обработка встреч по одной была бы неэффективна. Вместо этого будут пакетно обрабатываться данные:
batch_size = 100
for i in range(0, len(points), batch_size):
batch = points[i:i + batch_size]
self.qdrant_client.upsert(
collection_name='zoom_recordings',
points=batch
)
Создание системы агентов искусственного интеллекта#
Система искусственного интеллекта основана на подходе, основанном на инструментах. Начните с самого простого инструмента — калькулятор статистики встреч:
class CalculatorTool(BaseTool):
name: str = "calculator"
description: str = "Perform basic mathematical calculations"
def _run(self, a: int, b: int) -> dict:
return {
"addition": a + b,
"multiplication": a * b
}
Но настоящая сила заключается в интеграции поиска по векторам. Этот инструмент преобразует запросы на естественном языке в векторные представления и ищет базу данных встреч:
class SearchMeetingsTool(BaseTool):
def _run(self, query: str) -> List[Dict]:
response = openai_client.embeddings.create(
model="text-embedding-ada-002",
input=query
)
query_vector = response.data[0].embedding
return self.qdrant_client.search(
collection_name='zoom_recordings',
query_vector=query_vector,
limit=10
)
Результаты поиска затем поступают в аналитический инструмент, который использует Claude для предоставления более глубоких инсайтов:
class MeetingAnalysisTool(BaseTool):
def _run(self, meeting_data: dict) -> Dict:
meetings_text = self._format_meetings(meeting_data)
message = client.messages.create(
model="claude-3-sonnet-20240229",
messages=[{
"role": "user",
"content": f"Analyze these meetings:\n\n{meetings_text}"
}]
)
Организация рабочего процесса#
Уникальная особенность проявляется, когда происходит объединение инструментов в рамках агентской инфраструктуры. Создайте двух специализированных агентов:
researcher = Agent(
role='Research Assistant',
goal='Find and analyze relevant information',
tools=[calculator, searcher, analyzer]
)
synthesizer = Agent(
role='Information Synthesizer',
goal='Create comprehensive and clear responses'
)
Эти агенты работают вместе в скоординированном рабочем процессе. Исследователь собирает и анализирует информацию, тогда как синтезатор создает четкие, действенные ответы. Такое разделение обязанностей позволяет каждому агенту сосредоточиться на сильных сторонах.
Создание пользовательского интерфейса#
Интерфейс Streamlit предоставляет чистый, удобный опыт общения с системой искусственного интеллекта. Начните с базовой настройки:
st.set_page_config(
page_title="Meeting Assistant",
page_icon="🤖",
layout="wide"
)
Чтобы сделать интерфейс более увлекательным, добавьте индивидуальную стилизацию, облегчающую чтение вывода:
st.markdown("""
<style>
.stApp {
max-width: 1200px;
margin: 0 auto;
}
.output-container {
background-color: #f0f2f6;
padding: 20px;
border-radius: 10px;
margin: 10px 0;
}
</style>
""", unsafe_allow_html=True)
Одной из ключевых особенностей является обратная связь в режиме реального времени во время обработки. Связь достигается с помощью настраиваемого обработчика вывода:
class ConsoleOutput:
def __init__(self, placeholder):
self.placeholder = placeholder
self.buffer = []
self.update_interval = 0.5 # seconds
self.last_update = time.time()
def write(self, text):
self.buffer.append(text)
if time.time() - self.last_update > self.update_interval:
self._update_display()
Этот обработчик буферизует вывод и периодически обновляет отображение, создавая плавный пользовательский опыт. Когда пользователь отправляет запрос, он обрабатывается с визуальной обратной связью:
with st.chat_message("assistant"):
message_placeholder = st.empty()
progress_bar = st.progress(0)
console_placeholder = st.empty()
try:
console_output = ConsoleOutput(console_placeholder)
with contextlib.redirect_stdout(console_output):
progress_bar.progress(0.3)
full_response = get_crew_response(prompt)
progress_bar.progress(1.0)
Интерфейс поддерживает историю чатов, делая общение естественным:
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
Кроме того включены полезные примеры и настройки в боковую панель:
with st.sidebar:
st.header("Settings")
search_limit = st.slider("Number of results", 1, 10, 5)
analysis_depth = st.select_slider(
"Analysis Depth",
options=["Basic", "Standard", "Detailed"],
value="Standard"
)
Это сочетание функций создает одновременно мощный и доступный интерфейс. Пользователи могут наблюдать обработку запроса в реальном времени, адаптировать настройки под текущие потребности и поддерживать контекст через историю чатов.
Заключение#
В этом руководстве было показано, как построить сложную систему анализа встреч, сочетающую поиск по векторам с агентами искусственного интеллекта. Основные компоненты, которые были рассмотрены:
Интеграция поиска по векторам:
Эффективное хранение и получение контента встреч с использованием Vector DB.
Возможности семантического поиска благодаря векторным вложениям.
Пакетная обработка для оптимальной производительности.
Инфраструктура агентов искусственного интеллекта:
Инструментальный подход для функциональности модулей.
Специализированные агенты для исследований и анализа.
Интеграция с Claude для интеллектуальных инсайтов.
Интерактивный интерфейс:
Отслеживание прогресса и обратная связь в реальном времени.
Постоянная история чатов.
Настройки конфигурируемого поиска и анализа.
Результатом станет система, демонстрирующая силу объединения поиска по векторам с агентами искусственного интеллекта для создания умного помощника по встречам. Следуя этому руководству сформированы навыки позволяющие:
Эффективно обрабатывать и хранить данные о встречах.
Реализовать возможности семантического поиска.
Создавать специализированные агентов искусственного интеллекта для анализа.
Разработать интуитивно понятный пользовательский интерфейс.
Эту основу можно расширить различными способами, такими как:
Добавление дополнительных специализированных агентов.
Реализация дополнительных инструментов анализа.
Улучшение пользовательского интерфейса.
Интеграция с другими источниками данных.
Код доступен в репозитории.