Руководство по созданию и оценке решений RAG с использованием возможностей LLM-as-a-Judge.
Делиться

Введение
Решения на основе поиска и дополненной генерации данных (RAG) встречаются повсеместно. В последние несколько лет мы наблюдаем их быстрый рост по мере того, как организации используют RAG или гибридные RAG-решения в сфере обслуживания клиентов, здравоохранения, аналитики и других областях. Но как оценить эти решения? И какие методы можно использовать для определения сильных и слабых сторон наших RAG-моделей?
В этой статье мы познакомимся с RAG на примере создания собственного чат-бота на основе открытых исследовательских данных с использованием LangChain и других инструментов. Мы также воспользуемся DeepEval для оценки нашего конвейера RAG как для ретривера, так и для генератора. Наконец, мы обсудим методы тестирования решений RAG с участием людей.
Генерация дополненной информации
С появлением LLM возникло множество критических замечаний, поскольку эти «базовые» предобученные модели давали неверные ответы, несмотря на обучение на огромных наборах данных. В результате появилась технология Retrieval-Augmented Generation (RAG) — сочетание возможностей поиска и генерации, которые обращаются к контекстно-зависимой информации перед формированием ответа.

За последние несколько лет RAG приобрел большую популярность благодаря своей способности уменьшать галлюцинации и улучшать восприятие фактов. Они гибкие, легко обновляются и гораздо дешевле, чем тонкая настройка LLM. Сейчас мы ежедневно сталкиваемся с решениями RAG. Например, многие организации используют RAG для создания внутренних чат-ботов, помогающих сотрудникам ориентироваться в базе знаний, а также внешних чат-ботов для поддержки обслуживания клиентов и других бизнес-функций.
Строительство трубопровода RAG
Для нашего решения RAG мы будем использовать выдержки из открытых исследований, связанных с искусственным интеллектом. Эти данные можно использовать для получения более «технических» ответов на вопросы, связанные с искусственным интеллектом, машинным обучением и т. д.
Использованные данные получены из API OpenAlex (https://openalex.org/). Это набор данных/каталог исследований с открытым исходным кодом со всего мира. Данные доступны бесплатно по лицензии No Rights Reserved (CC0).
Прием данных
Сначала нам нужно загрузить данные с помощью API OpenAlex. Ниже представлен код для поиска по году публикации и ключевым терминам. Мы выполняем поиск по ИИ/МО, используя такие ключевые термины, как «глубокое обучение», «обработка естественного языка», «компьютерное зрение» и т. д.
import pandas as pd import requests def import_data(pages, start_year, end_year, search_terms): «»» Эта функция используется для использования API OpenAlex, поиска по работам и возврата фрейма данных со связанными работами. Входные данные: — pages: int, количество страниц для цикла; — search_terms: str, ключевые слова для поиска (должны быть отформатированы в соответствии со стандартами OpenAlex); — start_year и end_year: int, годы для задания диапазона для фильтрации работ. «»» #создание пустого фрейма данных search_results = pd.DataFrame() for page in range(1, pages): #использование параметров для выполнения запроса и форматирования фрейма данных response = requests.get(f'https://api.openalex.org/works?page={page}&per-page=200&filter=publication_year:{start_year}-{end_year},type:article&search={search_terms}') data = pd.DataFrame(response.json()['results']) #добавление в пустой фрейм данных search_results = pd.concat([search_results, data]) #подмножество по соответствующим признакам search_results = search_results[[«id», «title», «display_name», «publication_year», «publication_date», «type», «countries_distinct_count»,»institutions_distinct_count», «has_fulltext», «cited_by_count», «keywords», «referenced_works_count», «abstract_inverted_index»]] return(search_results) #поиск исследований, связанных с ИИ ai_search = import_data(30, 2018, 2025, «'искусственный интеллект' ИЛИ 'глубокое обучение' ИЛИ 'нейронная сеть' ИЛИ 'обработка естественного языка' ИЛИ 'машина «учить» ИЛИ «большие языковые модели» ИЛИ «малые языковые модели»»)
При запросе к базе данных OpenAlex аннотации возвращаются в виде инвертированного индекса. Ниже представлена функция для отмены инвертированного индекса и возврата исходного текста аннотации.
def undo_inverted_index(inverted_index): «»» Функция предназначена для отмены и инвертирования индекса. Она принимает инвертированный индекс и возвращает исходную строку. «»» #создаёт пустые списки для хранения неинвертированного индекса word_index = [] words_unindexed = [] #цикл по индексу и возвращает пары ключ-значение for k, v in inverted_index.items(): for index in v: word_index.append([k,index]) #сортировка по индексу word_index = sorted(word_index, key = lambda x : x[1]) #объединяет только значения и выполняет выравнивание for pair in word_index: words_unindexed.append(pair[0]) words_unindexed = ' '.join(words_unindexed) return(words_unindexed) #создаёт элемент 'original_abstract' ai_search['исходный_абстрактный_индекс'] = список(карта(отмена_инвертированного_индекса, ai_search['абстрактный_инвертированный_индекс']))
Создать векторную базу данных
Далее нам необходимо сгенерировать вложения для представления аннотаций и сохранить их в векторной базе данных. Рекомендуется использовать векторные базы данных, поскольку они разработаны для запросов с малой задержкой и масштабируются для обработки миллиардов точек данных. Они также используют специализированные алгоритмы индексации и поиска ближайших соседей для быстрого извлечения данных на основе контекстного и/или семантического сходства, что делает их незаменимыми для приложений LLM.

Сначала мы импортируем необходимые библиотеки из LangChain и загружаем нашу модель встраивания из HuggingFace. Хотя, вероятно, можно добиться лучших результатов, используя более крупные модели встраивания, я решил использовать модель меньшего размера, чтобы повысить скорость работы этого конвейера.
Вы можете найти и сравнить модели встраивания по их размеру, производительности, предполагаемому использованию и т. д., используя таблицу лидеров MTEB от Hugging Face (https://huggingface.co/spaces/mteb/leaderboard).
из langchain_community.docstore.in_memory импорт InMemoryDocstore из langchain_community.vectorstores импорт FAISS из langchain_huggingface.embeddings импорт HuggingFaceEmbeddings из langchain_core.documents импорт Document #загрузка модели встраивания embeddings = HuggingFaceEmbeddings(model_name=»thenlper/gte-small»)
Затем мы создаём нашу векторную базу данных с помощью FAISS (или оболочки LangChain для FAISS). Сначала мы создаём индекс и форматируем данные и документы, а также сохраняем их метаданные (название и год). Затем мы создаём список идентификаторов, добавляем документы и идентификаторы в базу данных и сохраняем её локально.
#сохранить индекс с помощью faiss index = faiss.IndexFlatL2(len(embeddings.embed_query(«hello world»))) #отформатировать аннотации как документы documents = [Document(page_content=ai_search['original_abstract'][i], metadata={«title»: ai_search['title'][i], «year»: ai_search['publication_year'][i]}) for i in range(len(ai_search))] #создать список идентификаторов как строк n = len(ai_search) ids = list(range(1, n + 1)) ids = [str(x) for x in my_list] #добавить документы в хранилище векторов vector_store.add_documents(documents=documents, ids=ids) #сохранить хранилище векторов vector_store.save_local(«Data/faiss_index»)
Векторные хранилища LangChain позволяют нам напрямую запрашивать документы. Давайте быстро проверим это, выполнив поиск по запросу «компьютерное зрение». Ниже мы видим, что первый возвращённый документ, «Обнаружение и распознавание лиц с помощью OPENCV», тесно связан с компьютерным зрением.
#проверить работоспособность векторной базы данных vector_store.similarity_search(«computer vision», k=3)
[Document(id='783', metadata={'title': 'ОБНАРУЖЕНИЕ И РАСПОЗНАВАНИЕ ЛИЦ С ПОМОЩЬЮ OPENCV', 'year': 2020}, page_content='Компьютерное зрение — одна из самых увлекательных и сложных задач в области искусственного интеллекта. Компьютерное зрение служит связующим звеном между компьютерным программным обеспечением и визуальными образами, которые мы видим вокруг нас. Оно позволяет…
Создать трубопровод RAG
Теперь давайте разработаем наш конвейер RAG. Важнейшим компонентом решения RAG является генеративная модель, используемая для генерации ответов. Для этого мы воспользуемся моделью OpenAI из LangChain.
Чтобы мы могли сравнить ответ до и после внедрения конвейера RAG, давайте спросим «базовую» модель: «Каковы самые последние достижения в области компьютерного зрения?».
из langchain_openai import OpenAI из langchain.chains import RetrievalQA из langchain import PromptTemplate #set API key OPENAI_API_KEY = os.getenv(«OPENAI_API_KEY»,»API KEY») #load llm llm = OpenAI(openai_api_key=OPENAI_API_KEY) #test llm response llm.invoke(«Каковы последние достижения в области компьютерного зрения?»)
'nn1. Глубокое обучение: Глубокое обучение, подвид машинного обучения, продемонстрировало значительный прогресс в задачах компьютерного зрения, таких как обнаружение объектов, распознавание и классификация изображений. Оно использует нейронные сети с несколькими скрытыми слоями для обучения и извлечения признаков из изображений, что приводит к более точным и эффективным результатам.nn2. Генеративно-состязательные сети (GAN): GAN — это тип алгоритма глубокого обучения, который генерирует новые изображения, обучаясь на больших наборах данных. Они используются в таких задачах, как синтез изображений, сверхвысокое разрешение и преобразование изображений, и показывают впечатляющие результаты в создании реалистичных изображений.nn3. Свёрточные нейронные сети (CNN): CNN — это тип алгоритма глубокого обучения, который произвел революцию в области компьютерного зрения. Они высокоэффективны в извлечении признаков из изображений и используются в различных задачах, таких как классификация изображений, обнаружение объектов и сегментация.nn4. Перенос обучения: Перенос обучения позволяет использовать предварительно обученную модель для другой задачи или набора данных без необходимости начинать обучение с нуля. Он показал многообещающие результаты в задачах компьютерного зрения, особенно в задачах с ограниченным набором обучающих данных.nn5. Сегментация изображений: Благодаря развитию глубокого обучения сегментация изображений стала более точной и эффективной. Она включает в себя разделение изображения на различные области или сегменты для определения объектов.
В ответе выше мы видим общее описание компьютерного зрения, краткое описание принципов его работы, а также различных типов моделей и приложений. Хотя это хорошее описание, оно не даёт прямого ответа на наш вопрос. Отличная возможность для RAG!
Далее мы создадим компоненты для нашего конвейера RAG. Сначала нам понадобится ретривер для извлечения первых k документов, соответствующих нашему запросу. Затем мы создадим подсказку , указывающую нашей модели, как отвечать на вопросы. Наконец, мы объединим их с базовой генеративной моделью для создания нашего конвейера.
Давайте быстро перепроверим наш запрос «Каковы самые последние достижения в области компьютерного зрения?».
#проверьте работоспособность векторной базы данных Retriever = db.as_retriever(search_kwargs={«k»: 3}) #создайте шаблон приглашения template = «»»<|user|> Соответствующая информация: {context} Дайте краткий ответ на следующий вопрос, используя соответствующую информацию, предоставленную выше: {question} Если приведенная выше информация не отвечает на вопрос, скажите, что вы не знаете. Сократите ответы до 3 предложений или меньше.<|end|> <|assistant|>«»» #определите шаблон приглашения PromptTemplate( template=template, input_variables=[«context», «question»]) #создайте конвейер RAG Rag = RetrievalQA.from_chain_type(llm=llm, chain_type=»stuff», Retriever=retriever, return_source_documents=True, chain_type_kwargs={«prompt»: prompt}, verbose = True) #проверьте ответ Rag rag.invoke(«Каковы последние достижения в области компьютерного зрения?»)
К числу последних достижений в области компьютерного зрения относится появление крупных языковых моделей, оснащённых функциями машинного зрения, таких как GPT-4V от OpenAI, Bard AI от Google и Bing AI от Microsoft. Эти модели способны анализировать изображения и получать доступ к информации в режиме реального времени, что позволяет напрямую встраивать их во многие приложения. Ожидается дальнейшее развитие, поскольку искусственный интеллект продолжает стремительно развиваться.
Этот ответ гораздо лучше отвечает на наш вопрос. Он напрямую описывает новейшие достижения, упоминая конкретные возможности, модели и их вклад в развитие компьютерного зрения. Это многообещающий результат для нашего технического чат-бота.
Но это не полноценная оценка. Далее мы проведём дальнейшее тестирование нашего решения RAG по ряду показателей, чтобы определить, готово ли оно к запуску в эксплуатацию.
Источник: towardsdatascience.com



























