AGI и будущее ИИ
Создание агентов LLM для RAG с нуля и далее: всесторонний гид
Модели LLM, такие как GPT-3, GPT-4 и их открытые аналоги, часто испытывают трудности с получением актуальной информации и иногда генерируют неверную информацию.
Retrieval-Augmented Generation (RAG) – это техника, которая сочетает возможности моделей LLM с внешней информацией. RAG позволяет нам основывать ответы моделей LLM на фактической, актуальной информации, что значительно улучшает точность и надежность сгенерированного контента.
В этом блоге мы рассмотрим, как создать агенты LLM для RAG с нуля, глубоко погрузившись в архитектуру, детали реализации и продвинутые техники. Мы рассмотрим все, от основ RAG до создания сложных агентов, способных к сложному рассуждению и выполнению задач.
Прежде чем мы начнем создавать наш агент LLM, давайте поймем, что такое RAG и почему он важен.
RAG, или Retrieval-Augmented Generation, – это гибридный подход, который сочетает информационный поиск с генерацией текста. В системе RAG:
- Запрос используется для получения релевантных документов из базы знаний.
- Эти документы затем передаются в языковую модель вместе с исходным запросом.
- Модель генерирует ответ на основе запроса и полученной информации.
Этот подход имеет несколько преимуществ:
- Улучшенная точность: Основывая ответы на полученной информации, RAG уменьшает количество неверной информации и улучшает фактическую точность.
- Актуальная информация: База знаний может быть регулярно обновлена, что позволяет системе получать доступ к актуальной информации.
- Прозрачность: Система может предоставлять источники информации, что увеличивает доверие и позволяет проверять факты.
Понимание агентов LLM
Когда вы сталкиваетесь с проблемой, на которую нет простого ответа, вам часто нужно выполнить несколько шагов, подумать тщательно и вспомнить, что вы уже пробовали. Агенты LLM предназначены именно для таких ситуаций в приложениях языковых моделей. Они сочетают тщательный анализ данных, стратегическое планирование, получение информации и способность учиться на прошлом опыте, чтобы решать сложные проблемы.
Что такое агенты LLM?
Агенты LLM – это продвинутые системы ИИ, предназначенные для создания сложного текста, который требует последовательного рассуждения. Они могут думать вперед, вспоминать прошлые разговоры и использовать различные инструменты, чтобы адаптировать свои ответы в зависимости от ситуации и стиля, необходимого для решения проблемы.
Рассмотрим вопрос в области права, такой как: “Каковы потенциальные юридические последствия нарушения определенного типа контракта в Калифорнии?” Базовая модель LLM с системой RAG может получить необходимую информацию из юридических баз данных.
Для более подробного сценария: “В свете новых законов о защите данных, какие общие юридические проблемы сталкиваются компании и как суды решали эти проблемы?” Этот вопрос глубже, чем просто поиск фактов. Он заключается в понимании новых правил, их влияния на различные компании и реакции судов. Агент LLM разобьет эту задачу на подзадачи, такие как получение последних законов, анализ исторических дел, суммирование юридических документов и прогнозирование тенденций на основе закономерностей.
Компоненты агентов LLM
Агенты LLM обычно состоят из четырех компонентов:
- Агент/Мозг: Языковая модель, которая обрабатывает и понимает язык.
- Планирование: Способность рассуждать, разбивать задачи на части и разрабатывать конкретные планы.
- Память: Сохраняет записи прошлых взаимодействий и учится на них.
- Использование инструментов: Интегрирует различные ресурсы для выполнения задач.
Агент/Мозг
В основе агента 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["OPENAI_API_KEY"] = "ваш-api-ключ-здесь"</p>
Создание простой системы RAG
Теперь, когда у нас настроено окружение, давайте создадим базовую систему RAG. Мы начнем с создания базы знаний из набора документов, а затем используем ее для ответов на запросы.
Шаг 1: Подготовка документов
Сначала нам нужно загрузить и подготовить наши документы. Для этого примера давайте предположим, что у нас есть текстовый файл под названием knowledge_base.txt с некоторой информацией об ИИ и машинном обучении.
<p># Загрузите документ loader = TextLoader("knowledge_base.txt") 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="stuff", retriever=vectorstore.as_retriever())</p>
Шаг 3: Запрос системы
Мы можем теперь запросить нашу систему RAG:
<p>query = "Каковы основные применения машинного обучения?" 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 = "Калькулятор" description = "Полезен для ответов на вопросы о математике"</p> <p>def _run(self, query: str) try: return str(eval(query)) except: return "Я не смог рассчитать это. Пожалуйста, убедитесь, что ваш ввод является допустимым математическим выражением."</p> <p># Создайте экземпляры инструментов search = DuckDuckGoSearchRun() calculator = CalculatorTool()</p> <p># Определите инструменты tools = [Tool(name="Поиск", func=search.run, description="Полезен для ответов на вопросы о текущих событиях"), Tool(name="RAG-QA", func=qa.run, description="Полезен для ответов на вопросы об ИИ и машинном обучении"), Tool(name="Калькулятор", func=calculator._run, description="Полезен для выполнения математических расчетов") ]</p> <p># Инициализируйте агента agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )</p>
Теперь у нас есть агент, который может использовать нашу систему RAG, выполнять поисковые запросы и выполнять вычисления. Давайте протестируем его:
<p>result = agent.run("В чем разница между обучением с учителем и без учителя? И какой 15% от 80?") 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("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p> <p># Функция для кодирования проходов def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output</p> <p># Функция для кодирования запроса def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output</p>
b) Расширение запроса
Мы можем использовать расширение запроса, чтобы улучшить производительность поиска:
<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>
<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>
<p>def expand_query(query):
input_text = f"expand query: {query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
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"Основываясь на этом результате: '{result}', какой дополнительный вопрос мне следует задать, чтобы получить более конкретную информацию?")
if clarification.lower().strip() == "none":
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("Исследование", [Tool(name="RAG-QA", func=qa.run, description="Для вопросов об ИИ и машинном обучении")])
math_agent = SpecialistAgent("Математика", [Tool(name="Калькулятор", func=calculator._run, description="Для расчетов")])
general_agent = SpecialistAgent("Общее", [Tool(name="Поиск", func=search.run, description="Для общих запросов")])</p>
<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>
<p>def run(self, query):
# Определите, какой агент использовать
if "calculate" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['Математика'].run(query)
elif any(term in query.lower() for term in ['ai', 'machine learning', 'deep learning']):
return self.agents['Исследование'].run(query)
else:
return self.agents['Общее'].run(query)</p>
<p>coordinator = Coordinator({'Исследование': research_agent, 'Математика': math_agent, 'Общее': general_agent})</p>
<p># Протестируйте многоагентную систему
result = coordinator.run("В чем разница между CNN и RNN? И рассчитайте 25% от 120.")
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="en") 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, улучшили его с помощью продвинутых техник, исследовали многоагентные системы и обсудили стратегии оценки и оптимизации.














