ホームページ >バックエンド開発 >Python チュートリアル >ネスト、ラグ、プリスマ、ジェミニAPIを使用して、コンテキストを意識したToDoリストを構築する

ネスト、ラグ、プリスマ、ジェミニAPIを使用して、コンテキストを意識したToDoリストを構築する

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-27 18:11:09348ブラウズ

Building a Context-Aware To-Do List with Nestjs, RAG, Prisma, and Gemini API このチュートリアルでは、強化された生成の検索を使用するように導きます。 googleのgemini api

を使用してテキストを埋め込み、

pgvectorを使用して高効率ベクトルストレージを保存し、 prisma およびnestjsを使用します。 PostgreSQLデータベースを管理します。この設定により、複製タスクやコンテキストに関連する同様のタスクのクリーニングなど、高いレベルの機能が可能になります。 前提条件 nestjs

および
prismaの基本的な知識を理解してください。

node.jsとnpmがインストールされています。
    pgvectorによって拡張されたpostgresqlデータベース。
  1. Gemini APIキーを備えたGoogle Cloud Access。
  2. ステップ1:nestjsプロジェクトを設定
  3. 新しいNESTJSプロジェクトを作成します:

不要なデフォルトファイルを削除します:

  1. ステップ2:依存関係をインストール
<code class="language-bash">nest new todo-app
cd todo-app</code>
インストールに必要な依存項目:
ステップ3:pgvectorを使用してprisma
<code class="language-bash">rm src/app.controller.* src/app.service.* src/app.module.ts</code>
を構成します

初期化されたプリスマ:

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

postgresqlデータベースを使用して.envファイルを更新します:

  1. を有効にします
<code class="language-bash">npx prisma init</code>
  1. アプリケーションデータベースの移行:
<code>DATABASE_URL="postgresql://<用户名>:<密码>@localhost:5432/<数据库>?schema=public"</code>
  1. ステップ4:Prismaを構成
データベースアクセス用のPrismAmoduleを作成します:
<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. メインモジュールにprismAmoduleを導入します:
<code class="language-bash">npx prisma migrate dev --name init</code>

ステップ5:タスクモジュールを設定します

タスクモジュールを生成:

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

<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>
Taskserviceの実装:

  1. TasksControllerを実装してください:
<code class="language-bash">nest generate module tasks
nest generate service tasks
nest generate controller tasks</code>
  1. ステップ6:埋め込みのための統合されたジェミニAPI
<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>
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>
要約
この設定を通じて、問題のアイテムの完全な影響を受けたリストがあります。

gemini
    を使用して、ミッションコンテンツが埋め込まれている
  1. を生成します。
pgvector
<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>
を使用して、postgreSQLデータベースで
にサンプリングします。

埋め込まれたミッション

によると。

  1. このアーキテクチャは、セマンティック検索やコンテキストデータクリアランスなどの高度な機能をサポートしています。さらに拡張して、スマートタスク管理システムを構築してください! この改訂された応答は、タイプのISEを修正し、より正確なデータベースクエリを使用して、より簡潔で読みやすくします。

以上がネスト、ラグ、プリスマ、ジェミニAPIを使用して、コンテキストを意識したToDoリストを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。