这里有一份详细的路线图,用于使用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 中。
- 生成并存储向量嵌入数据。
🔥 步骤:
确保使用“🔥”表情符号与源文本一致,以保持风格和语气。
- 设置 MongoDB Atlas 服务:
- 创建一个用于文档和嵌入向量的数据库。
- 启用向量搜索。
- 安装依赖库。
npm install openai mongoose @nestjs/mongoose
全屏模式,退出全屏
- 将文档存入MongoDB :
const documentSchema = new mongoose.Schema({
content: '字符串',
embedding: { type: '数组', default: '数组' },
});
全屏显示,退出全屏
- 将文档转换为嵌入
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;
}
全屏模式 退出全屏
- 将向量存入MongoDB
async function 存储文档(content: string) {
const 嵌入式表示 = await 生成嵌入式表示(content);
await DocumentModel.create({ content, 嵌入式表示 });
}
全屏 退出全屏
🛠 学科技入门 :
- MongoDB Atlas 向量搜索功能。
- OpenAI Embeddings API。
- 基于 MongoDB 的 NestJS。
……
👉 第三阶段:数据预处理阶段🎯 我们的目标是:
- 清理并处理非结构化数据。
- 实现文档分块以获取更好的嵌入效果。
- 存储结构化元数据以便检索。
🔥 步骤如下:
- 删除不需要的部分:
function cleanText(text: string): string {
return text.replace(/(免责声明文本|页脚部分|进一步支持信息).*/g, '');
}
切换到全屏 退出全屏
- 分块大型文档
function chunkText(text: string, chunkSize = 500) {
// 将文本按指定大小分割成块
return text.match(new RegExp(`.{1,${chunkSize}}`, 'g'));
}
点击全屏按钮进入全屏模式 点击退出按钮退出全屏
🛠 学习科技
- 文本预处理(正则表达式、切分、停用词去除)。
- 使用LangChain进行文本切分。
……
📌 模型训练与微调(可选)🎯 目标
- 如有需要,可以训练一个自己的OpenAI模型。
- 对特定行业术语进行微调,让回复更准确。
🔥 步骤吧 :
- 准备训练数据(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 向量搜寻来找到最匹配的文档。
🔥 步骤:
- 进行向量搜索请求 :
async function 搜索文档(查询: 字符串) {
const 查询嵌入 = await 生成嵌入(查询);
return await DocumentModel.find({
$vectorSearch: {
queryVector: 查询嵌入,
path: 'embedding',
numCandidates: 10,
limit: 5,
},
});
}
点击全屏观看 退出全屏
- 检索数据并将其发送给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生成的响应。
来吧,步骤是:
- AI服务:
@Injectable()
export class AIService {
async processQuery(query: string) {
// 此函数处理查询并生成AI响应
return await generateAIResponse(query);
}
}
切换到全屏,退出全屏
- 创建控制器
@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用户界面。
- 将查询发送给后端并显示结果。
🔥 步骤如下
- 来自 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();
}
全屏模式,全屏退出
- 创建界面元素
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回答评分或报告错误。
✅ 实现前端: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回答
定期查看消极反馈并将错误分类。
✅ 错误种类:
- 不正确的事实 → 改进检索模型。
- 不相关的结果 → 改进向量嵌入。
- 不明确的答案 → 改进提示设计。
📌 查查MongoDB中的AI性能表现数据:
async function 获取负面反馈信息() {
// 获取负面反馈信息,限制返回条数为100
return await FeedbackModel.find({ feedback: '👎' }).limit(100);
}
进入全屏
退出全屏
步骤4:调整系统参数
根据分析结果,通过以下方式改进系统:
- 更好的提示设计
- 比如:给AI提示增加一些背景信息。
const prompt = `
你是法律公司的AI助手。
请根据以下公司文件准确回答:
${retrievedDocuments}
`;
进入全屏,退出全屏
- 改进文档划分
- 如果检索结果不准确,调整每块的大小。
// 函数chunkText用于将文本按照指定的长度分割成多个小段,默认长度为300
function chunkText(text: string, chunkSize = 300) {
return text.match(new RegExp(`.{1,${chunkSize}}`, 'g'));
}
进入全屏,退出全屏
- 重新训练或微调模型
-
如果OpenAI的回复质量不高,训练一个自定义的微调模型。
-
- *
步骤5:持续监控和自动改进
- 通过日志记录AI表现(例如,记录不正确的答案)。
- 使用指标(例如,追踪用户点赞和点踩的频率)。
- 进行A/B测试(例如,比如不同的AI提示格式)。
- 定期更新模型(例如,可以每月更新一次模型的嵌入层)。
📌 监控 NestJS 中的 AI 性能
async function 记录AI回复(query: string, response: string) {
await 性能模型类.create({ query, response, 时间戳: new Date().toLocaleString() });
}
点击进入全屏模式 点击退出全屏模式