본문으로 건너뛰기

RAG로 연구 논문 도우미 구축

이 가이드에서는 RAG(Retrieval Augmented Generation)를 사용하여 학술 논문을 분석하고 콘텐츠에 대한 특정 질문에 답할 수 있는 AI 연구 보조자를 만듭니다.

원본 Transformer 논문 "Attention Is All You Need"를 예제로 사용합니다. 데이터베이스로는 로컬 libSQL 데이터베이스를 사용합니다.

사전 요구 사항
사전 요구 사항에 대한 직접 링크

  • Node.js v22.13.0 이상 설치
  • 지원되는 Model Provider의 API 키
  • 기존 Mastra 프로젝트(새 프로젝트를 설정하려면 설치 가이드를 따르세요)

RAG 작동 방식
RAG 작동 방식에 대한 직접 링크

RAG의 작동 방식과 각 구성 요소를 구현하는 방법을 살펴보겠습니다.

지식 저장소/색인
지식 저장소/색인에 대한 직접 링크

  • 텍스트를 벡터 표현으로 변환
  • 콘텐츠의 수치 표현 생성
  • 구현: OpenAI의 text-embedding-3-small을 사용하여 임베딩을 생성하고 LibSQLVector에 저장합니다

리트리버
리트리버에 대한 직접 링크

  • 유사성 검색을 통해 관련 콘텐츠 찾기
  • 저장된 벡터와 일치하는 쿼리 임베딩
  • 구현: LibSQLVector를 사용하여 저장된 임베딩에 대한 유사성 검색을 수행합니다.

발전기
발전기에 대한 직접 링크

  • LLM을 사용하여 검색된 콘텐츠 처리
  • 상황에 맞는 응답 생성
  • 구현: OpenAI Model을 사용하여 검색된 콘텐츠를 기반으로 답변을 생성합니다.

구현 내용은 다음과 같습니다.

  1. Transformer Paper를 임베딩으로 처리
  2. 빠른 검색을 위해 LibSQLVector에 저장합니다.
  3. 유사성 검색을 사용하여 관련 섹션 찾기
  4. 검색된 컨텍스트를 사용하여 정확한 응답 생성

Agent 만들기
Agent 만들기에 대한 직접 링크

Agent의 동작을 정의하고 이를 Mastra 프로젝트에 연결한 후 벡터 저장소를 생성해 보겠습니다.

  1. 추가 종속성 설치

    설치 가이드를 따른 후 다음과 같은 추가 종속성을 설치해야 합니다.

    npm install @mastra/rag@latest ai
  2. 이제 RAG 지원 연구 조교를 생성하겠습니다. Agent는 다음을 사용합니다.

    • 벡터 저장소에서 의미론적 검색을 수행하여 논문의 관련 콘텐츠를 찾는 Vector Query Tool
    • 쿼리를 이해하고 응답을 생성하는 OpenAI Model
    • 논문을 분석하고, 검색된 콘텐츠를 효과적으로 사용하며, 한계를 인정하는 방법을 Agent에게 안내하는 사용자 지정 지침 새 파일 src/mastra/agents/researchAgent.ts를 만들고 Agent를 정의하세요.
    src/mastra/agents/researchAgent.ts
    import { Agent } from '@mastra/core/agent'
    import { ModelRouterEmbeddingModel } from '@mastra/core/llm'
    import { createVectorQueryTool } from '@mastra/rag'

    // Create a tool for semantic search over the paper embeddings
    const vectorQueryTool = createVectorQueryTool({
    vectorStoreName: 'libSqlVector',
    indexName: 'papers',
    model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
    })

    export const researchAgent = new Agent({
    id: 'research-agent',
    name: 'Research Assistant',
    instructions: `You are a helpful research assistant that analyzes academic papers and technical documents.
    Use the provided vector query tool to find relevant information from your knowledge base,
    and provide accurate, well-supported answers based on the retrieved content.
    Focus on the specific content available in the tool and acknowledge if you cannot find sufficient information to answer a question.
    Base your responses only on the content provided, not on general knowledge.`,
    model: 'openai/gpt-5.6-sol',
    tools: {
    vectorQueryTool,
    },
    })
  3. 프로젝트 루트에서 pwd 명령을 사용하여 절대 경로를 확인하세요. 경로는 다음과 비슷할 수 있습니다.

    > pwd
    /Users/your-name/guides/research-assistant

    src/mastra/index.ts 파일의 기존 내용과 구성에 다음을 추가하세요.

    src/mastra/index.ts
    import { Mastra } from '@mastra/core'
    import { LibSQLVector } from '@mastra/libsql'

    const libSqlVector = new LibSQLVector({
    id: 'research-vectors',
    url: 'file:/Users/your-name/guides/research-assistant/vector.db',
    })

    export const mastra = new Mastra({
    vectors: { libSqlVector },
    })

    url에는 pwd 명령으로 확인한 절대 경로를 사용하세요. 그러면 vector.db 파일이 프로젝트 루트에 생성됩니다.

    노트

    이 가이드의 목적에 따라 하드코딩된 절대 경로를 사용합니다. 로컬 libSQL 파일이지만 프로덕션 용도에서는 작동하지 않습니다. 당신은해야 그런 다음 원격 영구 데이터베이스를 사용하십시오.

  4. src/mastra/index.ts 파일에서 Mastra에 Agent를 추가하세요.

    src/mastra/index.ts
    import { Mastra } from '@mastra/core'
    import { LibSQLVector } from '@mastra/libsql'
    import { researchAgent } from './agents/researchAgent'

    const libSqlVector = new LibSQLVector({
    id: 'research-vectors',
    url: 'file:/Users/your-name/guides/research-assistant/vector.db',
    })

    export const mastra = new Mastra({
    agents: { researchAgent },
    vectors: { libSqlVector },
    })

문서 처리
문서 처리에 대한 직접 링크

다음 단계에서는 연구 논문을 가져와서 더 작은 덩어리로 나눕니다. 그런 다음 임베딩을 생성하고 청크를 벡터 데이터베이스에 저장합니다.

  1. 이 단계에서는 URL을 제공하여 연구 논문을 검색한 다음 문서 개체로 변환하고 더 작고 관리 가능한 덩어리로 나눕니다. 청크로 분할하면 처리가 더 빠르고 효율적입니다.

    새 파일 src/store.ts를 만들고 다음을 추가하세요.

    src/store.ts
    import { MDocument } from '@mastra/rag'

    // Load the paper
    const paperUrl = 'https://arxiv.org/html/1706.03762'
    const response = await fetch(paperUrl)
    const paperText = await response.text()

    // Create document and chunk it
    const doc = MDocument.fromText(paperText)
    const chunks = await doc.chunk({
    strategy: 'recursive',
    maxSize: 512,
    overlap: 50,
    separators: ['\n\n', '\n', ' '],
    })

    console.log('Number of chunks:', chunks.length)

    터미널에서 파일을 실행합니다.

    npx bun src/store.ts

    다음 응답을 받아야 합니다.

    Number of chunks: 892
  2. 마지막으로 다음을 수행하여 RAG용 콘텐츠를 준비합니다.

    1. 각 텍스트 덩어리에 대한 임베딩 생성
    2. 임베딩을 보관할 벡터 저장소 인덱스 만들기
    3. 벡터 데이터베이스에 임베딩과 메타데이터(원본 텍스트 및 소스 정보)를 모두 저장
    노트

    이 메타데이터는 다음과 같은 경우 실제 콘텐츠를 반환할 수 있으므로 매우 중요합니다. 벡터 저장소는 관련 일치 항목을 찾습니다.

    Agent는 벡터 인덱스를 사용하여 관련 정보를 검색하고 가져옵니다.

    src/store.ts 파일을 열고 다음을 추가하세요.

    src/store.ts
    import { MDocument } from '@mastra/rag'
    import { embedMany } from 'ai'
    import { mastra } from './mastra'

    // Load the paper
    const paperUrl = 'https://arxiv.org/html/1706.03762'
    const response = await fetch(paperUrl)
    const paperText = await response.text()

    // Create document and chunk it
    const doc = MDocument.fromText(paperText)
    const chunks = await doc.chunk({
    strategy: 'recursive',
    maxSize: 512,
    overlap: 50,
    separators: ['\n\n', '\n', ' '],
    })

    // Generate embeddings
    const { embeddings } = await embedMany({
    model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
    values: chunks.map(chunk => chunk.text),
    })

    // Get the vector store instance from Mastra
    const vectorStore = mastra.getVector('libSqlVector')

    // Create an index for paper chunks
    await vectorStore.createIndex({
    indexName: 'papers',
    dimension: 1536,
    })

    // Store embeddings
    await vectorStore.upsert({
    indexName: 'papers',
    vectors: embeddings,
    metadata: chunks.map(chunk => ({
    text: chunk.text,
    source: 'transformer-paper',
    })),
    })

    마지막으로 이제 스크립트를 다시 실행하여 임베딩을 저장해야 합니다.

    npx bun src/store.ts

    작업이 성공하면 터미널에 출력/오류가 표시되지 않습니다.

어시스턴트 테스트
어시스턴트 테스트에 대한 직접 링크

이제 벡터 데이터베이스에 모든 임베딩이 포함되어 있으므로 다양한 유형의 쿼리로 연구 조교를 테스트할 수 있습니다.

새 파일 src/ask-agent.ts를 만들고 다양한 유형의 쿼리를 추가하세요.

src/ask-agent.ts
import { mastra } from './mastra'
const agent = mastra.getAgent('researchAgent')

// Basic query about concepts
const query1 = 'What problems does sequence modeling face with neural networks?'
const response1 = await agent.generate(query1)
console.log('\nQuery:', query1)
console.log('Response:', response1.text)

스크립트를 실행합니다:

npx bun src/ask-agent.ts

다음과 같은 출력이 표시됩니다.

Query: What problems does sequence modeling face with neural networks?
Response: Sequence modeling with neural networks faces several key challenges:
1. Vanishing and exploding gradients during training, especially with long sequences
2. Difficulty handling long-term dependencies in the input
3. Limited computational efficiency due to sequential processing
4. Challenges in parallelizing computations, resulting in longer training times

다른 질문을 시도해 보세요.

src/ask-agent.ts
import { mastra } from './mastra'
const agent = mastra.getAgent('researchAgent')

// Query about specific findings
const query2 = 'What improvements were achieved in translation quality?'
const response2 = await agent.generate(query2)
console.log('\nQuery:', query2)
console.log('Response:', response2.text)

산출:

Query: What improvements were achieved in translation quality?
Response: The model showed significant improvements in translation quality, achieving more than 2.0
BLEU points improvement over previously reported models on the WMT 2014 English-to-German translation
task, while also reducing training costs.

신청서 제공
신청서 제공에 대한 직접 링크

API를 통해 연구 조교를 노출하려면 Mastra 서버를 시작하십시오.

mastra dev

귀하의 연구 조교는 다음 주소에서 연락하실 수 있습니다:

http://localhost:4111/api/agents/researchAgent/generate

컬로 테스트:

curl -X POST http://localhost:4111/api/agents/researchAgent/generate \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "user", "content": "What were the main findings about model parallelization?" }
]
}'

고급 RAG 예
고급 RAG 예에 대한 직접 링크

고급 RAG 기술에 대한 다음 예를 살펴보세요.