首页 > 后端开发 > Python教程 > 使用 Nestjs、RAG、Prisma 和 Gemini API 构建上下文感知的待办事项列表

使用 Nestjs、RAG、Prisma 和 Gemini API 构建上下文感知的待办事项列表

Patricia Arquette
发布: 2025-01-27 18:11:09
原创
311 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板