paint-brush
Векторные базы данных — основы векторного поиска и пакет Langchain в Pythonк@shyamganesh
18,016 чтения
18,016 чтения

Векторные базы данных — основы векторного поиска и пакет Langchain в Python

к Shyam Ganesh S7m2023/09/30
Read on Terminal Reader
Read this story w/o Javascript

Слишком долго; Читать

В этой статье я познакомлю вас с основами векторных баз данных, векторного поиска и пакета Langchain в Python для хранения и запроса подобных векторов. Чтобы начать наш путь обучения, мы начнем с ключевой концепции под названием «Вложения». Вложения — это способ представления данных машине в ее собственном понятном формате.
featured image - Векторные базы данных — основы векторного поиска и пакет Langchain в Python
Shyam Ganesh S HackerNoon profile picture

В этом сообщении блога я познакомлю вас с основами векторных баз данных, векторного поиска и пакета Langchain на Python, который облегчает хранение и извлечение сопоставимых векторов.


Чтобы начать наше путешествие, мы начнем с ключевой концепции, известной как «Вложения».

Что такое вложения?

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


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


Возникает один насущный вопрос: могут ли люди расшифровать эти вложения? Ответ - нет. Вложения — это, по сути, последовательности чисел, инкапсулирующие текстовую информацию.


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


Существует множество методов создания вложений из текста. Известные методы включают, среди прочего, TF-IDF, Word2Vec, Glove и BERT. В современной сфере машинного обучения встраивание предложений приобрело популярность по сравнению с встраиванием слов.


Эти встраивания предложений, представляющие суть текста, могут быть получены из предварительно обученных моделей преобразователей предложений, таких как «all-MiniLM-L6-V2» и «all-mpnet-base-v2».


Эти модели создают вложения с фиксированными размерами, обычно 384 или 768, для данного текста.


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

Векторные магазины

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


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



Хранилища векторов упрощают процесс хранения вложений и проведения поиска по сходству среди этих векторов, упрощая управление и поиск многомерных представлений данных.


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


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


Евклидово расстояние = [(x2 - x1)^2 + (y2 - y1)^2]^0,5



Расстояние между двумя точками в 2D


Здесь (x1, y1) представляет координаты первой точки, а (x2, y2) представляет координаты второй точки на графике. Результат этого расчета дает меру пространственного разделения между двумя точками, указывая на их сходство или несходство с точки зрения их положения на графике.


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


В строке кода ниже показано, как получить 5 лучших похожих вложений для заданных входных данных:

 distance, n = vector_store.search(input_embedding, k=5)


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


Выходные данные функции Vector_store.search() включают в себя топ-k похожих вложений вместе с соответствующими расстояниями от input_embedding. Параметр «k» — это настраиваемое значение, которое определяет количество ближайших вложений, которые необходимо получить при поиске по сходству. Вы можете установить «k», чтобы контролировать желаемое количество результатов, возвращаемых операцией поиска.


Теперь, когда мы получили базовое представление о векторных хранилищах, давайте перейдем к изучению пакета LangChain и FAISS. Эти инструменты еще больше расширят наши возможности работы с многомерными вложениями и выполнения эффективного поиска по сходству.

Лангчейн в Python

Проще говоря, LangChain — это платформа, предназначенная для создания приложений, использующих возможности больших языковых моделей (LLM). Для получения более подробной информации и ресурсов вы можете обратиться к официальной документации LangChain.


Лангчейн в питоне


И наоборот, FAISS, что означает «Поиск сходства AI в Facebook», представляет собой библиотеку Python, которая предоставляет разработчикам быстрые и эффективные средства поиска похожих вложений, отходя от традиционных подходов на основе хеш-функций.


Эта библиотека была разработана командой Facebook AI и предлагает мощные возможности для задач поиска по сходству в многомерных пространствах.


FAISS — это библиотека с открытым исходным кодом, которую можно разместить на вашем собственном сервере.


В нашем исследовании LangChain и FAISS мы теперь будем стремиться реализовать FAISS в рамках LangChain. Ниже приведены некоторые ключевые API-интерфейсы интеграции LangChain FAISS, на которых мы сосредоточимся в этой статье:


  1. add_documents() : эта функция позволяет нам включать дополнительные документы в векторное хранилище.


  2. add_embeddings() : позволяет добавлять дополнительные вложения в векторное хранилище.


  3. from_documents() : этот API возвращает VectorStore на основе предоставленных документов.


  4. from_embeddings() : эта функция предоставляет индекс FAISS, сгенерированный на основе заданных вложений.


  5. load_local() : используйте это для загрузки индекса FAISS с диска.


  6. save_local() : позволяет сохранить индекс FAISS на диск.


  7. likeity_search() : эта функция находит документы, наиболее похожие на заданный запрос.


  8. likeity_search_by_vector() : извлекает документы, наиболее похожие на заданное вложение.


Эти API составляют основу для объединения возможностей LangChain с FAISS, позволяя вам работать с встраиваниями и выполнять эффективный поиск по сходству в ваших приложениях.


Метафильтрация — ценный метод, используемый для уточнения результатов поискового запроса в LangChain FAISS. Обычно существует два типа метафильтрации: предварительная фильтрация и постфильтрация. В нашей структуре мы специально поддерживаем пост-фильтрацию поисковых запросов.


Важно отметить, что концепция метафильтрации результатов поиска — это функция, доступная в версии FAISS для LangChain, но не присутствующая в исходной реализации FAISS. Эта возможность пост-фильтрации повышает точность и релевантность результатов поиска, предлагая пользователям более персонализированные результаты.


Вооружившись знаниями об API-интерфейсах LangChain FAISS, давайте углубимся в реализацию LangChain FAISS на Python. Эта реализация позволит вам работать с встраиваниями, выполнять поиск по сходству и применять методы постфильтрации для точной настройки результатов поиска в рамках LangChain.


Не стесняйтесь исследовать и использовать эти возможности для создания приложений, использующих возможности больших языковых моделей и расширенный поиск по сходству с помощью FAISS.

Демонстрация LangChain FAISS Python

Набор данных

В этом учебном руководстве мы выбрали Стэнфордский набор данных в качестве базового набора данных и добавили несколько столбцов, чтобы продемонстрировать работу метафильтрации в LangChain FAISS.


Начнем с установки и импорта необходимых пакетов.

 !pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
 from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle


Теперь мы импортируем набор данных:

 passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data 

Обзор набора данных


Имея набор данных, нам нужно инициализировать функцию внедрения для преобразования текстовых данных в векторы. Мы использовали «трансформеры предложений/all-MiniLM-L6-V2», который генерирует вложения в 384 измерениях,

 from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")


Мы установим информацию метаданных. В метаданные мы добавили идентификатор документа и язык документа для каждого встраивания (контента),

 start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)


Вот и все… Теперь мы построим наш индекс FAISS,

 faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)


Теперь попробуем сохранить индекс FAISS на диск и загрузить его обратно:

 faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")


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


Сначала мы получим пятерку аналогичных документов, связанных с «атеизмом».

 start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5) 

Выход «атеизма»


Что ж, результаты убедительны. Но все же мы узнаем больше…


На этот раз мы попробуем запрос на другом языке с некоторой метафильтрацией. Мы зададим русский запрос, в котором будет указано, что критерием фильтрации должен быть {lang: 'ru_RU'}.

 #Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)


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

Вывод запроса постфильтрации


Я надеюсь, что после прочтения этой статьи вы получили четкое представление о векторных хранилищах и векторном поиске. Мы также продемонстрировали LangChain FAISS, чтобы проиллюстрировать его функциональность.


Я настоятельно рекомендую вам изучить другие векторные магазины, такие как ChromaDb, Qdrant, Milvus и другие.


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


Желаем вам приятного и плодотворного учебного пути!