Chroma — это встроенная база данных с открытым исходным кодом, которая упрощает создание приложений LLM, позволяя подключать к LLM знания, факты и навыки. Вот как это работает.
Переведено с Exploring Chroma: The Open Source Vector Database for LLMs 。
Большая языковая модельизRise ускоряет встраивание сохраненных словизвекторная база данныхизиспользовать。
Векторные базы данных хранят данные в векторной форме, используя потенциал передовых алгоритмов машинного обучения. Он обеспечивает высокоэффективный поиск по сходству, который имеет решающее значение для приложений искусственного интеллекта, включая рекомендательные системы, распознавание изображений и обработку естественного языка.
В векторной базе данных каждая сохраненная точка данных представлена как многомерный вектор, отражающий суть сложных данных. Расширенные методы индексации, такие как деревья kd или хэши, помогают быстро находить похожие векторы. Эта архитектура создает высокомасштабируемые и эффективные решения для отраслей с интенсивным использованием данных, меняя наш подход к анализу больших данных.
В этой статье мы рассмотрим более подробно Chroma , легкая векторная база данных с открытым исходным кодом。
Chroma можно использовать в коде Python или JavaScript для создания вложений слов. Он имеет простой API, который можно использовать для работы с базами данных, работающими в режиме памяти или в режиме клиент/сервер. Разработчики могут установить Chroma, прототип с помощью API в Jupyter Notebook, а затем использовать тот же код в производственной среде, которая может запускать базу данных в режиме клиент/сервер.
При работе в памяти Chroma Коллекции баз данных можно сохранить как Apache Parquet отформатировать файл диска. Поскольку создание векторных представлений слов является дорогостоящей задачей, сохранение их для последующего извлечения может снизить затраты и накладные расходы на производительность.
Теперь давайте посмотрим, как работает база данных векторов Chroma.
Первый шаг к использованию Chroma — установить его через pip.
pip install chroma
После установки вы можете импортировать модуль в свой код.
import chromadb
Теперь давайте создадим список строк, которые мы будем закодировать для создания вложений.
phrases = [
"Amanda baked cookies and will bring Jerry some tomorrow.",
"Olivia and Olivier are voting for liberals in this election.",
"Sam is confused, because he overheard Rick complaining about him as a roommate. Naomi thinks Sam should talk to Rick. Sam is not sure what to do.",
"John's cookies were only half-baked but he still carries them for Mary."
]
Нам также нужен список строк, которые однозначно идентифицируют указанную выше строку.
ids = ["001", "002", "003", "004"]
Дополнительные метаданные также могут быть связаны с каждой строкой со ссылкой или указателем на первоисточник. Это совершенно необязательно. Для нашего урока мы добавим несколько фиктивных метаданных. Он создается в виде списка объектов словаря.
metadatas = [{"source": "pdf-1"}, {"source": "doc-1"}, {"source": "pdf-2"}, {"source": "txt-1"}]
Теперь у нас есть все сущности, которые можно хранить в Chroma. Давайте инициализируем клиента.
chroma_client = chromadb.Client()
Если вы хотите сохранить данные на диске, вы можете передать им местоположение каталога, в котором сохранена база данных.
chroma_client = chromadb.PersistentClient(path="/path/to/save/to")
Chroma называет группу связанного контента коллекцией. В каждой коллекции есть документы, которые представляют собой просто серию строк, идентификаторы, которые действуют как уникальные идентификаторы документов, и необязательные метаданные.
Вложения являются важной частью коллекций. Они могут быть сгенерированы неявно на основе модели внедрения слов, включенной в Chroma, или вы можете сгенерировать их на основе внешних моделей внедрения слов из OpenAI, PaLM или Cohere. Chroma упрощает интеграцию внешних API для автоматического создания и хранения встраиваемых изображений. Мы рассмотрим эту концепцию более подробно в следующей части этого урока.
Chroma по умолчанию создает вложения, используя модель преобразователей предложений, полностью состоящую из MiniLM-L6-v2. Эта модель внедрения может генерировать внедрения предложений и документов для различных задач. Эта функция внедрения запускается на вашем локальном компьютере и может потребовать загрузки файла модели, что произойдет автоматически.
Поскольку мы полагаемся на встроенную модель встраивания слов, предоставляемую Chroma, мы просто принимаем данные и позволяем Chroma автоматически генерировать встраивания для каждого документа в коллекции.
Мы можем пойти дальше и создать коллекцию.
collection = chroma_client.create_collection(name="tns_tutorial")
Теперь мы готовы вставить документ в коллекцию.
collection.add(
documents=phrases,
metadatas=metadatas,
ids=ids
)
Мы можем быстро проверить, создал ли вставленный документ встраивание.
collection.peek()
Вы должны увидеть автоматически созданную вставку, добавленную в список встраивания коллекции.
Теперь мы можем выполнить поиск по сходству в коллекции. Давайте найдем фразы, соответствующие фразе «Мэри недоделана от Джона». Обратите внимание, что оно имеет только то же значение, что и документ, но не точное совпадение.
results = collection.query(
query_texts=["Mary got half-baked cake from John"],
n_results=2
)
Когда осуществляется доступ к переменной результата, ее содержимое выглядит следующим образом:
{'ids': [['004', '001']],
'distances': [[0.4699302613735199, 1.333911657333374]],
'metadatas': [[{'source': 'txt-1'}, {'source': 'pdf-1'}]],
'embeddings': None,
'documents': [["John's cookies were only half-baked but he still carries them for Mary.",
'Amanda baked cookies and will bring Jerry some tomorrow.']]}
Судя по расстоянию, первый документ в списке идеально подходит. Теперь мы можем получить прямой доступ к элементу, чтобы получить фактическую фразу. Элемент внедрения пуст, поскольку получение внедрения для каждого запроса обходится дорого. Но за кулисами Chroma выполняет поиск косинусного сходства на основе вложений, хранящихся в виде векторов.
print(results['documents'][0][0])
База данных Chroma также поддерживает запросы на основе метаданных или идентификаторов. Это делает поиск по источнику документа очень удобным.
results = collection.query(
query_texts=["cookies"],
where={"source": "pdf-1"},
n_results=1
)
print(results)
Приведенный выше запрос сначала выполняет поиск по сходству, а затем фильтрует запрос на основе условияwhere, которое определяет метаданные.
Наконец, давайте удалим коллекцию.
collection.delete()
В следующей части этого руководства, которая, как ожидается, будет выпущена на следующей неделе, мы расширим чат-бот Academy Awards, чтобы использовать базу данных векторов Chroma. Следите за обновлениями.
Ниже приведен полный код, который вы можете попробовать на своем компьютере.
import chromadb
phrases = [
"Amanda baked cookies and will bring Jerry some tomorrow.",
"Olivia and Olivier are voting for liberals in this election.",
"Sam is confused, because he overheard Rick complaining about him as a roommate. Naomi thinks Sam should talk to Rick. Sam is not sure what to do.",
"John's cookies were only half-baked but he still carries them for Mary.",
]
ids = ["001", "002", "003", "004"]
metadatas = [{"source": "pdf-1"}, {"source": "doc-1"}, {"source": "pdf-2"}, {"source": "txt-1"}]
chroma_client = chromadb.Client()
collection = chroma_client.get_or_create_collection(name="tns_tutorial")
collection.add(
documents=phrases,
metadatas=metadatas,
ids=ids
)
collection.peek()
results = collection.query(
query_texts=["Mary got half-baked cake from John"],
n_results=2
)
print(results['documents'][0][0])
results = collection.query(
query_texts=["cookies"],
where={"source": "pdf-1"},
n_results=1
)
print(results)
collection.delete()