本文原作者: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