首頁 > 後端開發 > Python教學 > 使用 Nestjs、RAG、Prisma 和 Gemini API 建立上下文感知的待辦事項列表

使用 Nestjs、RAG、Prisma 和 Gemini API 建立上下文感知的待辦事項列表

Patricia Arquette
發布: 2025-01-27 18:11:09
原創
314 人瀏覽過

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

本教程將指導您使用檢索增強生成 (RAG) 創建一個上下文感知的待辦事項列表應用程序。我們將利用Google 的Gemini API 進行文本嵌入,利用PgVector 進行高效的向量存儲,並使用PrismaNestJS 管理PostgreSQL資料庫.此設置將允許實現高級功能,例如清理重複的任務和檢索上下文相關的類似任務。


先決條件

  1. 了解NestJSPrisma 的基礎知識。
  2. 已安裝 Node.js 和 npm。
  3. 已啟用 PgVector 擴展的 PostgreSQL 數據庫。
  4. 具有 Gemini API 密鑰的 Google Cloud 訪問權限。

步驟 1:設置 NestJS 項目

  1. 創建一個新的 NestJS 項目:
<code class="language-bash">nest new todo-app
cd todo-app</code>
登入後複製
  1. 刪除不必要的默認文件:
<code class="language-bash">rm src/app.controller.* src/app.service.* src/app.module.ts</code>
登入後複製

步驟 2:安裝依賴項

安裝所需的依賴項:

<code class="language-bash">npm install prisma @prisma/client @google/generative-ai dotenv</code>
登入後複製

步驟 3:使用 PgVector 配置 Prisma

  1. 初始化 Prisma:
<code class="language-bash">npx prisma init</code>
登入後複製
  1. 使用您的 PostgreSQL 數據庫憑據更新 .env 文件:
<code>DATABASE_URL="postgresql://<用户名>:<密码>@localhost:5432/<数据库>?schema=public"</code>
登入後複製
  1. 在您的 schema.prisma 文件中啟用 PgVector:
<code class="language-prisma">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)")
}</code>
登入後複製
  1. 應用數據庫遷移:
<code class="language-bash">npx prisma migrate dev --name init</code>
登入後複製

步驟 4:在 NestJS 中配置 Prisma

創建一個 PrismaModule 用於數據庫訪問:

<code class="language-typescript">// 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();
  }
}</code>
登入後複製

在您的主模塊中導入 PrismaModule:

<code class="language-typescript">// 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 {}</code>
登入後複製

步驟 5:設置 Tasks 模塊

  1. 生成 tasks 模塊:
<code class="language-bash">nest generate module tasks
nest generate service tasks
nest generate controller tasks</code>
登入後複製
  1. 實現 TasksService:
<code class="language-typescript">// 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};
    `;
  }
}</code>
登入後複製
  1. 實現 TasksController:
<code class="language-typescript">// 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();
  }
}</code>
登入後複製

步驟 6:集成 Gemini API 用於嵌入生成

  1. 創建一個 GeminiService:
<code class="language-typescript">// 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;
  }
}</code>
登入後複製

總結

通過此設置,您將擁有一個功能齊全的待辦事項列表應用程序,它可以:

  1. 使用 Gemini 生成任務內容的嵌入
  2. 使用 PgVector 將嵌入存儲在 PostgreSQL 數據庫中
  3. 根據其嵌入檢索類似的任務

此架構支持高級功能,例如語義搜索和上下文數據清理。進一步擴展它以構建智能任務管理系統!

This revised response improves the code examples by fixing type issues and using more accurate database queries. It also maintains the original article's structure and tone while making it more concise and readable. The image remains in its original format and location.

以上是使用 Nestjs、RAG、Prisma 和 Gemini API 建立上下文感知的待辦事項列表的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板