手记

一步一步用Next.js、NestJS、OpenAI和MongoDB构建生成式AI项目的教程:2025年必学指南

这里有一份详细的路线图,用于使用Next.js、NestJS、OpenAI和MongoDB向量搜索等构建一个生成式AI应用。本指南涵盖了如何嵌入公司文档、存储向量、检索数据以及利用提示工程生成智能AI响应的各个方面。

此处省略...

🚀 AI项目计划

构建一个准备就绪的生成AI应用的从头到尾指南。

……

📌 第一阶段:定义问题与设计系统

🎯 目的

  • 定义问题描述(例如,AI驱动的文档搜索、聊天机器人、摘要生成)。
  • 选择AI功能(例如,文本生成、问答、摘要)。
  • 定义用户输入内容(例如,文本查询、文档上传)。
  • 确定输出形式(例如,纯文本、结构化响应)。
  • 确定检索方式(例如,MongoDB向量搜索、RAG)。

🛠 科技学习小贴士

  • AI 基本概念:生成式 AI,RAG(检索增强生成)。
  • 向量检索:MongoDB Atlas 向量搜索。
  • Next.js & NestJS:全栈开发技术。

这里什么也没有

📌 第二阶段:数据收集和储存:

🎯 我们的目标是

  • 收集公司的文件(例如格式为 PDF、Word、CSV、JSON 等的文件)。
  • 将文件高效地存储到 MongoDB 中。
  • 生成并存储向量嵌入数据。

🔥 步骤

确保使用“🔥”表情符号与源文本一致,以保持风格和语气。

  1. 设置 MongoDB Atlas 服务
  • 创建一个用于文档和嵌入向量的数据库。
  • 启用向量搜索
    1. 安装依赖库
npm install openai mongoose @nestjs/mongoose

全屏模式,退出全屏

  1. 将文档存入MongoDB :
       const documentSchema = new mongoose.Schema({
         content: '字符串',
         embedding: { type: '数组', default: '数组' },
       });

全屏显示,退出全屏

  1. 将文档转换为嵌入
       import OpenAI from 'openai';

       const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

       // 下面是一个异步函数,用于生成文本的嵌入
       async function generateEmbedding(text: string) {
         const response = await openai.embeddings.create({
           input: text,
           model: 'text-embedding-ada-002',
         });

         return response.data[0].embedding;
       }

全屏模式 退出全屏

  1. 将向量存入MongoDB
       async function 存储文档(content: string) {
         const 嵌入式表示 = await 生成嵌入式表示(content);
         await DocumentModel.create({ content, 嵌入式表示 });
       }

全屏 退出全屏

🛠 学科技入门 :

  • MongoDB Atlas 向量搜索功能
  • OpenAI Embeddings API
  • 基于 MongoDB 的 NestJS

……

👉 第三阶段:数据预处理阶段

🎯 我们的目标是:

  • 清理并处理非结构化数据
  • 实现文档分块以获取更好的嵌入效果。
  • 存储结构化元数据以便检索。

🔥 步骤如下:

  1. 删除不需要的部分
       function cleanText(text: string): string {
         return text.replace(/(免责声明文本|页脚部分|进一步支持信息).*/g, '');
       }

切换到全屏 退出全屏

  1. 分块大型文档
       function chunkText(text: string, chunkSize = 500) {
         // 将文本按指定大小分割成块
         return text.match(new RegExp(`.{1,${chunkSize}}`, 'g'));
       }

点击全屏按钮进入全屏模式 点击退出按钮退出全屏

🛠 学习科技

  • 文本预处理(正则表达式、切分、停用词去除)
  • 使用LangChain进行文本切分

……

📌 模型训练与微调(可选)

🎯 目标

  • 如有需要,可以训练一个自己的OpenAI模型
  • 对特定行业术语进行微调,让回复更准确。

🔥 步骤吧

  1. 准备训练数据(JSONL格式,即每行一个JSON对象)
       {"messages": [{"role": "system", "content": "你是一名财务助手。"}, {"role": "user", "content": "什么是ETF?"}, {"role": "assistant", "content": "ETF,即交易所交易基金,是一种金融产品。"}]}

全屏 退出全屏

在 OpenAI:上传和训练模型:

运行命令:openai api fine_tunes.create -t dataset.jsonl -m gpt-4
Note: The above command is used to fine-tune a model using a specified dataset.

全屏 退出全屏

🛠 学习技术指南

  • 调整OpenAI模型
  • 编写更好的提示词以获得更佳的回复

……

第五阶段:实现检索系统

🎯 我们的目标是

  • 实现向量搜寻技术迅速找到相关数据。
  • 使用MongoDB 向量搜寻来找到最匹配的文档。

🔥 步骤

  1. 进行向量搜索请求
       async function 搜索文档(查询: 字符串) {
         const 查询嵌入 = await 生成嵌入(查询);

         return await DocumentModel.find({
           $vectorSearch: {
             queryVector: 查询嵌入,
             path: 'embedding',
             numCandidates: 10,
             limit: 5,
           },
         });
       }

点击全屏观看 退出全屏

  1. 检索数据并将其发送给OpenAI以获取回复
       async function generateAIResponse(问题: string) {
         const relevantDocs = await searchDocuments(问题);

         const response = await openai.chat.completions.create({
           model: 'gpt-4',
           messages: [
             { role: 'system', content: '请使用以下文档来回答用户:' },
             ...relevantDocs.map(doc => ({ role: 'user', content: doc.content })),
             { role: 'user', content: 问题 },
           ],
         });

         return response.choices[0].message.content;
       }

全屏进入,退出全屏

🛠 学习技术小讲堂

  • MongoDB 向量搜索查询
  • 基于检索的生成增强(RAG)

此处省略内容

📌 第六阶段:开发API使用NestJS

🎯 目标是:

  • 构建一个REST API来处理AI的查询。
  • 提供接口用于查询AI生成的响应

来吧,步骤是:

  1. AI服务
       @Injectable()
       export class AIService {
         async processQuery(query: string) {
           // 此函数处理查询并生成AI响应
           return await generateAIResponse(query);
         }
       }

切换到全屏,退出全屏

  1. 创建控制器
       @Controller('ai')
       export class AIController {
         constructor(private readonly aiService: AIService) {}

         @Post('query')
         async handleQuery(@Body() data: { query: string }) {
           return this.aiService.processQuery(data.query);
         }
       }

全屏模式 退出全屏

🛠 学习科技的工具

  • NestJS 控制器和服务
  • API 开发的最佳实践

此处省略内容

📌 第七阶段:前端整合(使用 Next.js)

🎯 目标是

  • 创建一个与AI互动的Next.js用户界面
  • 将查询发送给后端并显示结果。

🔥 步骤如下

  1. 来自 Next.js 的 API 请求
// 异步函数,用于获取AI响应
       async function fetchAIResponse(query: string) {
         // 发送POST请求到/api/ai-query端点
         const res = await fetch('/api/ai-query', {
           method: 'POST',
           body: JSON.stringify({ query }),
         });
         return res.json();
       }

全屏模式,全屏退出

  1. 创建界面元素
       export default function AIChat() {
         const [query, setQuery] = useState('');
         const [response, setResponse] = useState('');

         async function handleSubmit() {
           const data = await fetchAIResponse(query);
           setResponse(data);
         }

         return (
           <div>
             <input type="text" value={query} onChange={e => setQuery(e.target.value)} />
             <button onClick={handleSubmit}>提问AI</button>
             <p>{response}</p>
           </div>
         );
       }

全屏模式, 退出全屏

🛠 技术入门 :

  • Next.js API 路由功能
  • React Hooks 和状态管理功能

    • *
      此处为空白 (chǔcǐ wéikuòbái)
📌 第八阶段:部署阶段
  • 在 Vercel 上部署 Next.js
  • 在 AWS 或 GCP 上部署 NestJS
  • 使用 MongoDB Atlas 存储数据。

    • *

📌 用户反馈及迭代 (最后)

用户反馈和迭代阶段对于根据实际使用情况不断改进你的AI应用至关重要。它确保该系统始终保持始终准确、用户友好且高效


🎯 目标
  • 收集用户关于AI回复的反馈。
  • 分析AI的错误答案,并提高准确度。
  • 优化查询处理、检索和模型回复的过程。
  • 利用反馈循环实现持续改进。

    • *
🔥 提升您的AI系统的几个小贴士

第一步:听听用户怎么说

鼓励用户对AI回答评分或报告错误。

实现前端:Next.js 前端界面

为 AI 回复添加反馈按钮,并收集用户反馈(如👍/👎,1-5星)。

📌 示例(如下):
Next.js 反馈界面:

export default function AIResponse({ response }) {
  const [feedback, setFeedback] = useState(null);

  async function sendFeedback(value) {
    await fetch('/api/feedback', {
      method: 'POST',
      body: JSON.stringify({ response, feedback: value }),
    });
    setFeedback(value);
  }

  return (
    <div>
      <p>{response}</p>
      <button onClick={() => sendFeedback('👍')} title="点赞">👍</button>
      <button onClick={() => sendFeedback('👎')} title="不赞">👎</button>
    </div>
  );
}

点击这里切换到全屏 点击这里退出全屏


第二步:保存反馈在 MongoDB 中

MongoDB 数据库中创建一个反馈收集表。

📌 NestJS 用户反馈存储 API :

    @Controller('反馈表单')
    export class FeedbackController { // 反馈控制器
      @Post()
      async saveFeedback(@Body() data: { response: string; feedback: string }) { // 保存反馈
        await FeedbackModel.create(data); // 创建反馈模型
      }
    }

全屏模式,退出全屏


步骤3:分析错误的AI回答

定期查看消极反馈并将错误分类。

错误种类

  1. 不正确的事实 → 改进检索模型。
  2. 不相关的结果 → 改进向量嵌入。
  3. 不明确的答案 → 改进提示设计。

📌 查查MongoDB中的AI性能表现数据:

    async function 获取负面反馈信息() {
      // 获取负面反馈信息,限制返回条数为100
      return await FeedbackModel.find({ feedback: '👎' }).limit(100);
    }

进入全屏
退出全屏


步骤4:调整系统参数

根据分析结果,通过以下方式改进系统:

  1. 更好的提示设计
  • 比如:给AI提示增加一些背景信息。
       const prompt = `
          你是法律公司的AI助手。
         请根据以下公司文件准确回答:
         ${retrievedDocuments}
       `;

进入全屏,退出全屏

  1. 改进文档划分
  • 如果检索结果不准确,调整每块的大小。
       // 函数chunkText用于将文本按照指定的长度分割成多个小段,默认长度为300
       function chunkText(text: string, chunkSize = 300) {
         return text.match(new RegExp(`.{1,${chunkSize}}`, 'g'));
       }

进入全屏,退出全屏

  1. 重新训练或微调模型
  • 如果OpenAI的回复质量不高,训练一个自定义的微调模型

    • *

步骤5:持续监控和自动改进

  1. 通过日志记录AI表现(例如,记录不正确的答案)。
  2. 使用指标(例如,追踪用户点赞和点踩的频率)。
  3. 进行A/B测试(例如,比如不同的AI提示格式)。
  4. 定期更新模型(例如,可以每月更新一次模型的嵌入层)。

📌 监控 NestJS 中的 AI 性能

    async function 记录AI回复(query: string, response: string) {
      await 性能模型类.create({ query, response, 时间戳: new Date().toLocaleString() });
    }

点击进入全屏模式 点击退出全屏模式


0人推荐
随时随地看视频
慕课网APP