> Discover all available pages from the documentation index: https://mastra.zisheng.pro/zh-HK/llms.txt # 文件分塊及嵌入 處理前,先從內容建立 MDocument 實例。你可以使用不同格式初始化: ```ts const docFromText = MDocument.fromText('Your plain text content...') const docFromHTML = MDocument.fromHTML('Your HTML content...') 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` 策略的範例: ```ts const chunks = await doc.chunk({ strategy: 'recursive', maxSize: 512, overlap: 50, separators: ['\n'], extract: { metadata: true, // Optionally extract metadata }, }) ``` 如需保留文字的句子結構,可按以下範例使用 `sentence` 策略: ```ts const chunks = await doc.chunk({ strategy: 'sentence', maxSize: 450, minSize: 50, overlap: 0, sentenceEnders: ['.'], }) ``` 如需保留 Markdown 文件各段落之間的語意關係,可按以下範例使用 `semantic-markdown` 策略: ```ts const chunks = await doc.chunk({ strategy: 'semantic-markdown', joinThreshold: 500, modelName: 'gpt-3.5-turbo', }) ``` > **備註:** 擷取中繼資料可能會呼叫 LLM,因此請確保已設定 API 金鑰。 如需深入了解分塊策略,請參閱 [`chunk()` 參考文件](https://mastra.zisheng.pro/zh-HK/reference/rag/chunk)。 ## 產生嵌入向量 使用你偏好的 Provider 將區塊轉換成嵌入向量。Mastra 透過 model router 支援嵌入模型。 ### 使用 Model Router 最簡單的方法是透過 Mastra model router 使用 `provider/model` 字串: ```ts 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 嵌入模型。完整支援清單請參閱[嵌入向量參考文件](https://mastra.zisheng.pro/zh-HK/reference/rag/embeddings)。 Model router 會自動從環境變數偵測 API 金鑰。 嵌入函式會傳回向量,也就是代表文字語意的數字陣列,可直接在向量資料庫中進行相似度搜尋。 ### 設定嵌入向量維度 嵌入模型通常輸出固定維度的向量(例如 OpenAI 的 `text-embedding-3-small` 為 1536 維)。 部分模型支援降低維度,有助於: - 減少向量資料庫的儲存空間需求 - 降低相似度搜尋的運算成本 以下是部分支援的模型: OpenAI(text-embedding-3 模型): ```ts 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): ```ts const { embeddings } = await embedMany({ model: google('gemini-embedding-001', { outputDimensionality: 256, // Truncates excessive values from the end }), values: chunks.map(chunk => chunk.text), }) ``` > **向量資料庫兼容性:** 儲存嵌入向量時,向量資料庫索引的設定必須與嵌入模型的輸出大小相符。維度不符可能導致錯誤或資料損壞。 ## 範例:完整流程 以下範例示範如何使用兩個 Provider 處理文件及產生嵌入向量: ```ts 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, }) ``` 如需更多分塊策略及嵌入設定範例,請參閱: - [分塊參考文件](https://mastra.zisheng.pro/zh-HK/reference/rag/chunk) - [嵌入向量參考文件](https://mastra.zisheng.pro/zh-HK/reference/rag/embeddings) 如需向量資料庫及嵌入向量的詳情,請參閱: - [向量資料庫](https://mastra.zisheng.pro/zh-HK/guides/rag/vector-databases) - [嵌入 API 參考文件](https://mastra.zisheng.pro/zh-HK/reference/rag/embeddings)