> Discover all available pages from the documentation index: https://mastra.zisheng.pro/zh-TW/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', }) ``` > **備註:** 擷取 metadata 可能會呼叫 LLM,因此請確認已設定 API 金鑰。 如需深入了解分塊策略,請參閱 [`chunk()` 參考文件](https://mastra.zisheng.pro/zh-TW/reference/rag/chunk)。 ## 產生嵌入向量 使用你偏好的 Provider 將片段轉換成嵌入向量。Mastra 透過模型路由器支援嵌入模型。 ### 使用模型路由器 最簡單的方式是搭配 `provider/model` 字串使用 Mastra 模型路由器: ```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-TW/reference/rag/embeddings)。 模型路由器會自動從環境變數偵測 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-TW/reference/rag/chunk) - [嵌入參考文件](https://mastra.zisheng.pro/zh-TW/reference/rag/embeddings) 如需向量資料庫與嵌入的詳細資訊,請參閱: - [向量資料庫](https://mastra.zisheng.pro/zh-TW/guides/rag/vector-databases) - [嵌入 API 參考文件](https://mastra.zisheng.pro/zh-TW/reference/rag/embeddings)