实例详解 | 借助 Langchain 和 Gemma 2 构建 RAG 应用

本文原作者:Connie Leung,谷歌开发者专家 (GDE),原文发布于:DEV Community

https://dev.to/railsstudent/build-a-rag-application-to-learn-angular-using-langchhtainjs-nestjs-htmx-and-gemma-2-5ggk

本文将为您介绍如何使用 LangChain、NestJS 和 Gemma 2 构建关于 PDF 格式 Angular 书籍的 RAG 应用。接着,HTMX 和 Handlebar 模板引擎将响应呈现为列表。应用使用 LangChain 及其内置的 PDF 加载器来加载 PDF 书籍,并将文档拆分为小块。然后,LangChain 使用 Gemini 嵌入文本模型将文档表示为向量,并将向量持久化存储到向量数据库中。向量存储检索器为大语言模型 (LLM) 提供上下文,以便在其数据中查找信息,从而生成正确的响应。

设置环境变量

PORT=3001``GROQ_API_KEY=<GROQ API KEY>``GROQ_MODEL=gemma2-9b-it``GEMINI_API_KEY=<GEMINI API KEY>``GEMINI_TEXT_EMBEDDING_MODEL=text-embedding-004``HUGGINGFACE_API_KEY=<Huggingface API KEY>``HUGGINGFACE_EMBEDDING_MODEL=BAAI/bge-small-en-v1.5``QDRANT_URL=<Qdrant URL>``QDRANT_APK_KEY=<Qdrant API KEY>

访问 https://aistudio.google.com/app/apikey,登录帐号,创建新的 API 密钥。将 API 密钥替换为 GEMINI_API_KEY。

访问 Groq Cloud: https://console.groq.com/,注册帐号并新建一个 API 密钥。将 API 密钥替换为 GROQ_API_KEY。

访问 Huggingface: https://huggingface.co/join,注册帐号,创建新的访问令牌。将访问令牌替换为 HUGGINGFACE_API_KEY。

访问 Qdrant: https://cloud.qdrant.io/,注册帐号,创建 Qdrant 空间。将网址替换为 QDRANT_URL。将 API 密钥替换为 QDRANT_API_KEY。

安装依赖项

npm i -save-exact @google/generative-ai @huggingface/inference`   `@langchain/community @langchain/core @langchain/google-genai` `@langchain/groq @langchain/qdrant @nestjs/config @nestjs/swagger` `@nestjs/throttler class-transformer class-validator compression hbs` `langchain pdf-parse
npm i -save-exact –save-dev @commitlint/cli` `@commitlint/config-conventional` `husky lint-staged

定义应用的配置

创建 src/configs 文件夹并在其中添加 configuration.ts 文件。

export default () => ({` `port: parseInt(process.env.PORT, 10) || 3000,` `groq: {`   `apiKey: process.env.GROQ_API_KEY || '',`   `model: process.env.GROQ_MODEL || 'gemma2-9b-it',` `},` `gemini: {`   `apiKey: process.env.GEMINI_API_KEY || '',`   `embeddingModel: process.env.GEMINI_TEXT_EMBEDDING_MODEL || 'text-embedding-004',` `},` `huggingface: {`   `apiKey: process.env.HUGGINGFACE_API_KEY || '',`   `embeddingModel: process.env.HUGGINGFACE_EMBEDDING_MODEL || 'BAAI/bge-small-en-v1.5',` `},` `qdrant: {`   `url: process.env.QDRANT_URL || 'http://localhost:6333',`   `apiKey: process.env.QDRANT_APK_KEY || '',` `},``});

创建 Groq 模块

生成 Groq 模块、控制器和服务。

`nest g mo groq``nest g s groq/application/groq --flat``nest g co groq/presenters/http/groq --flat` 

添加一个聊天模型

在模块中定义 Groq 配置类型,文件路径为 application/types/groq-config.type.ts。配置服务将配置值转换为自定义对象。

export type GroqConfig = {` `model: string;` `apiKey: string;``};

添加自定义提供程序以提供 GroqChatModel 的实例。在 application/constants 文件夹下创建 groq.constant.ts 文件。

// application/constants/groq.constant.ts``   ``export const GROQ_CHAT_MODEL = 'GROQ_CHAT_MODEL';
// application/providers/groq-chat-model.provider.ts``   ``import { ChatGroq } from '@langchain/groq';``import { Provider } from '@nestjs/common';``import { ConfigService } from '@nestjs/config';``import { GROQ_CHAT_MODEL } from '~groq/application/constants/groq.constant';``import { GroqConfig } from '~groq/application/types/groq-config.type';``   ``export const GroqChatModelProvider: Provider<ChatGroq> = {` `provide: GROQ_CHAT_MODEL,` `useFactory: (configService: ConfigService) => {`   `const { apiKey, model } = configService.get<GroqConfig>('groq');`   `return new ChatGroq({`     `apiKey,`     `model,`     `temperature: 0.1,`     `maxTokens: 2048,`     `streaming: false,`   `});` `},` `inject: [ConfigService],``};

在控制器中测试 Groq 聊天模型

import { MessageContent } from '@langchain/core/messages';``import { ChatPromptTemplate } from '@langchain/core/prompts';``import { ChatGroq } from '@langchain/groq';``import { Inject, Injectable } from '@nestjs/common';``import { GROQ_CHAT_MODEL } from './constants/groq.constant';``   ``@Injectable()``export class GroqService {` `constructor(@Inject(GROQ_CHAT_MODEL) private model: ChatGroq) {}``   ` `async generateText(input: string): Promise<MessageContent> {`   `const prompt = ChatPromptTemplate.fromMessages([`     `['system', 'You are a helpful assistant'],`     `['human', '{input}'],`   `]);``   `   `const chain = prompt.pipe(this.model);`   `const response = await chain.invoke({`     `input,`   `});``   `   `return response.content;` `}``}

GroqService 服务有一个方法,用于执行查询并要求模型生成文本响应。

@Controller('groq')``export class GroqController {` `constructor(private service: GroqService) {}``   ` `@Get()` `testChain(): Promise<MessageContent> {`   `return this.service.generateText('What is Agentic RAG?');` `}``}

从模块导出聊天模型

import { Module } from '@nestjs/common';``import { GroqChatModelProvider } from './application/providers/groq-chat-model.provider';``import { GroqService } from './application/groq.service';``import { GroqController } from './presenters/http/groq.controller';``   ``@Module({` `providers: [GroqChatModelProvider, GroqService],` `controllers: [GroqController],` `exports: [GroqChatModelProvider],``})``export class GroqModule {}

创建向量存储模块

nest g mo vectorStore``nest g s application/vectorStore --flat

添加配置类型

在 application/types 文件夹下定义配置类型。

这是嵌入模型的配置类型。此应用同时支持 Gemini 文本嵌入模型和 Huggingface 推理嵌入模型。

// application/types/embedding-model-config.type.ts``   ``export type EmbeddingModelConfig = {` `apiKey: string;` `embeddingModel: string;``};

应用支持内存向量存储和 Qdrant 向量存储。因此,应用具有 Qdrant 配置。

// application/types/qdrant-database-config.ty
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值