> 백엔드 개발 > 파이썬 튜토리얼 > Nestjs, Rag, Prisma 및 Gemini API로 컨텍스트 인식 할 일 목록 구축

Nestjs, Rag, Prisma 및 Gemini API로 컨텍스트 인식 할 일 목록 구축

Patricia Arquette
풀어 주다: 2025-01-27 18:11:09
원래의
376명이 탐색했습니다.

Building a Context-Aware To-Do List with Nestjs, RAG, Prisma, and Gemini API

이 튜토리얼은 RAG(Retrieval Augmented Generation)를 사용하여 상황 인식 할 일 목록 애플리케이션을 만드는 과정을 안내합니다. 텍스트 임베딩에는 Google의 Gemini API를, 효율적인 벡터 저장에는 PgVector를, PostgreSQL 데이터베이스 관리에는 PrismaNestJS를 활용하겠습니다. 이 설정을 사용하면 중복 작업 정리 및 상황에 따라 유사한 작업 검색과 같은 고급 기능을 사용할 수 있습니다.


전제조건

  1. NestJSPrisma의 기본을 알아보세요.
  2. Node.js와 npm이 설치되었습니다.
  3. PgVector 확장이 활성화된 PostgreSQL 데이터베이스.
  4. Gemini API 키를 사용한 Google Cloud 액세스.

1단계: NestJS 프로젝트 설정

  1. 새 NestJS 프로젝트 만들기:
nest new todo-app
cd todo-app
로그인 후 복사
  1. 불필요한 기본 파일 제거:
rm src/app.controller.* src/app.service.* src/app.module.ts
로그인 후 복사

2단계: 종속성 설치

필수 종속성 설치:

npm install prisma @prisma/client @google/generative-ai dotenv
로그인 후 복사

3단계: PgVector를 사용하여 Prisma 구성

  1. Prisma 초기화:
npx prisma init
로그인 후 복사
  1. PostgreSQL 데이터베이스 자격 증명으로 .env 파일을 업데이트합니다.
<code>DATABASE_URL="postgresql://<用户名>:<密码>@localhost:5432/<数据库>?schema=public"</code>
로그인 후 복사
  1. schema.prisma 파일에서 PgVector 활성화:
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["postgresqlExtensions"]
}

datasource db {
  provider   = "postgresql"
  url        = env("DATABASE_URL")
  extensions = [pgvector]
}

model Task {
  id        Int      @id @default(autoincrement())
  title     String
  content   String
  embedding Unsupported("vector(1536)")
}
로그인 후 복사
  1. 데이터베이스 마이그레이션 적용:
npx prisma migrate dev --name init
로그인 후 복사

4단계: NestJS에서 Prisma 구성

데이터베이스 액세스를 위한 PrismaModule 생성:

// src/prisma/prisma.module.ts
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

// src/prisma/prisma.service.ts
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
  async onModuleInit() {
    await this.$connect();
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}
로그인 후 복사

기본 모듈에서 PrismaModule 가져오기:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { PrismaModule } from './prisma/prisma.module';
import { TasksModule } from './tasks/tasks.module';

@Module({
  imports: [PrismaModule, TasksModule],
})
export class AppModule {}
로그인 후 복사

5단계: 작업 모듈 설정

  1. 작업 생성 모듈:
nest generate module tasks
nest generate service tasks
nest generate controller tasks
로그인 후 복사
  1. TasksService 구현:
// src/tasks/tasks.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { Task } from '@prisma/client';
import { GeminiService } from '../gemini/gemini.service';

@Injectable()
export class TasksService {
  constructor(private prisma: PrismaService, private geminiService: GeminiService) {}

  async createTask(title: string, content: string): Promise<Task> {
    const embedding = await this.geminiService.getEmbedding(`${title} ${content}`);
    return this.prisma.task.create({
      data: { title, content, embedding },
    });
  }

  async getTasks(): Promise<Task[]> {
    return this.prisma.task.findMany();
  }

  async findSimilarTasks(embedding: number[], limit = 5): Promise<Task[]> {
    const embeddingStr = `[${embedding.join(',')}]`;
    return this.prisma.$queryRaw`
      SELECT *, embedding <-> ${embeddingStr}::vector AS distance
      FROM "Task"
      ORDER BY distance
      LIMIT ${limit};
    `;
  }
}
로그인 후 복사
  1. TasksController 구현:
// src/tasks/tasks.controller.ts
import { Controller, Post, Get, Body } from '@nestjs/common';
import { TasksService } from './tasks.service';

@Controller('tasks')
export class TasksController {
  constructor(private tasksService: TasksService) {}

  @Post()
  async createTask(@Body('title') title: string, @Body('content') content: string) {
    return this.tasksService.createTask(title, content);
  }

  @Get()
  async getTasks() {
    return this.tasksService.getTasks();
  }
}
로그인 후 복사

6단계: 삽입 생성을 위해 Gemini API 통합

  1. GeminiService 만들기:
// src/gemini/gemini.service.ts
import { Injectable } from '@nestjs/common';
import * as genai from '@google/generative-ai';

@Injectable()
export class GeminiService {
  private client: genai.GenerativeLanguageServiceClient;

  constructor() {
    this.client = new genai.GenerativeLanguageServiceClient({
      apiKey: process.env.GEMINI_API_KEY,
    });
  }

  async getEmbedding(text: string): Promise<number[]> {
    const result = await this.client.embedText({
      model: 'models/text-embedding-001',
      content: text,
    });
    return result.embedding;
  }
}
로그인 후 복사

요약

이 설정을 통해 다음과 같은 모든 기능을 갖춘 할 일 목록 앱을 갖게 됩니다.

  1. Gemini를 사용하여 작업 콘텐츠 삽입을 생성하세요.
  2. PgVector를 사용하여 PostgreSQL 데이터베이스에 임베딩을 저장합니다.
  3. 임베딩을 기반으로 유사한 작업을 검색합니다.

이 아키텍처는 의미 검색 및 상황별 데이터 정리와 같은 고급 기능을 지원합니다. 이를 더욱 확장하여 스마트한 작업 관리 시스템을 구축해보세요!

이 수정된 답변은 유형 문제를 수정하고 더 정확한 데이터베이스 쿼리를 사용하여 코드 예제를 개선하는 동시에 원본 기사의 구조와 어조를 유지하면서 이미지는 원래 형식과 위치를 유지합니다.

위 내용은 Nestjs, Rag, Prisma 및 Gemini API로 컨텍스트 인식 할 일 목록 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿