文件分塊與嵌入
處理之前,請先使用內容建立 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',
})
擷取 metadata 可能會呼叫 LLM,因此請確認已設定 API 金鑰。
如需深入了解分塊策略,請參閱 chunk() 參考文件。
產生嵌入向量「產生嵌入向量」的直接連結
使用你偏好的 Provider 將片段轉換成嵌入向量。Mastra 透過模型路由器支援嵌入模型。
使用模型路由器「使用模型路由器」的直接連結
最簡單的方式是搭配 provider/model 字串使用 Mastra 模型路由器:
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 的嵌入模型。完整的支援模型清單請參閱嵌入參考文件。
模型路由器會自動從環境變數偵測 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,
})
如需其他分塊策略與嵌入設定範例,請參閱:
如需向量資料庫與嵌入的詳細資訊,請參閱: