Искусственный общий интеллект
Создание агентов LLM для RAG с нуля и за его пределами: подробное руководство
LLM, такие как GPT-3, GPT-4 и их аналоги с открытым исходным кодом, часто не справляются с поиском актуальной информации и иногда могут генерировать галлюцинации или неверную информацию.
Поисково-дополненная генерация (RAG) это метод, который сочетает в себе возможности LLM с внешним поиском знаний. RAG позволяет нам основывать ответы LLM на фактической и актуальной информации, что значительно повышает точность и надежность контента, генерируемого ИИ.
В этой статье мы рассмотрим, как создавать агентов LLM для RAG с нуля, подробно изучая архитектуру, детали реализации и продвинутые методы. Мы рассмотрим всё: от основ RAG до создания сложных агентов, способных к сложным рассуждениям и выполнению задач.
Прежде чем приступить к созданию агента LLM, давайте разберемся, что такое RAG и почему это важно.
RAG, или генерация с расширенным поиском, представляет собой гибридный подход, сочетающий поиск информации с генерацией текста. В системе RAG:
- Запрос используется для извлечения соответствующих документов из базы знаний.
- Эти документы затем передаются в языковую модель вместе с исходным запросом.
- Модель генерирует ответ на основе запроса и полученной информации.
Этот подход имеет ряд преимуществ:
- Повышенная точность: Обосновав ответы на полученной информации, RAG уменьшает галлюцинации и повышает точность фактов.
- Последняя информация: База знаний может регулярно обновляться, что позволяет системе получать доступ к актуальной информации.
- Прозрачность: Система может предоставлять источники своей информации, повышая доверие и позволяя проверять факты.
Понимание агентов LLM
Когда вы сталкиваетесь с проблемой, на которую нет простого ответа, вам часто нужно выполнить несколько шагов, тщательно подумать и вспомнить, что вы уже пробовали. Агенты LLM предназначены именно для таких ситуаций в приложениях языковых моделей. Они сочетают в себе тщательный анализ данных, стратегическое планирование, извлечение данных и способность учиться на прошлых действиях для решения сложных проблем.
Что такое агенты LLM?
Агенты LLM — это передовые системы искусственного интеллекта, предназначенные для создания сложного текста, требующего последовательного рассуждения. Они могут думать наперед, запоминать прошлые разговоры и использовать различные инструменты, чтобы корректировать свои ответы в зависимости от ситуации и необходимого стиля.
Рассмотрим вопрос из юридической области, например: «Каковы потенциальные юридические последствия конкретного типа нарушения контракта в Калифорнии?» Базовый LLM с системой расширенного поиска (RAG) может получать необходимую информацию из юридических баз данных.
Более подробный сценарий: «В свете новых законов о конфиденциальности данных, с какими юридическими проблемами чаще всего сталкиваются компании, и как суды решают эти проблемы?» Этот вопрос требует более глубокого анализа, чем просто поиск фактов. Речь идёт о понимании новых правил, их влияния на различные компании и реакции судов. Агент LLM разбил бы эту задачу на подзадачи, такие как поиск последних законодательных актов, анализ исторических случаев, обобщение юридических документов и прогнозирование тенденций на основе закономерностей.
Компоненты агентов LLM
Агенты LLM обычно состоят из четырех компонентов:
- Агент/Мозг: основная языковая модель, которая обрабатывает и понимает язык.
- Планирование: Способность рассуждать, разбивать задачи и разрабатывать конкретные планы.
- Память: ведет записи прошлых взаимодействий и извлекает из них уроки.
- Использование инструмента: объединяет различные ресурсы для выполнения задач.
Агент/Мозг
В основе агента LLM лежит языковая модель, которая обрабатывает и понимает язык на основе огромных объемов данных, на которых он обучался. Вы начинаете с того, что даете ему конкретную подсказку, указывая агенту, как реагировать, какие инструменты использовать и к каким целям стремиться. Вы можете настроить агента так, чтобы он подходил для конкретных задач или взаимодействий, повышая его производительность.
Память
Компонент памяти помогает агентам LLM выполнять сложные задачи, сохраняя записи прошлых действий. Существует два основных типа памяти:
- Краткосрочная память: действует как блокнот, отслеживая текущие обсуждения.
- Долгосрочная память: действует как дневник, сохраняя информацию о прошлых взаимодействиях для изучения закономерностей и принятия более эффективных решений.
Объединив эти типы памяти, агент может предлагать более индивидуальные ответы и со временем запоминать предпочтения пользователя, создавая более связанное и актуальное взаимодействие.
Планирование
Планирование позволяет агентам LLM рассуждать, разлагать задачи на управляемые части и адаптировать планы по мере развития задач. Планирование включает в себя два основных этапа:
- Формулирование плана: Разбиение задачи на более мелкие подзадачи.
- Обдумывание плана: Анализ и оценка эффективности плана, учет отзывов для уточнения стратегии.
Такие методы, как «Цепочка мыслей» (CoT) и «Древо мысли» (ToT), помогают в этом процессе декомпозиции, позволяя агентам исследовать различные пути решения проблемы.
Чтобы глубже погрузиться в мир агентов ИИ, включая их текущие возможности и потенциал, прочитайте «Auto-GPT и GPT-Engineer: подробное руководство по ведущим сегодня агентам искусственного интеллекта»
Настройка среды
Для создания нашего RAG-агента нам потребуется настроить среду разработки. Мы будем использовать Python и несколько ключевых библиотек:
- Лангчейн: Для организации наших компонентов LLM и поиска.
- цветность: В качестве векторного хранилища для встраивания документов.
- Модели GPT OpenAI: В качестве нашей базовой LLM (при желании вы можете заменить ее моделью с открытым исходным кодом)
- FastAPI: За создание простого API для взаимодействия с нашим агентом.
Начнем с настройки нашей среды:
# Create a new virtual environment python -m venv rag_agent_env source rag_agent_env/bin/activate # On Windows, use `rag_agent_env\Scripts\activate` # Install required packages pip install langchain chromadb openai fastapi uvicorn
Теперь давайте создадим новый файл Python с именем rag_agent.py и импортируем необходимые библиотеки:
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 # Set your OpenAI API key os.environ["OPENAI_API_KEY"] = "your-api-key-here"
Создание простой системы RAG
Теперь, когда у нас настроена среда, давайте создадим простую систему RAG. Начнём с создания базы знаний на основе набора документов, а затем будем использовать её для ответов на запросы.
Шаг 1: Подготовьте документы
Сначала нам нужно загрузить и подготовить документы. В этом примере предположим, что у нас есть текстовый файл knowledge_base.txt с информацией об искусственном интеллекте и машинном обучении.
# Load the document
loader = TextLoader("knowledge_base.txt")
documents = loader.load()
# Split the documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# Create embeddings
embeddings = OpenAIEmbeddings()
# Create a vector store
vectorstore = Chroma.from_documents(texts, embeddings)
Шаг 2. Создайте цепочку контроля качества на основе поиска
Теперь, когда у нас есть векторное хранилище, мы можем создать цепочку контроля качества на основе поиска:
# Create a retrieval-based QA chain qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())
Шаг 3. Запросите систему
Теперь мы можем запросить нашу систему RAG:
query = "What are the main applications of machine learning?" result = qa.run(query) print(result)
Шаг 4. Создание агента LLM
Хотя наша простая система RAG полезна, она весьма ограничена. Давайте улучшим её, создав агента LLM, способного выполнять более сложные задачи и анализировать получаемую информацию.
Агент LLM — это система искусственного интеллекта, которая может использовать инструменты и принимать решения о том, какие действия предпринять. Мы создадим агента, который сможет не только отвечать на вопросы, но и выполнять веб-поиск и базовые вычисления.
Для начала давайте определим некоторые инструменты для нашего агента:
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
# Define a calculator tool
class CalculatorTool(BaseTool):
name = "Calculator"
description = "Useful for when you need to answer questions about math"
def _run(self, query: str)
try:
return str(eval(query))
except:
return "I couldn't calculate that. Please make sure your input is a valid mathematical expression."
# Create tool instances
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()
# Define the tools
tools = [Tool(name="Search",func=search.run,description="Useful for when you need to answer questions about current events"),
Tool(name="RAG-QA",func=qa.run,description="Useful for when you need to answer questions about AI and machine learning"),
Tool(name="Calculator",func=calculator._run,description="Useful for when you need to perform mathematical calculations")
]
# Initialize the agent
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
Теперь у нас есть агент, который может использовать нашу систему RAG, выполнять поиск в интернете и выполнять вычисления. Давайте протестируем его:
result = agent.run("What's the difference between supervised and unsupervised learning? Also, what's 15% of 80?")
print(result)
Этот агент демонстрирует ключевое преимущество агентов LLM: они могут комбинировать несколько инструментов и логических шагов для ответа на сложные запросы.
Улучшение агента с помощью передовых методов RAG
Хотя наша текущая система RAG работает хорошо, существует несколько передовых методов, которые мы можем использовать для повышения ее производительности:
а) Семантический поиск с плотным поиском проходов (DPR)
Вместо использования простого поиска на основе внедрения мы можем реализовать DPR для более точного семантического поиска:
from transformers import DPRQuestionEncoder, DPRContextEncoder
question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
# Function to encode passages
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output
# Function to encode query
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors="pt").pooler_output
б) Расширение запроса
Мы можем использовать расширение запроса для повышения производительности поиска:
from transformers import T5ForConditionalGeneration, T5Tokenizer
model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")
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
в) Итеративное уточнение
Мы можем реализовать итеративный процесс уточнения, в котором агент может задавать дополнительные вопросы, чтобы уточнить или расширить первоначальный поиск:
def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f"Based on this result: '{result}', what follow-up question should I ask to get more specific information?")
if clarification.lower().strip() == "none":
break
query = clarification
return result
# Use this in your agent's process
Реализация многоагентной системы
Для решения более сложных задач мы можем реализовать многоагентную систему, в которой разные агенты специализируются на разных областях. Вот простой пример:
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)
def run(self, query):
return self.agent.run(query)
# Create specialist agents
research_agent = SpecialistAgent("Research", [Tool(name="RAG-QA", func=qa.run, description="For AI and ML questions")])
math_agent = SpecialistAgent("Math", [Tool(name="Calculator", func=calculator._run, description="For calculations")])
general_agent = SpecialistAgent("General", [Tool(name="Search", func=search.run, description="For general queries")])
class Coordinator:
def __init__(self, agents):
self.agents = agents
def run(self, query):
# Determine which agent to use
if "calculate" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['Math'].run(query)
elif any(term in query.lower() for term in ['ai', 'machine learning', 'deep learning']):
return self.agents['Research'].run(query)
else:
return self.agents['General'].run(query)
coordinator = Coordinator({'Research': research_agent, 'Math': math_agent, 'General': general_agent})
# Test the multi-agent system
result = coordinator.run("What's the difference between CNN and RNN? Also, calculate 25% of 120.")
print(result)
Эта многоагентная система позволяет специализироваться и может более эффективно обрабатывать более широкий спектр запросов.
Оценка и оптимизация агентов RAG
Чтобы обеспечить хорошую работу нашего агента RAG, нам необходимо реализовать метрики оценки и методы оптимизации:
а) Оценка релевантности
Мы можем использовать такие метрики, как BLEU, ROUGE или BERTScore, для оценки релевантности полученных документов:
from bert_score import score def evaluate_relevance(query, retrieved_doc, generated_answer): P, R, F1 = score([generated_answer], [retrieved_doc], lang="en") return F1.mean().item()
б) Оценка качества ответов
Мы можем использовать человеческую оценку или автоматизированные показатели для оценки качества ответов:
from nltk.translate.bleu_score import sentence_bleu def evaluate_answer_quality(reference_answer, generated_answer): return sentence_bleu([reference_answer.split()], generated_answer.split()) # Use this to evaluate your agent's responses
Будущие направления и вызовы
Когда мы смотрим в будущее агентов RAG, возникает несколько интересных направлений и задач:
a) Мультимодальная РАГ: Расширение RAG для включения изображений, аудио и видеоданных.
b) Федеративная РАГ: Внедрение RAG в распределенных, сохраняющих конфиденциальность базах знаний.
c) Непрерывное обучение: Разработка методов для агентов RAG по обновлению своих баз знаний и моделей с течением времени.
d) Этические соображения: Решение проблем предвзятости, справедливости и прозрачности в системах RAG.
e) Масштабируемость: Оптимизация RAG для крупномасштабных приложений реального времени.
Заключение
Создание агентов LLM для RAG с нуля — сложный, но увлекательный процесс. Мы рассмотрели основы RAG, реализовали простую систему, создали агента LLM, дополнили его передовыми методами, изучили многоагентные системы и обсудили стратегии оценки и оптимизации.














