AGI и будущее ИИ

Создание агентов LLM для RAG с нуля и далее: всесторонний гид

mm
Добавьте Unite.AI в избранные источники в Google

Модели LLM, такие как GPT-3, GPT-4 и их открытые аналоги, часто испытывают трудности с получением актуальной информации и иногда генерируют неверную информацию.

Retrieval-Augmented Generation (RAG) – это техника, которая сочетает возможности моделей LLM с внешней информацией. RAG позволяет нам основывать ответы моделей LLM на фактической, актуальной информации, что значительно улучшает точность и надежность сгенерированного контента.

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

Прежде чем мы начнем создавать наш агент LLM, давайте поймем, что такое RAG и почему он важен.

RAG, или Retrieval-Augmented Generation, – это гибридный подход, который сочетает информационный поиск с генерацией текста. В системе RAG:

  • Запрос используется для получения релевантных документов из базы знаний.
  • Эти документы затем передаются в языковую модель вместе с исходным запросом.
  • Модель генерирует ответ на основе запроса и полученной информации.
RAG

RAG

Этот подход имеет несколько преимуществ:

  • Улучшенная точность: Основывая ответы на полученной информации, RAG уменьшает количество неверной информации и улучшает фактическую точность.
  • Актуальная информация: База знаний может быть регулярно обновлена, что позволяет системе получать доступ к актуальной информации.
  • Прозрачность: Система может предоставлять источники информации, что увеличивает доверие и позволяет проверять факты.

Понимание агентов LLM

 

Когда вы сталкиваетесь с проблемой, на которую нет простого ответа, вам часто нужно выполнить несколько шагов, подумать тщательно и вспомнить, что вы уже пробовали. Агенты LLM предназначены именно для таких ситуаций в приложениях языковых моделей. Они сочетают тщательный анализ данных, стратегическое планирование, получение информации и способность учиться на прошлом опыте, чтобы решать сложные проблемы.

Что такое агенты LLM?

Агенты LLM – это продвинутые системы ИИ, предназначенные для создания сложного текста, который требует последовательного рассуждения. Они могут думать вперед, вспоминать прошлые разговоры и использовать различные инструменты, чтобы адаптировать свои ответы в зависимости от ситуации и стиля, необходимого для решения проблемы.

Рассмотрим вопрос в области права, такой как: “Каковы потенциальные юридические последствия нарушения определенного типа контракта в Калифорнии?” Базовая модель LLM с системой RAG может получить необходимую информацию из юридических баз данных.

Для более подробного сценария: “В свете новых законов о защите данных, какие общие юридические проблемы сталкиваются компании и как суды решали эти проблемы?” Этот вопрос глубже, чем просто поиск фактов. Он заключается в понимании новых правил, их влияния на различные компании и реакции судов. Агент LLM разобьет эту задачу на подзадачи, такие как получение последних законов, анализ исторических дел, суммирование юридических документов и прогнозирование тенденций на основе закономерностей.

Компоненты агентов LLM

Агенты LLM обычно состоят из четырех компонентов:

  1. Агент/Мозг: Языковая модель, которая обрабатывает и понимает язык.
  2. Планирование: Способность рассуждать, разбивать задачи на части и разрабатывать конкретные планы.
  3. Память: Сохраняет записи прошлых взаимодействий и учится на них.
  4. Использование инструментов: Интегрирует различные ресурсы для выполнения задач.

Агент/Мозг

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

Память

Компонент памяти помогает агентам LLM справляться с сложными задачами, сохраняя записи прошлых действий. Существует два основных типа памяти:

  • Краткосрочная память: Действует как блокнот, отслеживая текущие обсуждения.
  • Долгосрочная память: Функционирует как дневник, хранящий информацию из прошлых взаимодействий, чтобы учиться на закономерностях и принимать лучшие решения.

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

Планирование

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

  • Формулирование плана: Разбиение задачи на более мелкие подзадачи.
  • Отражение плана: Просмотр и оценка эффективности плана, включение обратной связи для усовершенствования стратегий.

Методы, такие как Chain of Thought (CoT) и Tree of Thought (ToT), помогают в этом процессе разбиения, позволяя агентам исследовать различные пути решения проблемы.

Чтобы глубже погрузиться в мир агентов ИИ, включая их текущие возможности и потенциал, рассмотрите возможность прочитать “Auto-GPT & GPT-Engineer: An In-Depth Guide to Today’s Leading AI Agents”

Настройка окружения

Чтобы создать наш агент RAG, нам нужно настроить окружение разработки. Мы будем использовать Python и несколько ключевых библиотек:

  • LangChain: Для оркестровки наших компонентов LLM и получения информации
  • Chroma: Как наш векторный магазин для вложений документов
  • Модели GPT от OpenAI: Как наш базовый LLM (вы можете заменить его на открытую модель, если предпочитаете)
  • FastAPI: Для создания простого API для взаимодействия с нашим агентом

Давайте начнем с настройки окружения:


<p># Создайте новую виртуальную среду
python -m venv rag_agent_env
source rag_agent_env/bin/activate # На Windows используйте `rag_agent_env\Scripts\activate`</p>

<p># Установите необходимые пакеты
pip install langchain chromadb openai fastapi uvicorn

Теперь создайте новый файл Python под названием rag_agent.py и импортируйте необходимые библиотеки:


<p>from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
import os</p>

<p># Установите ключ API OpenAI
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;ваш-api-ключ-здесь&quot;</p>

Создание простой системы RAG

Теперь, когда у нас настроено окружение, давайте создадим базовую систему RAG. Мы начнем с создания базы знаний из набора документов, а затем используем ее для ответов на запросы.

Шаг 1: Подготовка документов

Сначала нам нужно загрузить и подготовить наши документы. Для этого примера давайте предположим, что у нас есть текстовый файл под названием knowledge_base.txt с некоторой информацией об ИИ и машинном обучении.


<p># Загрузите документ
loader = TextLoader(&quot;knowledge_base.txt&quot;)
documents = loader.load()</p>

<p># Разделите документы на части
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># Создайте вложения
embeddings = OpenAIEmbeddings()</p>

<p># Создайте векторный магазин
vectorstore = Chroma.from_documents(texts, embeddings)</p>

Шаг 2: Создание цепочки получения информации

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


<p># Создайте цепочку получения информации
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type=&quot;stuff&quot;, retriever=vectorstore.as_retriever())</p>

Шаг 3: Запрос системы

Мы можем теперь запросить нашу систему RAG:


<p>query = &quot;Каковы основные применения машинного обучения?&quot;
result = qa.run(query)
print(result)

Шаг 4: Создание агента LLM

Хотя наша простая система RAG полезна, она довольно ограничена. Давайте улучшим ее, создав агент LLM, который может выполнять более сложные задачи и рассуждать об информации, которую он получает.

Агент LLM – это система ИИ, которая может использовать инструменты и принимать решения о том, какие действия выполнить. Мы создадим агента, который не только может отвечать на вопросы, но и выполнять поисковые запросы и базовые вычисления.

Сначала давайте определим некоторые инструменты для нашего агента:


<p>from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import BaseTool
from langchain.agents import initialize_agent
from langchain.agents import AgentType</p>

<p># Определите инструмент калькулятора
class CalculatorTool(BaseTool):
name = &quot;Калькулятор&quot;
description = &quot;Полезен для ответов на вопросы о математике&quot;</p>

<p>def _run(self, query: str)
try:
return str(eval(query))
except:
return &quot;Я не смог рассчитать это. Пожалуйста, убедитесь, что ваш ввод является допустимым математическим выражением.&quot;</p>

<p># Создайте экземпляры инструментов
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()</p>

<p># Определите инструменты
tools = [Tool(name=&quot;Поиск&quot;, func=search.run, description=&quot;Полезен для ответов на вопросы о текущих событиях&quot;),
Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;Полезен для ответов на вопросы об ИИ и машинном обучении&quot;),
Tool(name=&quot;Калькулятор&quot;, func=calculator._run, description=&quot;Полезен для выполнения математических расчетов&quot;)
]</p>

<p># Инициализируйте агента
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

Теперь у нас есть агент, который может использовать нашу систему RAG, выполнять поисковые запросы и выполнять вычисления. Давайте протестируем его:


<p>result = agent.run(&quot;В чем разница между обучением с учителем и без учителя? И какой 15% от 80?&quot;)
print(result)</p>

Этот агент демонстрирует ключевое преимущество агентов LLM: они могут объединять несколько инструментов и шагов рассуждения, чтобы ответить на сложные запросы.

Улучшение агента с помощью продвинутых техник RAG

Хотя наша текущая система RAG работает хорошо, есть несколько продвинутых техник, которые мы можем использовать, чтобы улучшить ее производительность:

a) Семантический поиск с помощью Dense Passage Retrieval (DPR)

Вместо использования простого поиска на основе вложений мы можем реализовать DPR для более точного семантического поиска:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>question_encoder = DPRQuestionEncoder.from_pretrained(&quot;facebook/dpr-question_encoder-single-nq-base&quot;)
context_encoder = DPRContextEncoder.from_pretrained(&quot;facebook/dpr-ctx_encoder-single-nq-base&quot;)</p>

<p># Функция для кодирования проходов
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

<p># Функция для кодирования запроса
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

b) Расширение запроса

Мы можем использовать расширение запроса, чтобы улучшить производительность поиска:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>model = T5ForConditionalGeneration.from_pretrained(&quot;t5-small&quot;)
tokenizer = T5Tokenizer.from_pretrained(&quot;t5-small&quot;)</p>

<p>def expand_query(query):
input_text = f&quot;expand query: {query}&quot;
input_ids = tokenizer.encode(input_text, return_tensors=&quot;pt&quot;)
outputs = model.generate(input_ids, max_length=50, num_return_sequences=3)
expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
return expanded_queries</p>

c) Итеративное уточнение

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


<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f&quot;Основываясь на этом результате: &#039;{result}&#039;, какой дополнительный вопрос мне следует задать, чтобы получить более конкретную информацию?&quot;)
if clarification.lower().strip() == &quot;none&quot;:
break
query = clarification
return result</p>

# Используйте это в процессе вашего агента

Реализация многоагентной системы

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


<p>class SpecialistAgent:
def __init__(self, name, tools):
self.name = name
self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>

<p>def run(self, query):
return self.agent.run(query)</p>

<p># Создайте агентов-специалистов
research_agent = SpecialistAgent(&quot;Исследование&quot;, [Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;Для вопросов об ИИ и машинном обучении&quot;)])
math_agent = SpecialistAgent(&quot;Математика&quot;, [Tool(name=&quot;Калькулятор&quot;, func=calculator._run, description=&quot;Для расчетов&quot;)])
general_agent = SpecialistAgent(&quot;Общее&quot;, [Tool(name=&quot;Поиск&quot;, func=search.run, description=&quot;Для общих запросов&quot;)])</p>

<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>

<p>def run(self, query):
# Определите, какой агент использовать
if &quot;calculate&quot; in query.lower() or any(op in query for op in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;]):
return self.agents[&#039;Математика&#039;].run(query)
elif any(term in query.lower() for term in [&#039;ai&#039;, &#039;machine learning&#039;, &#039;deep learning&#039;]):
return self.agents[&#039;Исследование&#039;].run(query)
else:
return self.agents[&#039;Общее&#039;].run(query)</p>

<p>coordinator = Coordinator({&#039;Исследование&#039;: research_agent, &#039;Математика&#039;: math_agent, &#039;Общее&#039;: general_agent})</p>

<p># Протестируйте многоагентную систему
result = coordinator.run(&quot;В чем разница между CNN и RNN? И рассчитайте 25% от 120.&quot;)
print(result)</p>

Эта многоагентная система позволяет специализироваться и может справиться с более широким спектром запросов более эффективно.

Оценка и оптимизация агентов RAG

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

a) Оценка релевантности

Мы можем использовать метрики, такие как BLEU, ROUGE или BERTScore, чтобы оценить релевантность полученных документов:


from bert_score import score

<p>def evaluate_relevance(query, retrieved_doc, generated_answer):
P, R, F1 = score([generated_answer], [retrieved_doc], lang=&quot;en&quot;)
return F1.mean().item()</p>

b) Оценка качества ответа

Мы можем использовать оценку человека или автоматические метрики, чтобы оценить качество ответа:


<p>from nltk.translate.bleu_score import sentence_bleu</p>

<p>def evaluate_answer_quality(reference_answer, generated_answer):
return sentence_bleu([reference_answer.split()], generated_answer.split())</p>

<p># Используйте это, чтобы оценить ответы вашего агента

Будущие направления и проблемы

Когда мы смотрим в будущее агентов RAG, появляются несколько интересных направлений и проблем:

a) Мультимодальный RAG: Расширение RAG для включения изображений, аудио и видео данных.

b) Федеративный RAG: Реализация RAG на распределенных, сохраняющих конфиденциальность базах знаний.

c) Непрерывное обучение: Разработка методов для обновления баз знаний и моделей агентов RAG с течением времени.

d) Этические соображения: Решение проблем предвзятости, справедливости и прозрачности в системах RAG.

e) Масштабируемость: Оптимизация RAG для крупномасштабных, реальных приложений.

Заключение

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

Я провел последние пять лет, погружаясь в увлекательный мир машинного обучения и глубокого обучения. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах программной инженерии, с особым акцентом на ИИ/МО. Мое непрекращающееся любопытство также привело меня к обработке естественного языка, области, которую я с нетерпением жду возможности изучить дальше.