Как агентивный RAG снижает галлюцинации и улучшает извлечение

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

24 февраля 2025 г.

party-gif

Раскройте силу Retrieval Augmented Generation (RAG) с помощью Агентов. Узнайте, как улучшить свой конвейер RAG и уменьшить галлюцинации, внедряя интеллектуальных агентов, которые могут анализировать запросы, уточнять поиск и генерировать более точные и всеобъемлющие ответы. Этот блог-пост предоставляет практическое руководство по внедрению агентского RAG, оснащая вас инструментами для повышения ваших приложений обработки естественного языка.

Как агенты могут исправить галлюцинации в RAG

Шаг извлечения информации в генерации, усиленной извлечением (RAG), в значительной степени зависит от того, как пользователь задает вопросы. Если запрос сформулирован неправильно, извлечение информации может быть затруднено, даже если искомая информация присутствует в базе знаний. В традиционном RAG мы получаем единственное, короткое извлечение, но мы можем исправить это с помощью агентного RAG.

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

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

  1. Исходный запрос передается через агента.
  2. Агент переформулирует исходный запрос.
  3. Уточненный запрос передается через базу знаний, и выполняется поиск на основе семантического сходства, чтобы извлечь наиболее релевантные документы.
  4. Перед передачей релевантных документов в языковую модель агент анализирует эти документы или фрагменты еще раз и уточняет запрос, если считает, что извлеченные документы не могут ответить на вопрос.
  5. На основе уточненного запроса процесс повторяется, пока агент не будет удовлетворен как извлеченными документами, так и переформулированным запросом.
  6. Окончательный контекст затем передается в языковую модель для генерации ответа.

В этом случае агент может планировать, анализировать и выполнять для реализации агентного цикла в вашем конвейере RAG. У вас есть несколько вариантов, таких как фреймворки Crew AI, AutoGPT или LangGraph из LangChain, которые вы можете использовать для построения агентов. В этом видео мы будем использовать Transformers Agents, малоизвестную функцию в пакете Transformers, которая позволяет создавать собственных агентов.

Построение агентной конвейерной линии RAG

Шаг извлечения информации в генерации, усиленной извлечением (RAG), в значительной степени зависит от того, как пользователь задает вопросы. Если запрос сформулирован неправильно, извлечение информации может быть затруднено, даже если искомая информация присутствует в базе знаний. В традиционном RAG мы получаем единственное, короткое извлечение, но мы можем исправить это с помощью агентного RAG.

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

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

  1. Исходный запрос передается через агента.
  2. Агент переформулирует исходный запрос.
  3. Уточненный запрос передается через базу знаний, и выполняется поиск на основе семантического сходства, чтобы извлечь наиболее релевантные документы.
  4. Перед передачей релевантных документов в языковую модель агент анализирует эти документы или фрагменты еще раз и уточняет запрос, если считает, что извлеченные документы не могут ответить на вопрос.
  5. На основе уточненного запроса процесс повторяется, пока агент не будет удовлетворен как извлеченными документами, так и переформулированным запросом.
  6. Окончательный контекст затем передается в языковую модель для генерации ответа.

Для реализации агентного цикла в вашем конвейере RAG у вас есть несколько вариантов, таких как фреймворки Crew AI, Auto или LangGraph из LangChain. В этом случае мы будем использовать Transformers Agents, малоизвестную функцию в пакете Transformers, которая позволяет создавать собственных агентов.

Прежде всего, нам нужно установить необходимые пакеты, включая pandas, LangChain, пакет сообщества LangChain, пакет Sentence Transformer и пакет Transformers. Затем мы импортируем необходимые модули и настраиваем данные, включая разбиение документов на фрагменты и создание встраиваний.

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

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

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

Создание инструмента для поиска

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

class RetrievalTool:
    """Using semantic similarity, retrieves some documents from the knowledge base that have the closest embeddings to the input."""

    def __init__(self, vector_db):
        self.vector_db = vector_db

    def __call__(self, query: str) -> List[str]:
        """
        Retrieve up to 7 most similar chunks from the vector DB for the given query.
        
        Args:
            query (str): A query to perform retrieval on. This should be semantically close to the target documents.
        
        Returns:
            List[str]: A list of up to 7 most similar chunks from the vector DB.
        """
        results = self.vector_db.similarity_search(query, k=7)
        return [chunk.page_content for chunk in results]

Класс RetrievalTool принимает объект vector_db в качестве входных данных, который является хранилищем векторов (например, Faiss, Chroma, Pinecone), используемым для хранения встраиваний документов.

Метод __call__ класса принимает строку query в качестве входных данных и возвращает список из не более чем 7 наиболее похожих фрагментов из векторной базы. Он использует метод similarity_search объекта vector_db для поиска наиболее похожих фрагментов на основе косинусного сходства.

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

Интеграция языковой модели

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

  1. Использование движка Hugging Face: Это позволяет нам напрямую вызывать API-конечные точки различных LLM, доступных через серверную архитектуру Hugging Face. Мы можем использовать модели, такие как Llama 38B или 70B, но для этого обычно требуется подписка Hugging Face Pro.

  2. Использование OpenAI: В этом примере мы будем использовать движок OpenAI. Процесс можно адаптировать для настройки любой другой LLM.

Чтобы настроить движок OpenAI, мы создаем класс OpenAIEngine, который использует функции message_rle и gpt_generate_message_list из движка LLM Transformer Agents. Этот класс обрабатывает очистку входных сообщений и использует конечную точку завершения чата OpenAI для генерации ответов.

Затем мы создаем сам агент. Агент имеет доступ к инструменту извлечения, который мы создали ранее, к LLM, которую мы хотим использовать (в данном случае OpenAIEngine), и к максимальному количеству итераций, которые мы хотим, чтобы агент выполнил, прежде чем остановить агентный цикл.

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

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

Реализация агентного агента

Чтобы реализовать агентного агента, мы будем использовать функцию Transformers Agents в пакете Transformers. Это обеспечивает модульный и четкий подход к созданию пользовательских агентов.

Прежде всего, нам нужно установить необходимые пакеты, включая pandas, Langchain, пакет сообщества Langchain, Sentence Transformers и Transformers Agents.

Затем мы импортируем необходимые модули и пакеты. Мы будем использовать ReactJsonAgent, строить пользовательские инструменты для агента и использовать движок Hugging Face для языковой модели.

Чтобы построить конвейер RAG, мы начинаем с набора данных, содержащего документацию Hugging Face. Мы разбиваем документы на фрагменты и создаем встраивания с использованием модели GTE-small. Затем мы удаляем любые дублирующиеся фрагменты и храним уникальные фрагменты в векторном хранилище на основе F.

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

Мы также настраиваем языковую модель, в данном случае используя движок OpenAI с моделью GPT-4.

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

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

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

Сравнение стандартного RAG и агентного RAG

Основные различия между стандартным RAG и агентным RAG заключаются в следующем:

  1. Переформулирование запроса: В стандартном RAG пользовательский запрос

Часто задаваемые вопросы