Откройте для себя преимущества постоянного векторного хранилища и оптимизируйте свою стратегию хранения данных.

Отказ от ответственности: в этой статье используются LlamaIndex и Milvus, я являюсь сотрудником компании Zilliz, основной сопровождающей Milvus

Если вы не жили под скалой, вы знаете, что такое ChatGPT. ChatGPT работает на основе GPT, большой языковой модели (LLM), созданной OpenAI. Популярность ChatGPT вызвала массовый интерес к LLM и к тому, как их можно использовать. LlamaIndex — это новый мощный инструмент для создания приложений LLM.

Три наиболее важные проблемы, возникающие при создании приложений LLM:

  • Огромная стоимость.
  • Отсутствие актуальной информации.
  • Потребность в предметных знаниях.

Для решения этих проблем предлагаются два основных фреймворка: тонкая настройка и кэширование + внедрение.

Тонкая настройка — хорошее решение двух последних проблем, связанных с отсутствием правильной информации. Однако при управлении затратами тонкая настройка не помогает. Вот почему мы используем кеширование + инъекцию. Один из фреймворков для этого получил название CVP или ChatGPT + Vector Database + Prompt-as-Code. LlamaIndex может абстрагировать большую часть этой структуры для вас.

В этой части мы рассмотрим:

  • Введение в LlamaIndex
  • Создание и сохранение векторного индекса LlamaIndex
  • Локальное использование векторной базы данных
  • Использование базы данных облачных векторов
  • Краткое изложение того, как использовать постоянное векторное хранилище с LlamaIndex

Введение в LlamaIndex

«[Вы можете думать о LlamaIndex] как о черном ящике вокруг ваших данных и LLM», — Джерри Лю, соучредитель LlamaIndex.

LlamaIndex облегчает взаимодействие между вами, вашими данными и LLM, таким как ChatGPT. Во-первых, он предоставляет способ «индексировать» ваши данные в несколько «узлов». Затем он использует проиндексированные данные для взаимодействия с ChatGPT. В LlamaIndex существует четыре основных шаблона индексации: индекс списка, индекс хранилища векторов, индекс дерева и индекс ключевых слов.

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

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

Создание и сохранение векторного индекса LlamaIndex

Вам нужно будет получить некоторые данные, чтобы следовать коду в этом руководстве. Для этого урока я использую данные непосредственно из папки примеров в репозитории LlamaIndex. Вы можете клонировать репозиторий локально и создать записную книжку в папке paul_graham_essay или загрузить данные из этой папки и использовать код локально в своей папке.

Локальное использование векторной базы данных

Для этого примера мы используем базу данных векторов с открытым исходным кодом Milvus. В частности, Milvus Lite, поэтому мы можем запустить его прямо в ноутбуке без дополнительной работы. Нам нужно только pip install это. Прежде чем запускать приведенный ниже код, pip install Milvus llama-index python-dotenv. Вам также понадобится Ключ OpenAI API для работы с GPT. Библиотека python-dotenv нужна только в том случае, если вы храните ключ API OpenAI в файле .env.

Импорт из llama_index нам нужен: GPTVectorStoreIndex, StorageContext и MilvusVectorStore из модуля vector_stores. Нам нужен только один импорт из Milvus, default_server. Я также импортирую os и load_dotenv для загрузки моего ключа API.

После завершения импорта и загрузки ключа API мы запускаем нашу векторную базу данных. Затем мы можем вызвать start() на default_server, чтобы локально запустить экземпляр Milvus Lite. Затем мы можем подключиться к хранилищу векторов, используя MilvusVectorStore, и передать соответствующий хост и порт.

from llama_index import GPTVectorStoreIndex, StorageContext
from llama_index.vector_stores import MilvusVectorStore
from milvus import default_server
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")


default_server.start()
vector_store = MilvusVectorStore(
   host = "127.0.0.1",
   port = default_server.listen_port
)

Подключив нашу векторную базу данных, мы настраиваем контекст хранилища. Контекст хранилища сообщает LlamaIndex, где хранить индекс. Теперь, когда все настроено, мы создаем индекс с GPTVectorStoreIndex. Мы передаем как документы для создания индекса, так и контекст хранилища.

Отсюда мы можем запросить индекс как обычно. В этом примере мы запрашиваем индекс вектора с помощью «Что делал автор, когда рос?» Этот вопрос требует векторного индекса, потому что он требует семантических абстракций «автор» и «взросление». Например, мы должны увидеть такой ответ: «В детстве автор писал короткие рассказы, программировал их на IBM 1401 и уговаривал отца купить ему микрокомпьютер TRS-80. …”

storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = GPTVectorStoreIndex.from_documents(
   documents, storage_context=storage_context
)
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)

Использование базы данных облачных векторов

Если у вас достаточно данных, имеет смысл использовать облачное хранилище, а не локальное хранилище, чтобы использовать облачную базу данных векторов для вашего индекса хранилища векторов LlamaIndex. Чтобы использовать облачную версию Milvus, Zilliz, вам нужно сделать всего две вещи по-другому. Во-первых, получите учетную запись Zilliz (с бесплатным кредитом в размере 100 долларов США) и создайте коллекцию в своей учетной записи. Затем внесите следующие изменения в код.

Вместо того, чтобы писать:

vector_store = MilvusVectorStore(
   host = "127.0.0.1",
   port = default_server.listen_port
)

Использовать:

vector_store = MilvusVectorStore(
   host = HOST
   port = PORT,
   user = USER,
   password = PASSWORD,
   use_secure = True,
   overwrite = True
)

Где HOST, PORT, USER и PASSWORD соответствуют хосту, порту, имени пользователя и паролю, установленным в вашей учетной записи Zilliz.

Краткое изложение того, как использовать постоянное векторное хранилище с LlamaIndex

В этом руководстве мы кратко рассмотрели LlamaIndex, платформу для взаимодействия с вашими данными и LLM. Затем мы создали пример индекса хранилища векторов в LlamaIndex и рассмотрели два способа сохранения вашего хранилища векторов. Сначала мы рассмотрели создание постоянного хранилища векторов с помощью Milvus Lite. Затем мы рассмотрели, как использовать облачную векторную базу данных с помощью Zilliz.