Rumah >pembangunan bahagian belakang >Tutorial Python >Membina senarai tugas yang menyedari konteks dengan Nestjs, Rag, Prisma, dan Gemini API

Membina senarai tugas yang menyedari konteks dengan Nestjs, Rag, Prisma, dan Gemini API

Patricia Arquette
Patricia Arquetteasal
2025-01-27 18:11:09372semak imbas

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

Tutorial ini akan membimbing anda untuk menggunakan pengambilan semula generasi yang dipertingkatkan. Kami akan menggunakan Gemini API Google

untuk membenamkan teks, gunakan pgvector untuk menyimpan penyimpanan vektor kecekapan tinggi, dan gunakan prisma dan nestjs Urus pangkalan data PostgreSQL. Tetapan ini akan membolehkan fungsi peringkat tinggi, seperti pembersihan tugas pendua dan tugas yang sama yang berkaitan dengan konteks. keadaan prasyarat

memahami pengetahuan asas nestjs
dan

prisma

.
  1. node.js dan npm telah dipasang. pangkalan data PostgreSQL yang telah dilanjutkan oleh PGVector. Access Cloud Google dengan kekunci API Gemini.
  2. Langkah 1: Tetapkan Projek Nestjs
  3. Buat projek NESTJS baru:

    Padam fail lalai yang tidak perlu:
<code class="language-bash">nest new todo-app
cd todo-app</code>
    Langkah 2: Pasang Ketergantungan
  1. item bergantung yang diperlukan untuk pemasangan:
<code class="language-bash">rm src/app.controller.* src/app.service.* src/app.module.ts</code>

Langkah 3: Gunakan PGVector untuk mengkonfigurasi Prisma

Prisma Inisialisasi:
<code class="language-bash">npm install prisma @prisma/client @google/generative-ai dotenv</code>

    Gunakan pangkalan data PostgreSQL anda untuk mengemas kini.
<code class="language-bash">npx prisma init</code>
Dalam fail skema.prisma anda, aktifkan PGVector:
<code>DATABASE_URL="postgresql://<用户名>:<密码>@localhost:5432/<数据库>?schema=public"</code>
Migrasi pangkalan data aplikasi:
<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>
Langkah 4: Konfigurasikan Prisma
  1. Buat Prismamodule untuk Akses Pangkalan Data:
<code class="language-bash">npx prisma migrate dev --name init</code>
Memperkenalkan Prismamodule dalam modul utama anda:

Langkah 5: Tetapkan Modul Tugas

<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>

menghasilkan modul tugas:

<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>

Melaksanakan Taskservice:
<code class="language-bash">nest generate module tasks
nest generate service tasks
nest generate controller tasks</code>
Melaksanakan TasksController:
<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>
Langkah 6: API Gemini Bersepadu untuk membenamkan untuk menghasilkan
  1. Buat Geminiservice:
<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>

Ringkasan
    melalui tetapan ini, anda akan mempunyai senarai lengkap perkara -perkara perkara, boleh:
Gunakan Gemini
<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>
untuk menghasilkan kandungan misi yang tertanam
.

Gunakan pgvector

sampel ke dalam

dalam pangkalan data PostgreSQL.
  1. Menurut misi tertanamnya .
  2. Senibina ini menyokong fungsi lanjutan, seperti carian semantik dan pelepasan data konteks. Selanjutnya mengembangkannya untuk membina sistem pengurusan tugas pintar! Respons yang disemak ini meningkatkan contoh kod dengan menetapkan jenis ISE dan menggunakan pertanyaan pangkalan data yang lebih tepat.

Atas ialah kandungan terperinci Membina senarai tugas yang menyedari konteks dengan Nestjs, Rag, Prisma, dan Gemini API. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn