您的位置 首页 编程知识

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

本教程演示如何利用检索增强生成 (RAG) 技术构建一个具备上下文感知能力的待办事项列表应用。我们将结合Goo…

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

本教程演示如何利用检索增强生成 (RAG) 技术构建一个具备上下文感知能力的待办事项列表应用。我们将结合Google Gemini API进行文本嵌入,借助pgvector高效管理向量数据,并使用PrismaNestJS框架操作PostgreSQL数据库。此方案将实现诸如去重任务和基于上下文检索相似任务等高级功能。

前提条件

  1. 熟悉NestJSPrisma框架。
  2. 已安装Node.js和npm。
  3. PostgreSQL数据库已安装并启用pgvector扩展。
  4. 拥有可访问Google Cloud的Gemini API密钥。

步骤一:搭建NestJS项目

  1. 创建新的NestJS项目:
nest new todo-app cd todo-app
登录后复制
  1. 删除默认生成的无用文件:
rm src/app.controller.* src/app.service.* src/app.module.ts
登录后复制

步骤二:安装依赖

安装所需依赖包:

npm install prisma @prisma/client @google/generative-ai dotenv pg
登录后复制

步骤三:使用pgvector配置Prisma

  1. 初始化Prisma:
npx prisma init
登录后复制
  1. 使用你的PostgreSQL数据库连接信息更新.env文件:
DATABASE_URL="postgresql://<用户名>:<密码>@localhost:5432/<数据库名>?schema=public" GEMINI_API_KEY="<你的Gemini API密钥>"
登录后复制
  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
登录后复制

步骤四:在NestJS中配置Prisma

创建Prisma模块用于数据库访问:

// 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();   } }
登录后复制

在主模块中导入Prisma模块:

// 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 {}
登录后复制

步骤五:创建任务模块

  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<any[]> {     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();   } }
登录后复制

步骤六:集成Gemini API生成嵌入向量

  1. 创建GeminiService:
// src/gemini/gemini.service.ts import { Injectable } from '@nestjs/common'; import { GenerativeLanguageServiceClient } from '@google/generative-ai';  @Injectable() export class GeminiService {   private client: GenerativeLanguageServiceClient;    constructor() {     this.client = new 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 API为任务内容生成嵌入向量。
  2. 使用pgvector将嵌入向量存储在PostgreSQL数据库中。
  3. 基于嵌入向量检索相似任务。

此架构支持语义搜索和上下文数据清理等高级功能,可进一步扩展以构建更智能的任务管理系统。

以上就是使用 Nestjs、RAG、Prisma 和 Gemini API 构建上下文感知的待办事项列表的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/6446.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部