본문으로 건너뛰기

문서 청킹 및 임베딩

처리하기 전에 콘텐츠에서 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: 토큰 인식 분할
  • markdown: 마크다운 인식 분할
  • semantic-markdown: 관련 헤더 패밀리를 기반으로 한 마크다운 분할
  • html: HTML 구조 인식 분할
  • json: JSON 구조 인식 분할
  • latex: LaTeX 구조 인식 분할
  • sentence: 문장 인식 분할

:::참고 각 전략은 청킹 접근 방식에 최적화된 다양한 매개변수를 허용합니다. :::

다음은 사용 방법의 예입니다.recursive strategy:

const chunks = await doc.chunk({
strategy: 'recursive',
maxSize: 512,
overlap: 50,
separators: ['\n'],
extract: {
metadata: true, // Optionally extract metadata
},
})

문장 구조를 유지하는 것이 중요한 텍스트의 경우 다음은sentence strategy:

const chunks = await doc.chunk({
strategy: 'sentence',
maxSize: 450,
minSize: 50,
overlap: 0,
sentenceEnders: ['.'],
})

섹션 간의 의미 관계를 유지하는 것이 중요한 마크다운 문서의 경우 다음은 사용 방법에 대한 예입니다.semantic-markdown strategy:

const chunks = await doc.chunk({
strategy: 'semantic-markdown',
joinThreshold: 500,
modelName: 'gpt-3.5-turbo',
})

:::참고 메타데이터 추출은 LLM 호출을 사용할 수 있으므로 API 키가 설정되어 있는지 확인하세요. :::

우리는 청크 전략에 대해 더 자세히 설명합니다.chunk() reference documentation.

임베딩 생성
임베딩 생성에 대한 직접 링크

선호하는 공급자를 사용하여 청크를 임베딩으로 변환합니다. Mastra는 Model 라우터를 통해 Model 임베딩을 지원합니다.

Model 라우터 사용
Model 라우터 사용에 대한 직접 링크

가장 간단한 방법은 Mastra의 Model 라우터를 사용하는 것입니다.provider/model strings:

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을 지원합니다. 지원되는 임베딩 Model의 전체 목록은 다음을 참조하세요.embeddings reference.

Model 라우터는 환경 변수에서 API 키 감지를 자동으로 처리합니다.

임베딩 함수는 텍스트의 의미론적 의미를 나타내는 숫자 배열인 벡터를 반환하며, 벡터 데이터베이스에서 유사성 검색이 가능합니다.

포함 차원 구성
포함 차원 구성에 대한 직접 링크

임베딩 Model은 일반적으로 고정된 차원 수(예: OpenAI의 text-embedding-3-small은 1536)로 벡터를 출력합니다. 일부 Model은 이 차원 수를 줄이는 기능을 지원하며, 이를 통해 다음과 같은 이점을 얻을 수 있습니다.

  • 벡터 데이터베이스의 저장 요구 사항 감소
  • 유사성 검색을 위한 계산 비용 절감

지원되는 Model은 다음과 같습니다.

OpenAI(텍스트 임베딩-3 Model):

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(텍스트 삽입-001):

const { embeddings } = await embedMany({
model: google('gemini-embedding-001', {
outputDimensionality: 256, // Truncates excessive values from the end
}),
values: chunks.map(chunk => chunk.text),
})

:::중요[벡터 데이터베이스 호환성] 임베딩을 저장할 때 임베딩 Model의 출력 크기와 일치하도록 벡터 데이터베이스 인덱스를 구성해야 합니다. 크기가 일치하지 않으면 오류가 발생하거나 데이터가 손상될 수 있습니다. :::

예: 파이프라인 완료
예: 파이프라인 완료에 대한 직접 링크

다음은 두 공급자를 모두 사용한 문서 처리 및 삽입 생성을 보여주는 예입니다.

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,
})

다양한 청킹 전략 및 임베딩 구성에 대한 추가 예는 다음을 참조하세요.

벡터 데이터베이스 및 임베딩에 대한 자세한 내용은 다음을 참조하세요.