Upstash 向量儲存
UpstashVector 類別使用 Upstash Vector 提供向量搜尋。Upstash Vector 是無伺服器向量資料庫服務,支援具備元資料篩選功能的向量相似度搜尋及混合搜尋。
建構函式選項建構函式選項 的直接連結
url:
string
Upstash Vector 資料庫 URL
token:
string
Upstash Vector API token。
方法方法 的直接連結
createIndex()createindex 的直接連結
注意:Upstash 會自動建立索引,因此此方法不會執行任何操作。
indexName:
string
要建立的索引名稱
dimension:
number
向量維度(必須與 embedding 模型相符)
metric?:
'cosine' | 'euclidean' | 'dotproduct'
= cosine
相似度搜尋所用的距離度量
upsert()upsert 的直接連結
indexName:
string
要 upsert 至的索引名稱
vectors:
number[][]
embedding 向量陣列
sparseVectors?:
{ indices: number[], values: number[] }[]
用於混合搜尋的稀疏向量陣列。每個稀疏向量的 indices 與 values 陣列必須互相對應。
metadata?:
Record<string, any>[]
每個向量的元資料
ids?:
string[]
可選的向量 ID(如未提供則自動產生)
query()query 的直接連結
indexName:
string
要查詢的索引名稱
queryVector:
number[]
用來尋找相似向量的查詢向量
sparseVector?:
{ indices: number[], values: number[] }
用於混合搜尋的可選稀疏向量。其 indices 與 values 陣列必須互相對應。
topK?:
number
= 10
要傳回的結果數目
filter?:
Record<string, any>
查詢所用的元資料篩選條件
includeVector?:
boolean
= false
結果中是否包含向量
fusionAlgorithm?:
FusionAlgorithm
在混合搜尋中用來合併密集與稀疏搜尋結果的演算法(例如 RRF,即倒數排名融合)
queryMode?:
QueryMode
搜尋模式:'DENSE' 只進行密集搜尋,'SPARSE' 只進行稀疏搜尋,'HYBRID' 則進行組合搜尋
listIndexes()listindexes 的直接連結
以字串陣列形式傳回索引名稱(命名空間)。
describeIndex()describeindex 的直接連結
indexName:
string
要描述的索引名稱
傳回:
interface IndexStats {
dimension: number
count: number
metric: 'cosine' | 'euclidean' | 'dotproduct'
}
deleteIndex()deleteindex 的直接連結
indexName:
string
要刪除的索引(命名空間)名稱
updateVector()updatevector 的直接連結
indexName:
string
要更新的索引名稱
id:
string
要更新項目的 ID
update:
object
包含向量、稀疏向量及/或元資料的更新物件
update 物件可包含以下屬性:
vector(可選):表示新密集向量的數值陣列。sparseVector(可選):用於混合索引,並包含indices及values陣列的稀疏向量物件。metadata(可選):元資料的鍵值配對記錄。
deleteVector()deletevector 的直接連結
indexName:
string
要從中刪除項目的索引名稱
id:
string
要刪除項目的 ID
嘗試按項目 ID 從指定索引中刪除項目。如刪除失敗,則記錄錯誤訊息。
混合向量搜尋混合向量搜尋 的直接連結
Upstash Vector 支援混合搜尋,結合語義搜尋(密集向量)與關鍵字搜尋(稀疏向量),以提高相關性及準確度。
基本混合搜尋用法基本混合搜尋用法 的直接連結
import { UpstashVector } from '@mastra/upstash'
const vectorStore = new UpstashVector({
id: 'upstash-vector',
url: process.env.UPSTASH_VECTOR_URL,
token: process.env.UPSTASH_VECTOR_TOKEN,
})
// Upsert vectors with both dense and sparse components
const denseVectors = [
[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6],
]
const sparseVectors = [
{ indices: [1, 5, 10], values: [0.8, 0.6, 0.4] },
{ indices: [2, 6, 11], values: [0.7, 0.5, 0.3] },
]
await vectorStore.upsert({
indexName: 'hybrid-index',
vectors: denseVectors,
sparseVectors: sparseVectors,
metadata: [{ title: 'Document 1' }, { title: 'Document 2' }],
})
// Query with hybrid search
const results = await vectorStore.query({
indexName: 'hybrid-index',
queryVector: [0.1, 0.2, 0.3],
sparseVector: { indices: [1, 5], values: [0.9, 0.7] },
topK: 10,
})
進階混合搜尋選項進階混合搜尋選項 的直接連結
import { FusionAlgorithm, QueryMode } from '@upstash/vector'
// Query with specific fusion algorithm
const fusionResults = await vectorStore.query({
indexName: 'hybrid-index',
queryVector: [0.1, 0.2, 0.3],
sparseVector: { indices: [1, 5], values: [0.9, 0.7] },
fusionAlgorithm: FusionAlgorithm.RRF,
topK: 10,
})
// Dense-only search
const denseResults = await vectorStore.query({
indexName: 'hybrid-index',
queryVector: [0.1, 0.2, 0.3],
queryMode: QueryMode.DENSE,
topK: 10,
})
// Sparse-only search
const sparseResults = await vectorStore.query({
indexName: 'hybrid-index',
queryVector: [0.1, 0.2, 0.3], // Still required for index structure
sparseVector: { indices: [1, 5], values: [0.9, 0.7] },
queryMode: QueryMode.SPARSE,
topK: 10,
})
更新混合向量更新混合向量 的直接連結
// Update both dense and sparse components
await vectorStore.updateVector({
indexName: 'hybrid-index',
id: 'vector-id',
update: {
vector: [0.2, 0.3, 0.4],
sparseVector: { indices: [2, 7, 12], values: [0.9, 0.8, 0.6] },
metadata: { title: 'Updated Document' },
},
})
回應類型回應類型 的直接連結
查詢結果會以下列格式傳回:
interface QueryResult {
id: string
score: number
metadata: Record<string, any>
vector?: number[] // Only included if includeVector is true
}
錯誤處理錯誤處理 的直接連結
此儲存會擲出可被捕捉的具型別錯誤:
try {
await store.query({
indexName: 'index_name',
queryVector: queryVector,
})
} catch (error) {
if (error instanceof VectorStoreError) {
console.log(error.code) // 'connection_failed' | 'invalid_dimension' | etc
console.log(error.details) // Additional error context
}
}
環境變數環境變數 的直接連結
必要的環境變數:
UPSTASH_VECTOR_URL:你的 Upstash Vector 資料庫 URLUPSTASH_VECTOR_TOKEN:你的 Upstash Vector API token
使用範例使用範例 的直接連結
使用 fastembed 的本機 embedding使用 fastembed 的本機 embedding 的直接連結
Embedding 是 Memory 的 semanticRecall 所使用的數值向量,可按語義(而非關鍵字)擷取相關訊息。此設定使用 @mastra/fastembed 產生向量 embedding。
安裝 fastembed 以開始使用:
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/fastembed@latest
pnpm add @mastra/fastembed@latest
yarn add @mastra/fastembed@latest
bun add @mastra/fastembed@latest
將以下內容加入你的 Agent:
src/mastra/agents/example-upstash-agent.ts
import { Memory } from '@mastra/memory'
import { Agent } from '@mastra/core/agent'
import { UpstashStore, UpstashVector } from '@mastra/upstash'
import { fastembed } from '@mastra/fastembed'
export const upstashAgent = new Agent({
id: 'upstash-agent',
name: 'Upstash Agent',
instructions:
'You are an AI agent with the ability to automatically recall memories from previous interactions.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({
storage: new UpstashStore({
id: 'upstash-agent-storage',
url: process.env.UPSTASH_REDIS_REST_URL!,
token: process.env.UPSTASH_REDIS_REST_TOKEN!,
}),
vector: new UpstashVector({
id: 'upstash-agent-vector',
url: process.env.UPSTASH_VECTOR_REST_URL!,
token: process.env.UPSTASH_VECTOR_REST_TOKEN!,
}),
embedder: fastembed,
options: {
lastMessages: 10,
semanticRecall: {
topK: 3,
messageRange: 2,
},
},
}),
})