文件分塊及嵌入
處理前,先從內容建立 MDocument 實例。你可以使用不同格式初始化:
const docFromText = MDocument.fromText('Your plain text content...')
const docFromHTML = MDocument.fromHTML('<html>Your HTML content...</html>')
const docFromMarkdown = MDocument.fromMarkdown('# Your Markdown content...')
const docFromJSON = MDocument.fromJSON(`{ "key": "value" }`)
文件處理文件處理 的直接連結
使用 chunk 將文件分成易於處理的區塊。Mastra 支援多種針對不同文件類型最佳化的分塊策略:
recursive:根據內容結構智能分割character:按字元簡單分割token:按 token 分割markdown:按 Markdown 結構分割semantic-markdown:根據相關標題群組分割 Markdownhtml:按 HTML 結構分割json:按 JSON 結構分割latex:按 LaTeX 結構分割sentence:按句子分割
每種策略接受的參數各有不同,並針對其分塊方式最佳化。
以下是使用 recursive 策略的範例:
const chunks = await doc.chunk({
strategy: 'recursive',
maxSize: 512,
overlap: 50,
separators: ['\n'],
extract: {
metadata: true, // Optionally extract metadata
},
})
如需保留文字的句子結構,可按以下範例使用 sentence 策略:
const chunks = await doc.chunk({
strategy: 'sentence',
maxSize: 450,
minSize: 50,
overlap: 0,
sentenceEnders: ['.'],
})
如需保留 Markdown 文件各段落之間的語意關係,可按以下範例使用 semantic-markdown 策略:
const chunks = await doc.chunk({
strategy: 'semantic-markdown',
joinThreshold: 500,
modelName: 'gpt-3.5-turbo',
})
擷取中繼資料可能會呼叫 LLM,因此請確保已設定 API 金鑰。
如需深入了解分塊策略,請參閱 chunk() 參考文件。
產生嵌入向量產生嵌入向量 的直接連結
使用你偏好的 Provider 將區塊轉換成嵌入向量。Mastra 透過 model router 支援嵌入模型。
使用 Model Router使用 Model Router 的直接連結
最簡單的方法是透過 Mastra model router 使用 provider/model 字串:
import { ModelRouterEmbeddingModel } from '@mastra/core/llm'
import { embedMany } from 'ai'
const { embeddings } = await embedMany({
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
values: chunks.map(chunk => chunk.text),
})
Mastra 支援 OpenAI 及 Google 嵌入模型。完整支援清單請參閱嵌入向量參考文件。
Model router 會自動從環境變數偵測 API 金鑰。
嵌入函式會傳回向量,也就是代表文字語意的數字陣列,可直接在向量資料庫中進行相似度搜尋。
設定嵌入向量維度設定嵌入向量維度 的直接連結
嵌入模型通常輸出固定維度的向量(例如 OpenAI 的 text-embedding-3-small 為 1536 維)。
部分模型支援降低維度,有助於:
- 減少向量資料庫的儲存空間需求
- 降低相似度搜尋的運算成本
以下是部分支援的模型:
OpenAI(text-embedding-3 模型):
import { ModelRouterEmbeddingModel } from '@mastra/core/llm'
const { embeddings } = await embedMany({
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
options: {
dimensions: 256, // Only supported in text-embedding-3 and later
},
values: chunks.map(chunk => chunk.text),
})
Google(text-embedding-001):
const { embeddings } = await embedMany({
model: google('gemini-embedding-001', {
outputDimensionality: 256, // Truncates excessive values from the end
}),
values: chunks.map(chunk => chunk.text),
})
儲存嵌入向量時,向量資料庫索引的設定必須與嵌入模型的輸出大小相符。維度不符可能導致錯誤或資料損壞。
範例:完整流程範例:完整流程 的直接連結
以下範例示範如何使用兩個 Provider 處理文件及產生嵌入向量:
import { embedMany } from 'ai'
import { MDocument } from '@mastra/rag'
// Initialize document
const doc = MDocument.fromText(`
Climate change poses significant challenges to global agriculture.
Rising temperatures and changing precipitation patterns affect crop yields.
`)
// Create chunks
const chunks = await doc.chunk({
strategy: 'recursive',
maxSize: 256,
overlap: 50,
})
// Generate embeddings with OpenAI
import { ModelRouterEmbeddingModel } from '@mastra/core/llm'
const { embeddings } = await embedMany({
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
values: chunks.map(chunk => chunk.text),
})
// OR
// Generate embeddings with Cohere
const { embeddings } = await embedMany({
model: 'cohere/embed-english-v3.0',
values: chunks.map(chunk => chunk.text),
})
// Store embeddings in your vector database
await vectorStore.upsert({
indexName: 'embeddings',
vectors: embeddings,
})
如需更多分塊策略及嵌入設定範例,請參閱:
如需向量資料庫及嵌入向量的詳情,請參閱: