跳至主要內容

文件分塊及嵌入

處理前,先從內容建立 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:根據相關標題群組分割 Markdown
  • html:按 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,
})

如需更多分塊策略及嵌入設定範例,請參閱:

如需向量資料庫及嵌入向量的詳情,請參閱: