Это официальный Node.js SDK для Pinecone, написанный в TypeScript.
v0.x , ознакомьтесь с руководством по миграции V1 .v1.x , ознакомьтесь с руководством по миграции V2 .Фрагменты, показанные в этом Readme, предназначены для краткости. Для более реалистичных примеров, изучите эти примеры:
2.x до 3.x В этом обновлении существует нарушающее изменение, включающее операцию configureIndex . Структура объекта, передаваемой при настройке индекса, изменилась, чтобы включить введу deletionProtection . Поля podType и replicas теперь могут быть обновлены через объект spec.pod . См. Настройте индексы на основе POD для примера кода.
2.x : в этом выпуске было сделано много изменений, чтобы поддержать новое предложение Pinecone без сервера. Изменения подробно описаны в Руководстве по миграции V2 . Индексы без серверов доступны только в версиях выпуска 2.x или больше.1.x : этот релиз официально выдвинул SDK из бета, и существует ряд нарушающих изменений, которые необходимо решить при обновлении с версии 0.x См. Руководство по миграции V1 для получения подробной информации. SDK Pinecone Typescript совместим с TypeScript> = 4.1 и Node> = 18.x.
npm install @pinecone-database/pinecone
SDK Pinecone Typescript предназначен только для использования на стороне сервера . Использование SDK в контексте браузера может разоблачить ваши ключи API . Если вы развернули SDK для производства в браузере, поверните ключи API.
Ключ API требуется для инициализации клиента. Его можно пройти с помощью переменной среды или в коде через объект конфигурации. Получите ключ API в консоли.
Переменная среды, используемая для настройки клавиши API для клиента, составляет следующее:
PINECONE_API_KEY= " your_api_key " PINECONE_API_KEY - единственная необходимая переменная. Когда эта переменная среды установлена, клиентский конструктор не требует никаких дополнительных аргументов.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ; Если вы предпочитаете передавать конфигурацию в коде, конструктор принимает объект конфигурации, содержащий значение apiKey . Это объект, в котором вы будете проходить свойства, такие как maxRetries (по умолчанию 3 ) для повторных операций ( upsert , update и configureIndex ).
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( {
apiKey : 'your_api_key' ,
maxRetries : 5 ,
} ) ; Если настройка вашей сети требует, чтобы вы взаимодействовали с Pinecone через прокси, вы можете передать пользовательский ProxyAgent из библиотеки undici . Ниже приведен пример того, как построить ProxyAgent undici , который маршрутирует сетевой трафик через прокси -сервер mitm , когда нажимает на конечную точку /indexes Pinecone.
ПРИМЕЧАНИЕ. Следующая стратегия опирается на fetch реализацию Node, выпущенную в узле V16 и стабилизируется в узле V21. Если вы используете версии узлов 18-21, вы можете испытать проблемы, связанные с нестабильностью этой функции. В настоящее время нет известных проблем, связанных с оформлением в узле V18+.
import {
Pinecone ,
type PineconeConfiguration ,
} from '@pinecone-database/pinecone' ;
import { Dispatcher , ProxyAgent } from 'undici' ;
import * as fs from 'fs' ;
const cert = fs . readFileSync ( 'path-to-your-mitm-proxy-cert-pem-file' ) ;
const client = new ProxyAgent ( {
uri : '<your proxy server URI>' ,
requestTls : {
port : '<your proxy server port>' ,
ca : cert ,
host : '<your proxy server host>' ,
} ,
} ) ;
const customFetch = (
input : string | URL | Request ,
init : RequestInit | undefined
) => {
return fetch ( input , {
... init ,
dispatcher : client as Dispatcher ,
keepalive : true , # optional
} ) ;
} ;
const config : PineconeConfiguration = {
apiKey :
'<your Pinecone API key, available in your dashboard at app.pinecone.io>' ,
fetchApi : customFetch ,
} ;
const pc = new Pinecone ( config ) ;
const indexes = async ( ) => {
return await pc . listIndexes ( ) ;
} ;
indexes ( ) . then ( ( response ) => {
console . log ( 'My indexes: ' , response ) ;
} ) ; Как минимум, чтобы создать индекс без сервера, вы должны указать name , dimension и spec . dimension указывает размер векторов, которые вы собираетесь хранить в индексе. Например, если ваше намерение состояло в том, чтобы хранить и запросить вставки (векторы), сгенерированные с моделью Textembedding-ADA-002 OpenAI, вам нужно будет создать индекс с измерением 1536 , чтобы соответствовать выводу этой модели.
spec настраивает, как должен быть развернут индекс. Для индексов без серверов вы определяете только облако и область, где должен быть размещен индекс. Для индексов на основе POD вы определяете среду, в которой должен быть размещен индекс, тип POD и размер для использования и другие характеристики индекса. Для получения дополнительной информации о без серверной и региональной доступности см. Индексы понимания.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'sample-index' ,
dimension : 1536 ,
spec : {
serverless : {
cloud : 'aws' ,
region : 'us-west-2' ,
} ,
} ,
tags : { team : 'data-science' } ,
} ) ; Чтобы создать индекс на основе POD, вы определяете pod в объекте spec , который содержит environment , в которой должен быть размещен индекс, и размер podType и pods для использования. Многие дополнительные поля конфигурации позволяют больше контролировать аппаратные ресурсы и доступность. Чтобы узнать больше о целью этих полей, см. Понимание индексов и масштабные индексы на основе POD.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'sample-index-2' ,
dimension : 1536 ,
metric : 'dotproduct' ,
spec : {
pod : {
environment : 'us-east4-gcp' ,
pods : 2 ,
podType : 'p1.x2' ,
metadataConfig : {
indexed : [ 'product_type' ] ,
} ,
} ,
tags : { team : 'data-science' } ,
} ,
// This option tells the client not to throw if the index already exists.
suppressConflicts : true ,
// This option tells the client not to resolve the promise until the
// index is ready.
waitUntilReady : true ,
} ) ; Метод createIndex выпускает запрос Create API, который возвращается быстро, но полученный индекс не сразу готов к восприятию, запросу или выполнению других операций данных. Вы можете использовать метод describeIndex , чтобы узнать состояние индекса и посмотреть, готов ли он к использованию.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . describeIndex ( 'serverless-index' ) ;
// {
// name: 'serverless-index',
// dimension: 1536,
// metric: 'cosine',
// host: 'serverless-index-4zo0ijk.svc.us-west2-aws.pinecone.io',
// deletionProtection: 'disabled',
// spec: {
// serverless: {
// cloud: 'aws',
// region: 'us-west-2'
// }
// },
// status: {
// ready: false,
// state: 'Initializing'
// }
// } Если вы передадите опцию waitUntilReady , клиент проведет опросы для обновлений статуса в недавно созданном индексе. Обещание, возвращаемое createIndex не будет разрешено до тех пор, пока состояние индекса не укажет, что оно будет готово к обработке операций данных. Это может быть особенно полезно для тестирования интеграции, где создание индекса на шаге настройки будет сразу же следовать операциям данных.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'serverless-index' ,
dimension : 1536 ,
spec : {
serverless : {
cloud : 'aws' ,
region : 'us-west-2' ,
} ,
} ,
waitUntilReady : true ,
} ) ; Примечание
Индексы без серверов и стартуров не поддерживают коллекции.
Поскольку вы используете Pinecone для большего количества вещей, вы можете изучить различные конфигурации индекса с одинаковыми векторными данными. Коллекции обеспечивают простой способ сделать это. Смотрите другие методы клиента для работы с коллекциями здесь.
Учитывая, что у вас есть существующая коллекция:
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . describeCollection ( 'product-description-embeddings' ) ;
// {
// name: 'product-description-embeddings',
// size: 543427063,
// status: 'Ready',
// dimension: 2,
// vectorCount: 10001498,
// environment: 'us-east4-gcp'
// } Примечание. Для индексов на основе POD вы можете указать sourceCollection , из которого можно создать индекс. Коллекция должна быть в той же среде, что и индекс.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'product-description-p1x1' ,
dimension : 256 ,
metric : 'cosine' ,
spec : {
pod : {
environment : 'us-east4-gcp' ,
pods : 1 ,
podType : 'p1.x1' ,
sourceCollection : 'product-description-embeddings' ,
} ,
} ,
} ) ;Когда новый индекс будет готов, он должен содержать все данные, которые были в сборе, готовые к запросу.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . index ( 'product-description-p2x2' ) . describeIndexStats ( ) ;
// {
// namespaces: { '': { recordCount: 78000 } },
// dimension: 256,
// indexFullness: 0.9,
// totalRecordCount: 78000
// } Вы можете настроить индексы без серверов и POD с помощью deletionProtection . Любой индекс с этим свойством, установленным в 'enabled' не сможет быть удаленным. По умолчанию deletionProtection будет установлен на 'disabled' если не будет предоставлен как часть запроса createIndex . Чтобы включить deletionProtection вы можете передать значение при вызове createIndex .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'deletion-protected-index' ,
dimension : 1536 ,
metric : 'cosine' ,
deletionProtection : 'enabled' ,
spec : {
serverless : {
cloud : 'aws' ,
region : 'us-west-2' ,
} ,
} ,
} ) ; Чтобы отключить защиту от удаления, вы можете использовать работу configureIndex .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . configureIndex ( 'deletion-protected-index' , {
deletionProtection : 'disabled' ,
} ) ; Вы можете создавать или настроить индексы без серверов и POD с помощью тегов. Индексы могут содержать произвольное количество тегов, описывающих метаданные, которые вы хотели бы, чтобы привязаться к самому объекту индекса, например, владение командой, проект или любая другая соответствующая информация.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
// Create index with tag
await pc . createIndex ( {
name : 'tag-index' ,
dimension : 1536 ,
metric : 'cosine' ,
spec : {
serverless : {
cloud : 'aws' ,
region : 'us-west-2' ,
} ,
} ,
tags : { team : 'data-science' } , // index tag
} ) ;
// Configure index with a new tag
await pc . configureIndex ( 'tag-index' , {
tags : { project : 'recommendation' } , // new index tag
} ) ;
// Delete an existing tag
await pc . configureIndex ( 'tag-index' , {
tags : { project : '' } , // Pass an empty string to an existing key to delete a tag; this will delete the `project` tag
} ) ; Вы можете получить описание любого индекса по имени, используя describeIndex .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . describeIndex ( 'serverless-index' ) ;
// {
// name: 'serverless-index',
// dimension: 1536,
// metric: 'cosine',
// host: 'serverless-index-4zo0ijk.svc.us-west2-aws.pinecone.io',
// deletionProtection: 'disabled',
// spec: {
// serverless: {
// cloud: 'aws',
// region: 'us-west-2'
// },
// },
// status: {
// ready: true,
// state: 'Ready'
// }
// }Примечание
Этот раздел относится только к индексам на основе POD. Благодаря серверным индексам вы не настраиваете какие -либо ресурсы вычислений или хранения. Вместо этого, без серверов, индексы масштабируются автоматически на основе использования.
Вы можете настроить количество реплик или масштабирования до большего размера стручка (указанный с помощью podType ). См. Масштабные индексы на основе POD. Вы не можете понизить размер струи или изменить тип базового стручка.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . configureIndex ( 'pod-index' , {
spec : {
pod : {
replicas : 2 ,
podType : 'p1.x4' ,
} ,
} ,
} ) ;
const config = await pc . describeIndex ( 'pod-index' ) ;
// {
// name: 'pod-index',
// dimension: 1536,
// metric: 'cosine',
// host: 'pod-index-4zo0ijk.svc.us-east1-gcp.pinecone.io',
// deletionProtection: 'disabled',
// spec: {
// pod: {
// environment: 'us-east1-gcp',
// replicas: 2,
// shards: 2,
// podType: 'p1.x4',
// pods: 4,
// metadataConfig: [Object],
// sourceCollection: undefined
// }
// },
// status: {
// ready: true,
// state: 'ScalingUpPodSize'
// }
// }Индексы удалены по имени.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . deleteIndex ( 'sample-index' ) ; Команда listIndexes возвращает объект с массивом индексных моделей в соответствии с indexes .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . listIndexes ( ) ;
// {
// indexes: [
// {
// name: 'serverless-index',
// dimension: 1536,
// metric: 'cosine',
// host: 'serverless-index-4zo0ijk.svc.us-west2-aws.pinecone.io',
// deletionProtection: 'disabled',
// spec: {
// serverless: {
// cloud: 'aws',
// region: 'us-west-2',
// },
// },
// status: {
// ready: true,
// state: 'Ready',
// },
// },
// {
// name: 'pod-index',
// dimension: 1536,
// metric: 'cosine',
// host: 'pod-index-4zo0ijk.svc.us-west2-aws.pinecone.io',
// deletionProtection: 'disabled',
// spec: {
// pod: {
// environment: 'us-west2-aws',
// replicas: 1,
// shards: 1,
// podType: 'p1.x1',
// pods: 1,
// },
// },
// status: {
// ready: true,
// state: 'Ready',
// },
// },
// ],
// } Примечание
Индексы без серверов и стартуров не поддерживают коллекции.
Коллекция представляет собой статическую копию индекса на основе POD, который может использоваться для создания резервных копий, создания копий индексов или для выполнения экспериментов с различными конфигурациями индекса. Чтобы узнать больше о коллекциях Pinecone, см. Понимание коллекций.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createCollection ( {
name : 'collection-name' ,
source : 'index-name' ,
} ) ; Этот вызов API должен быстро вернуться, но создание коллекции может занять от нескольких минут до часов в зависимости от размера индекса источника и конфигурации индекса. Используйте describeCollection , чтобы проверить статус коллекции.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . deleteCollection ( 'collection-name' ) ; Вы можете использовать listCollections , чтобы подтвердить удаление.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const describeCollection = await pc . describeCollection ( 'collection3' ) ;
// {
// name: 'collection3',
// size: 3126700,
// status: 'Ready',
// dimension: 3,
// vectorCount: 1234,
// environment: 'us-east1-gcp',
// } Команда listCollections возвращает объект с массивом моделей сбора под collections .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const list = await pc . listCollections ( ) ;
// {
// collections: [
// {
// name: 'collection1',
// size: 3089687,
// status: 'Ready',
// dimension: 3,
// vectorCount: 17378,
// environment: 'us-west1-gcp',
// },
// {
// name: 'collection2',
// size: 208309,
// status: 'Ready',
// dimension: 3,
// vectorCount: 1000,
// environment: 'us-east4-gcp',
// },
// ];
// } Pinecone Indexes Поддерживает операции для работы с векторными данными с использованием таких операций, как Upsert, запрос, выброс и удаление.
Чтобы выполнить операции данных по индексу, вы нацелены на них, используя метод index .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'test-index' ) ;
// Now perform index operations
await index . fetch ( [ '1' ] ) ; Первый аргумент - это имя индекса, на который вы нацелены. Есть дополнительный второй аргумент для предоставления переопределения индекса хоста. Предоставление этого второго аргумента позволяет обойти поведение по умолчанию SDK по разрешению вашего хоста индекса с помощью указанного имени индекса. Вы можете найти свой индексный хост в консоли Pinecone или с помощью операций describeIndex или listIndexes .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'test-index' , 'my-index-host-1532-svc.io' ) ;
// Now perform index operations against: https://my-index-host-1532-svc.io
await index . fetch ( [ '1' ] ) ; Если вы храните метаданные наряду со своими векторными значениями, вы можете перенести параметр типа в index() чтобы получить правильную типографию Typechecking.
import { Pinecone , PineconeRecord } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
type MovieMetadata = {
title : string ,
runtime : number ,
genre : 'comedy' | 'horror' | 'drama' | 'action'
}
// Specify a custom metadata type while targeting the index
const index = pc . index < MovieMetadata > ( 'test-index' ) ;
// Now you get type errors if upserting malformed metadata
await index . upsert ( [ {
id : '1234' ,
values : [
... . // embedding values
] ,
metadata : {
genre : 'Gone with the Wind' ,
runtime : 238 ,
genre : 'drama' ,
// @ts-expect-error because category property not in MovieMetadata
category : 'classic'
}
} ] )
const results = await index . query ( {
vector : [
... // query embedding
] ,
filter : { genre : { '$eq' : 'drama' } }
} )
const movie = results . matches [ 0 ] ;
if ( movie . metadata ) {
// Since we passed the MovieMetadata type parameter above,
// we can interact with metadata fields without having to
// do any typecasting.
const { title , runtime , genre } = movie . metadata ;
console . log ( `The best match in drama was ${ title } ` )
} По умолчанию все операции данных происходят в пространстве имен по умолчанию '' . Если вы работаете с другими пространствами имен, не являющихся деко, вы можете ориентироваться на пространство имен, прицепив вызов в namespace() .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'test-index' ) . namespace ( 'ns1' ) ;
// Now perform index operations in the targeted index and namespace
await index . fetch ( [ '1' ] ) ;См. Используйте пространства имен для получения дополнительной информации.
Pinecone ожидает записи, вставленных в индексы, чтобы иметь следующую форму:
type PineconeRecord = {
id : string ;
values : Array < number > ;
sparseValues ?: Array < number > ;
metadata ?: object ;
} ;Чтобы поднять некоторые векторы, вы можете использовать клиента так:
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
// Target an index
const index = pc . index ( 'sample-index' ) ;
// Prepare your data. The length of each array
// of vector values must match the dimension of
// the index where you plan to store them.
const vectors = [
{
id : '1' ,
values : [ 0.236 , 0.971 , 0.559 ] ,
sparseValues : { indices : [ 0 , 1 ] , values : [ 0.236 , 0.34 ] } , // Optional; for hybrid search
} ,
{
id : '2' ,
values : [ 0.685 , 0.111 , 0.857 ] ,
sparseValues : { indices : [ 0 , 1 ] , values : [ 0.345 , 0.98 ] } , // Optional; for hybrid search
} ,
] ;
// Upsert the data into your index
await index . upsert ( vectors ) ; Теперь вы можете импортировать векторы в массовом порядке из хранилища объектов. Import -это долгосрочная, асинхронная операция, которая импортирует большое количество записей в индекс без сервера.
Чтобы импортировать векторы из хранилища объектов, они должны храниться в паркете и придерживаться необходимого формата файла. Ваше хранилище объекта также должно придерживаться необходимой структуры каталога.
Следующий пример импортирует векторы из ведра Amazon S3 в индекс без сервера.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const indexName = 'sample-index' ;
await pc . createIndex ( {
name : indexName ,
dimension : 10 ,
spec : {
serverless : {
cloud : 'aws' ,
region : 'eu-west-1' ,
} ,
} ,
} ) ;
const index = pc . Index ( indexName ) ;
const storageURI = 's3://my-bucket/my-directory/' ;
await index . startImport ( storageURI , 'continue' ) ; // "Continue" will avoid aborting the operation if errors are encountered.
// {
// "id": "import-id"
// }Вы можете запустить, отменить и проверить статус всех или одной операции импорта.
Примечания:
Import работает только с индексами без серверовImport публичный предварительный просмотр При экспериментах с операциями данных иногда полезно узнать, сколько записей/векторов хранятся в каждом пространстве имен. В этом случае нацелены на индекс и используйте команду describeIndexStats() .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'example-index' ) ;
await index . describeIndexStats ( ) ;
// {
// namespaces: {
// '': { recordCount: 10 }
// foo: { recordCount: 2000 },
// bar: { recordCount: 2000 }
// },
// dimension: 1536,
// indexFullness: 0,
// totalRecordCount: 4010
// }Метод запроса принимает большое количество вариантов. Размер вектора запроса должен соответствовать размеру вашего индекса.
type QueryOptions = {
topK : number ; // number of results desired
vector ?: Array < number > ; // must match dimension of index
sparseVector ?: {
indices : Array < integer > ; // indices must fall within index dimension
values : Array < number > ; // indices and values arrays must have same length
} ;
id ?: string ;
includeMetadata : boolean ;
includeValues : boolean ;
} ; Например, для запроса векторными значениями вы передадите vector параметр в конфигурации параметров. Ради краткости этот примерный вектор запроса крошечный (измерение 2), но в более реалистичном варианте использования этот вектор запроса будет внедрением, выведенным моделью. Посмотрите на пример кода, чтобы увидеть более реалистичные примеры того, как использовать query .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
await index . query ( { topK : 3 , vector : [ 0.22 , 0.66 ] } ) ;
// {
// matches: [
// {
// id: '556',
// score: 1.00000012,
// values: [],
// sparseValues: undefined,
// metadata: undefined
// },
// {
// id: '137',
// score: 1.00000012,
// values: [],
// sparseValues: undefined,
// metadata: undefined
// },
// {
// id: '129',
// score: 1.00000012,
// values: [],
// sparseValues: undefined,
// metadata: undefined
// }
// ],
// namespace: '',
// usage: {
// readUnits: 5
// }
// } Вы включаете варианты includeMetadata: true или includeValues: true если вам нужна эта информация. По умолчанию они не возвращаются, чтобы сохранить полезную нагрузку.
Помните, что операции данных происходят в контексте namespace , поэтому, если вы работаете с пространствами имен и не видите ожидаемых результатов, вы должны проверить, что вы нацелены на правильное пространство имен с помощью вашего запроса.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
// Target the index and namespace
const index = pc . index ( 'my-index' ) . namespace ( 'my-namespace' ) ;
const results = await index . query ( { topK : 3 , vector : [ 0.22 , 0.66 ] } ) ; Вы можете запросить, используя векторные значения существующей записи в индексе, передавая идентификатор записи. Обратите внимание, что запись с указанным идентификатором может быть в ответе этой операции.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
const results = await index . query ( { topK : 10 , id : '1' } ) ; Если вы работаете с редкими векторами, вы можете добавить редкие значения векторов для выполнения гибридного поиска.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
await pc . createIndex ( {
name : 'hybrid-search-index' ,
metric : 'dotproduct' , // Note: dot product is the only distance metric supported for hybrid search
dimension : 2 ,
spec : {
pod : {
environment : 'us-west4-gcp' ,
podType : 'p2.x1' ,
} ,
} ,
waitUntilReady : true ,
} ) ;
const index = pc . index ( 'hybrid-search-index' ) ;
const hybridRecords = [
{
id : '1' ,
values : [ 0.236 , 0.971 ] , // dense vectors
sparseValues : { indices : [ 0 , 1 ] , values : [ 0.236 , 0.34 ] } , // sparse vectors
} ,
{
id : '2' ,
values : [ 0.685 , 0.111 ] ,
sparseValues : { indices : [ 0 , 1 ] , values : [ 0.887 , 0.243 ] } ,
} ,
] ;
await index . upsert ( hybridRecords ) ;
const query = 'What is the most popular red dress?' ;
// ... send query to dense vector embedding model and save those values in `denseQueryVector`
// ... send query to sparse vector embedding model and save those values in `sparseQueryVector`
const denseQueryVector = [ 0.236 , 0.971 ] ;
const sparseQueryVector = { indices : [ 0 , 1 ] , values : [ 0.0 , 0.34 ] } ;
// Execute a hybrid search
await index . query ( {
topK : 3 ,
vector : denseQueryVector ,
sparseVector : sparseQueryVector ,
} ) ; Возможно, вы захотите обновить values вектора, sparseValues или metadata . Укажите идентификатор и значение атрибута, которое вы хотите обновить.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'imdb-movies' ) ;
await index . update ( {
id : '18593' ,
metadata : { genre : 'romance' } ,
} ) ; Метод listPaginated можно использовать для перечисления идентификаторов записей, соответствующих конкретному префиксу идентификатора в страничном формате. С помощью умного назначения идентификаторов записей это может использоваться, чтобы помочь моделировать иерархические отношения между различными записями, такими как когда существуют встраиваемые для нескольких кусков или фрагментов, связанных с одним и тем же документом.
Примечания:
prefix , префикс по умолчанию - это пустая строка, которая возвращает все векторные идентификаторы в вашем индексе100 векторных идентификаторов, если не указано limit . Следовательно, если в вашем индексе содержится менее 100 векторных идентификаторов, и вы limit prefix ваша paginationToken будет undefined В следующем примере показано, как извлекать обе страницы векторных идентификаторов для векторов, чьи идентификаторы содержат префикс doc1# , предполагая limit из 3 и документа doc1 , которое сочетается в 4 вектора.
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) . namespace ( 'my-namespace' ) ;
// Fetch the 1st 3 vector IDs matching prefix 'doc1#'
const results = await index . listPaginated ( { limit : 3 , prefix : 'doc1#' } ) ;
console . log ( results ) ;
// {
// vectors: [
// { id: 'doc1#01' }
// { id: 'doc1#02' }
// { id: 'doc1#03' }
// ...
// ],
// pagination: {
// next: 'eyJza2lwX3Bhc3QiOiJwcmVUZXN0LS04MCIsInByZWZpeCI6InByZVRlc3QifQ=='
// },
// namespace: 'my-namespace',
// usage: { readUnits: 1 }
// }
// Fetch the final vector ID matching prefix 'doc1#' using the paginationToken returned by the previous call
const nextResults = await index . listPaginated ( {
prefix : 'doc1#' ,
paginationToken : results . pagination ?. next ,
} ) ;
console . log ( nextResults ) ;
// {
// vectors: [
// { id: 'doc1#04' }
// ],
// pagination: undefined,
// namespace: 'my-namespace',
// usage: { readUnits: 1 }
// } import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
const fetchResult = await index . fetch ( [ 'id-1' , 'id-2' ] ) ; Для удобства есть несколько методов, связанных с удалением. Вы можете проверить результаты операции удаления, пытаясь fetch() запись или посмотрев на резюме индекса с describeIndexStats()
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
await index . deleteOne ( 'id-to-delete' ) ; import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
await index . deleteMany ( [ 'id-1' , 'id-2' , 'id-3' ] ) ;ПРИМЕЧАНИЕ. Удаление с помощью фильтра метаданных применяется только к индексам на основе POD.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'albums-database' ) ;
await index . deleteMany ( { genre : 'rock' } ) ; ПРИМЕЧАНИЕ
Индексы в среде GCP-Starter не поддерживают пространства имен.
Чтобы все, чтобы все в целевом пространстве имен используйте метод deleteAll .
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const index = pc . index ( 'my-index' ) ;
await index . namespace ( 'foo-namespace' ) . deleteAll ( ) ; Если вы не указаете пространство имен, записи в пространстве '' по умолчанию будут удалены.
Взаимодействуйте с API вывода Pinecone (в настоящее время в публичном предварительном просмотре). API API Sinecone Soince - это услуга, которая дает вам доступ к моделям локаций, размещенных в инфраструктуре Pinecone.
Примечания:
Поддерживаемые модели:
Отправьте текст в API вывода Pinecone для генерации встроенных поступков для документов и запросов.
import { Pinecone } from '@pinecone-database/pinecone' ;
const client = new Pinecone ( { apiKey : '<Your API key from app.pinecone.io>' } ) ;
const embeddingModel = 'multilingual-e5-large' ;
const documents = [
'Turkey is a classic meat to eat at American Thanksgiving.' ,
'Many people enjoy the beautiful mosques in Turkey.' ,
] ;
const docParameters = {
inputType : 'passage' ,
truncate : 'END' ,
} ;
async function generateDocEmbeddings ( ) {
try {
return await client . inference . embed (
embeddingModel ,
documents ,
docParameters
) ;
} catch ( error ) {
console . error ( 'Error generating embeddings:' , error ) ;
}
}
generateDocEmbeddings ( ) . then ( ( embeddingsResponse ) => {
if ( embeddingsResponse ) {
console . log ( embeddingsResponse ) ;
}
} ) ;
// << Upsert documents into Pinecone >>
const userQuery = [ 'How should I prepare my turkey?' ] ;
const queryParameters = {
inputType : 'query' ,
truncate : 'END' ,
} ;
async function generateQueryEmbeddings ( ) {
try {
return await client . inference . embed (
embeddingModel ,
userQuery ,
queryParameters
) ;
} catch ( error ) {
console . error ( 'Error generating embeddings:' , error ) ;
}
}
generateQueryEmbeddings ( ) . then ( ( embeddingsResponse ) => {
if ( embeddingsResponse ) {
console . log ( embeddingsResponse ) ;
}
} ) ;
// << Send query to Pinecone to retrieve similar documents >> Рэранки документы в сплоченном порядке по сравнению с запросом.
Примечание. score представляет собой абсолютную меру актуальности данной пары запросов и проходов. Нормализованный между [0, 1], score представляет, насколько тесно уместным является конкретный элемент и запрос, с оценками ближе к 1, что указывает на более высокую актуальность.
import { Pinecone } from '@pinecone-database/pinecone' ;
const pc = new Pinecone ( ) ;
const rerankingModel = 'bge-reranker-v2-m3' ;
const myQuery = 'What are some good Turkey dishes for Thanksgiving?' ;
// Option 1: Documents as an array of strings
const myDocsStrings = [
'I love turkey sandwiches with pastrami' ,
'A lemon brined Turkey with apple sausage stuffing is a classic Thanksgiving main' ,
'My favorite Thanksgiving dish is pumpkin pie' ,
'Turkey is a great source of protein' ,
] ;
// Option 1 response
const response = await pc . inference . rerank (
rerankingModel ,
myQuery ,
myDocsStrings
) ;
console . log ( response ) ;
// {
// model: 'bge-reranker-v2-m3',
// data: [
// { index: 1, score: 0.5633179, document: [Object] },
// { index: 2, score: 0.02013874, document: [Object] },
// { index: 3, score: 0.00035419367, document: [Object] },
// { index: 0, score: 0.00021485926, document: [Object] }
// ],
// usage: { rerankUnits: 1 }
// }
// Option 2: Documents as an array of objects
const myDocsObjs = [
{
title : 'Turkey Sandwiches' ,
body : 'I love turkey sandwiches with pastrami' ,
} ,
{
title : 'Lemon Turkey' ,
body : 'A lemon brined Turkey with apple sausage stuffing is a classic Thanksgiving main' ,
} ,
{
title : 'Thanksgiving' ,
body : 'My favorite Thanksgiving dish is pumpkin pie' ,
} ,
{
title : 'Protein Sources' ,
body : 'Turkey is a great source of protein' ,
} ,
] ;
// Option 2: Options object declaring which custom key to rerank on
// Note: If no custom key is passed via `rankFields`, each doc must contain a `text` key, and that will act as the default)
const rerankOptions = {
topN : 3 ,
returnDocuments : false ,
rankFields : [ 'body' ] ,
parameters : {
inputType : 'passage' ,
truncate : 'END' ,
} ,
} ;
// Option 2 response
const response = await pc . inference . rerank (
rerankingModel ,
myQuery ,
myDocsObjs ,
rerankOptions
) ;
console . log ( response ) ;
// {
// model: 'bge-reranker-v2-m3',
// data: [
// { index: 1, score: 0.5633179, document: undefined },
// { index: 2, score: 0.02013874, document: undefined },
// { index: 3, score: 0.00035419367, document: undefined },
// ],
// usage: { rerankUnits: 1 }
//} Все тестирование проходит автоматически в CI и настраивается с использованием действий GitHub и рабочих процессов, расположенных в каталоге .github этого репо.
См. Appling.md для получения дополнительной информации.