Timescale Vector в интеграции с LangChain позволяет использовать PostgreSQL как векторную базу данных для ИИ-приложений. Решение обеспечивает быстрый поиск по сходству, фильтрацию по времени для RAG и возможности самозапросов.
PostgreSQL — самая популярная база данных в мире, она проверена в эксплуатации более трёх десятилетий, надёжна и имеет богатую экосистему инструментов. Timescale Vector улучшает открытое расширение pgvector, ориентируясь на потребности разработчиков ИИ-приложений.
Среди ключевых возможностей Timescale Vector:
* ускоренный поиск сходства на миллионах векторов благодаря новому поисковому индексу на основе алгоритма DiskANN (превосходит существующие индексы PostgreSQL на 39,39–1590,33 % на наборе данных из миллиона встраиваний OpenAI);
* поддержка алгоритмов индексации pgvector: Hierarchical Navigable Small Worlds (HNSW) и Inverted File Flat (IVFFlat);
* оптимизация поиска векторов по времени: автоматическое разделение и индексирование по времени Timescale’s hypertables для быстрого поиска недавних встраиваний, ограничения поиска векторов по временному диапазону или возрасту документа;
* объединение векторных встраиваний, реляционных данных и временных данных в одной базе PostgreSQL;
* упрощённая обработка метаданных и фильтрация по нескольким атрибутам: использование всех типов данных PostgreSQL для хранения и фильтрации метаданных, объединение результатов векторного поиска с реляционными данными.
По результатам тестов с набором данных из миллиона вложений OpenAI, Timescale Vector обеспечивает ускорение поиска на 39,43–1590,33 % при точности ~99 % по сравнению с существующими индексами PostgreSQL и на 243,77 % — по сравнению со специализированными векторными базами данных (например, Weaviate). Квантование продукта даёт 10x index space savings compared to pgvector.
Преимущества нового индекса Timescale Vector на основе DiskANN:
* ускоренный поиск векторов с высокой точностью в PostgreSQL;
* оптимизация для работы на дисках (не только в памяти);
* оптимизация квантования, совместимая с PostgreSQL (уменьшение размера векторов и индекса);
* эффективный гибридный поиск или фильтрация дополнительных измерений.
Чтобы использовать индексы DiskANN, HNSW или IVFFLAT в LangChain, нужно создать хранилище векторов Timescale Vector:
from langchain.vectorstores.timescalevector import TimescaleVector
db = TimescaleVector.fromdocuments(embedding=embeddings,
documents=docs,
collectionname=COLLECTIONNAME,
serviceurl=SERVICE_URL,)
Затем выполнить db.create_index — будет создан индекс Timescale Vector с параметрами по умолчанию. Можно задать параметры создания индекса:
db.createindex(indextype="tsv", maxalpha=1.0, numneighbors=50)
Также можно создавать индексы HNSW и IVFFLAT:
db.createindex(indextype="hnsw", m=16, efconstruction=64)
db.createindex(index_type="ivfflat")
Временной контекст играет важную роль в векторных вложениях (например, это может быть дата создания, публикации или последнего обновления документов, изображений, веб‑страниц). Использование временной метаданных повышает качество и применимость результатов поиска. Примеры использования временного поиска в LangChain:
* хранение и извлечение истории ответов LLM (например, истории чатов чат‑бота);
* поиск самых свежих вложений, похожих на векторный запрос (например, последних новостей, документов или постов в соцсетях по теме выборов);
* поиск в пределах временного диапазона (например, вопросы о базе знаний: «Какие новые функции были добавлены в период с января по март 2023 года?»).
Рассмотрим пример работы с историей git log для TimescaleDB. Каждая запись в git log имеет временную метку, автора и информацию о коммите. Этапы работы:
1. Загрузка лога git с помощью LangChain JSON Loader:
loader = JSONLoader(filepath=FILEPATH, jqschema='.commithistory[]', textcontent=False, metadatafunc=extract_metadata)
documents = loader.load
Функция extract_metadata позволяет сохранить не только содержимое JSON в векторизованной форме, но и метаданные о вложении (в том числе временную метку записи лога git).
2. Создание идентификаторов на основе времени для документов: Timescale Vector использует часть «datetime» UUID v1, чтобы поместить векторы в правильный временной раздел. Функция uuid_from_time из Timescale Vector позволяет создать UUID v1 из объекта datetime в Python — его можно передать в конструктор хранилища векторов Timescale Vector:
from timescalevector import client
def createuuid(datestring: str):
if datestring is None:
return None
timeformat = '%a %b %d %H:%M:%S %Y %z'
datetimeobj = datetime.strptime(datestring, timeformat)
uuid = client.
Для использования Timescale Vector нужно указать аргумент time_partition_interval — длину интервала для разделения данных по времени (в примере — 7 дней; возможны другие значения: от 1 дня до 6 месяцев/1 года). Общее правило: частые запросы должны затрагивать несколько разделов, а весь набор данных — умещаться в 1000 разделов.
Создаётся экземпляр Timescale Vector через TimescaleVector.from_documents с параметрами: embedding=OpenAIEmbeddings, ids — список UUID v1 из этапа предобработки, documents=docs, collection_name="timescale_commits", service_url=SERVICE_URL, time_partition_interval=timedelta(days = 7).
Выполняется поиск по векторам с фильтрами по времени: задаются start_dt = datetime(2023, 8, 1, 22, 10, 35) и end_dt = datetime(2023, 8, 30, 22, 10, 35), запрос query = "What's new with TimescaleDB functions?", результат — docs_with_score = db.similarity_search_with_score(query, start_date=start_dt, end_date=end_dt).
Пример результата поиска: оценка 0.17487859725952148, дата 29 августа 2023 г., данные о коммите e4facda540286b0affba47ccc63959fefe2a7b26, автор Sven Klemm (sven@timescale.com), сводка изменений — добавление слоя совместимости для функций timescaledbinternal.
Timescale Vector разделяет данные по времени и создаёт индексы ANN для каждого раздела отдельно. Процесс поиска состоит из трёх шагов:
1. Фильтрация разделов, не соответствующих временному предикату.
2. Поиск по сходству во всех подходящих разделах.
3. Объединение результатов из каждого раздела, повторное ранжирование и фильтрация результатов по времени.
Timescale Vector использует TimescaleDB’s hypertables для автоматического разделения векторов и связанных метаданных по временной метке — это позволяет эффективно выполнять запросы по векторам с учётом сходства и времени.
Использование Timescale Vector для Retrieval Augmented Generation (RAG) на наборе данных git log:
* создание ретривера из хранилища TimescaleVector с указанием начальной и конечной дат через searchkwargs: `retriever = db.asretriever(searchkwargs={"startdate": startdt, "enddate": enddt});llm = ChatOpenAI(temperature = 0.1, model = 'gpt-3.5-turbo-16k')
* создание RetrievalQA chain из Stuff chain с передачей ретривера и LLM для генерации ответа:,qastuff = RetrievalQA`.
Timescale Vector поддерживает самозапрос (self-querying) в LangChain: retriever создаёт SQL‑запрос на основе естественного языка и фильтров, применяет его к PostgreSQL в Timescale Vector. Можно использовать фильтры по лимиту, метаданным и времени.
Пример работы с набором данных git log:
1. Создаётся хранилище векторов TimescaleVector:
COLLECTIONNAME = "timescalecommits"
vectorstore = TimescaleVector(embeddingfunction=OpenAIEmbeddings, collectionname=COLLECTIONNAME, serviceurl=SERVICE_URL)
- Создаётся retriever с параметрами: llm, vectorstore, documentcontentdescription (описание содержимого векторных вложений — данные о записях git log), metadatafieldinfo (список объектов AttributeInfo с информацией о полях метаданных в коллекции векторов), enable_limit (при значении true позволяет ограничивать количество возвращаемых результатов).
Созданы метаданные полей для LLM: id (UUID v1 на основе даты коммита), date (дата коммита в формате timestamptz), authorname (имя автора коммита), authoremail (email автора коммита).
Создан ретривер SelfQueryRetriever на основе OpenAI (temperature=0), vectorstore, documentcontentdescription и metadatafieldinfo, с включённым ограничением и подробным выводом (verbose=True).
Пример запроса с фильтром по метаданным: retriever.get_relevant_documents("What commits about timescaledb_functions did Sven Klemm add?"). Перевод запроса: query='timescaledb_functions', filter=Comparison(comparator=Comparator.EQ, attribute='author_name', value='Sven Klemm'), limit=None.
Пример запроса с временным фильтром: retriever.get_relevant_documents("What commits were added in July 2023?"). Перевод запроса: query=' ', filter=Operation(operator=Operator.AND, arguments=[Comparison(comparator=Comparator.GTE, attribute='date', value='2023-07-01T00:00:00Z'), Comparison(comparator=Comparator.LTE, attribute='date', value='2023-07-31T23:59:59Z')]), limit=None.
Представлены блоки кода Document(pagecontent='{"commit": " 5cf354e2469ee7e43248bed382a4b49fc7ccfecd", "author": "Markus Engelengel@sero-systems.de", "date": "Mon Jul 31 11:28:25 2023 +0200",...Document(pagecontent='{"commit": " 88aaf23ae37fe7f47252b87325eb570aa417c607", "author": "noctarius aka Christoph Engelbertme@noctarius.com", "date": "Wed Jul 12 14:53:40 2023 +0200", . . .Document(page_content='{"commit": " d5268c36fbd23fa2a93c0371998286e8688247bb", "author": "Alexander Kuzmenkov36882414+akuzm@users.noreply.github.com", "date": "Fri Jul 28 13:35:05 2023 +0200",...Note how you can specify a query, filter, and composite filter (filters with AND, OR) in natural language and the self-query retriever will translate that query into SQL and perform the search on the Timescale Vector (PostgreSQL) vector store.This illustrates the power of the self-query retriever. You can use it to perform complex searches over your vector store without you or your users having to write any SQL directly.What’s more, you can combine the self-query retriever with the LangChain [RetrievalQA chain, Timescale Vector documentation:, Self-query retriever tutorial:, Timescale Vector explainer, Timescale Vector website, LangChain Users get Timescale Vector free for 3 Months, Try Timescale Vector for free today для изучения использования Timescale Vector как векторного хранилища LangChain, ретривера с самозапросами, а также для углублённого изучения работы Timescale Vector.
Timescale предоставляет пользователям LangChain 90‑дневный пробный период Timescale Vector — плата за облачные PostgreSQL‑базы данных в этот период не взимается.
Go back to blog
Create agents
offering a free 90 day trial!
Timescale Vector
Stack Overflow 2023 Developer Survey
Timescale Vector achieves 243% faster search speed at ~99 % recall than Weaviate, a specialized database,
this tutorial
LangChain Users Get 3 Months Free of Timescale Vector
Try Timescale Vector for free today
DiskANN
ANN benchmarks
read more about the performance benchmark methodology and results here.