Appearance
第五部分:拓展补充(开发者必修课)
除了基本的提示词技巧外,还有一些进阶维度可以帮助开发者更有效地利用 AI 辅助开发。以下是几个重要的拓展方向:
1. RAG 与本地文档注入
基本原理
RAG(Retrieval-Augmented Generation)是一种结合了检索和生成的 AI 技术,通过从外部文档中检索相关信息来增强模型的生成能力。
本地文档注入的重要性
- 最新信息:让 AI 学习尚未在训练集中的最新 API 文档
- 项目特定知识:让 AI 了解项目的特定需求和上下文
- 减少幻觉:通过引用真实文档减少 AI 生成错误信息的可能性
实现方法
1. 文档准备
- 格式转换:将文档转换为适合检索的格式(如文本、Markdown 等)
- 分块处理:将长文档分割成适当大小的块,便于检索
- 元数据添加:为每个文档块添加元数据,如来源、章节等
2. 向量存储
- 嵌入生成:使用嵌入模型将文档块转换为向量
- 向量数据库:将向量存储在专门的向量数据库中(如 Pinecone、FAISS 等)
- 索引构建:为向量创建索引,提高检索效率
3. 检索与生成
- 查询处理:将用户查询转换为向量
- 相似性搜索:在向量数据库中搜索与查询最相似的文档块
- 上下文构建:将检索到的文档块作为上下文提供给模型
- 生成回答:模型基于上下文生成回答
实战示例
输入示例
Role: 你是一位精通 [技术栈] 的开发专家,能够基于提供的文档回答问题。
Context:
- 技术栈:[技术栈信息]
- 本地文档:@Docs [文档路径]
- API 文档:/path/to/api-docs.md
- 架构文档:/path/to/architecture.md
Task:
- 根据本地文档,实现 [具体功能]
- 确保使用最新的 API 和最佳实践
Output Format:
- 首先分析需求
- 然后基于文档提供实现方案
- 最后提供完整的代码实现输出示例
## 需求分析
根据提供的 API 文档,需要实现一个用户认证功能,包括:
1. 用户注册
2. 用户登录
3. JWT 令牌生成和验证
## 实现方案
根据架构文档,认证功能应该:
- 使用 Express 中间件处理认证
- 集成数据库存储用户信息
- 实现密码哈希和验证
## 代码实现
```javascript
// auth.js
const express = require('express');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('./models/User');
const router = express.Router();
// 用户注册
router.post('/register', async (req, res) => {
try {
const { username, email, password } = req.body;
// 检查用户是否已存在
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(400).json({ error: 'User already exists' });
}
// 哈希密码
const hashedPassword = await bcrypt.hash(password, 10);
// 创建新用户
const user = new User({
username,
email,
password: hashedPassword
});
await user.save();
res.status(201).json({ message: 'User registered successfully' });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 用户登录
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
// 查找用户
const user = await User.findOne({ email });
if (!user) {
return res.status(401).json({ error: 'Invalid credentials' });
}
// 验证密码
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) {
return res.status(401).json({ error: 'Invalid credentials' });
}
// 生成 JWT 令牌
const token = jwt.sign(
{ userId: user._id, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
);
res.json({ token, user: { id: user._id, username: user.username, email: user.email } });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 认证中间件
const authenticate = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
res.status(401).json({ error: 'Invalid token' });
}
};
module.exports = { router, authenticate };
### 提示词模板Role: 你是一位精通 [技术栈] 的开发专家,能够基于提供的文档回答问题。
Context:
- 技术栈:[技术栈信息]
- 本地文档:@Docs [文档路径]
- [文档1名称]:[文档1路径]
- [文档2名称]:[文档2路径]
Task:
- 根据本地文档,实现 [具体功能]
- 确保使用最新的 API 和最佳实践
Output Format:
- 首先分析需求
- 然后基于文档提供实现方案
- 最后提供完整的代码实现
## 2. 提示词的安全与审计
### 安全风险
- **敏感信息泄露**:在提示词中包含 API Key、密码等敏感信息
- **业务逻辑泄露**:暴露核心业务逻辑和算法
- **代码注入**:恶意用户通过提示词注入恶意代码
- **权限提升**:通过提示词获取未授权的信息或功能
### 安全最佳实践
#### 1. 敏感信息保护
- **环境变量**:使用环境变量存储敏感信息,避免硬编码
- **令牌管理**:使用令牌管理服务,避免直接在提示词中使用 API Key
- **信息最小化**:只提供必要的信息,避免过多的上下文
#### 2. 输入验证
- **输入过滤**:对用户输入进行过滤和验证
- **边界检查**:设置输入的长度和格式限制
- **恶意输入检测**:检测和阻止恶意输入
#### 3. 输出控制
- **内容过滤**:过滤输出中的敏感信息
- **格式限制**:限制输出的格式和内容范围
- **错误处理**:统一错误处理,避免泄露系统信息
#### 4. 审计与监控
- **日志记录**:记录提示词和响应的日志
- **异常检测**:检测异常的提示词和行为
- **定期审计**:定期审计提示词和响应
### 实战示例
#### 不安全的提示词Role: 你是一位后端开发专家
Context:
- 技术栈:Node.js + MongoDB
- 数据库连接字符串:mongodb://username:password@localhost:27017/mydb
- API Key:sk-1234567890abcdef1234567890abcdef
Task:
- 实现一个用户管理系统
#### 安全的提示词Role: 你是一位后端开发专家
Context:
- 技术栈:Node.js + MongoDB
- 数据库连接:使用环境变量 MONGODB_URI
- API 调用:使用环境变量 OPENAI_API_KEY
Task:
- 实现一个用户管理系统,使用环境变量存储敏感信息
- 确保代码中不包含硬编码的敏感信息
### 安全提示词模板Role: [专业角色]
Context:
- 技术栈:[技术栈信息]
- 敏感信息:使用环境变量 [环境变量名]
- 安全要求:
- 不硬编码敏感信息
- 遵循最小权限原则
- 实现适当的错误处理
Task:
- [具体任务]
Output Format:
- 确保代码中不包含敏感信息
- 提供环境变量配置示例
- 包含必要的安全措施
## 3. AI 辅助重构
### 重构的目标
- **代码优化**:减少代码冗余,提高代码质量
- **性能提升**:优化代码性能,减少资源消耗
- **可维护性**:提高代码的可读性和可维护性
- **架构改进**:改进代码架构,适应业务发展
### AI 辅助重构的优势
- **全局视角**:AI 可以理解整个代码库的结构和关系
- **模式识别**:AI 可以识别代码中的重复模式和优化机会
- **最佳实践**:AI 可以应用行业最佳实践进行重构
- **快速迭代**:AI 可以快速生成重构方案和代码
### 重构策略
#### 1. 代码分析
- **复杂度分析**:分析代码的复杂度和潜在问题
- **依赖分析**:分析代码的依赖关系
- **性能分析**:分析代码的性能瓶颈
#### 2. 重构方案
- **提取函数**:将重复代码提取为函数
- **模块化**:将代码拆分为模块
- **设计模式**:应用适当的设计模式
- **代码风格**:统一代码风格
#### 3. 验证与测试
- **单元测试**:确保重构后的代码通过单元测试
- **集成测试**:确保重构后的代码与其他组件正常集成
- **性能测试**:确保重构后的代码性能不劣化
### 实战示例
#### 输入示例Role: 你是一位代码重构专家,擅长优化代码结构和性能。
Context:
- 技术栈:JavaScript
- 现有代码:javascript
function calculateTotal(orders) { let total = 0; for (let i = 0; i < orders.length; i++) { if (orders[i].status === 'completed') { let orderTotal = 0; for (let j = 0; j < orders[i].items.length; j++) { orderTotal += orders[i].items[j].price * orders[i].items[j].quantity; } total += orderTotal; } } return total; }
Task:
- 重构此函数,提高代码可读性和性能
- 保持功能不变
- 应用现代 JavaScript 最佳实践
Output Format:
- 首先分析现有代码的问题
- 然后提供重构后的代码
- 最后解释重构的好处
#### 输出示例代码分析
现有代码的问题:
- 使用了传统的 for 循环,代码可读性较差
- 嵌套循环增加了时间复杂度
- 变量命名不够清晰
- 缺少注释说明
重构后的代码
javascript
/**
* 计算已完成订单的总金额
* @param {Array} orders - 订单数组
* @returns {number} - 总金额
*/
function calculateTotal(orders) {
return orders
.filter(order => order.status === 'completed')
.reduce((total, order) => {
const orderTotal = order.items.reduce((sum, item) => {
return sum + (item.price * item.quantity);
}, 0);
return total + orderTotal;
}, 0);
}重构的好处
- 可读性:使用函数式编程方法,代码更简洁易读
- 可维护性:添加了 JSDoc 注释,提高了代码的可维护性
- 性能:虽然时间复杂度相同,但代码更高效
- 现代性:使用了现代 JavaScript 的 filter 和 reduce 方法
- 可扩展性:代码结构更易于扩展和修改
### 重构提示词模板Role: 你是一位代码重构专家,擅长优化代码结构和性能。
Context:
- 技术栈:[技术栈信息]
- 现有代码:
[现有代码]
Task:
- 重构此代码,提高代码可读性和性能
- 保持功能不变
- 应用 [技术栈] 的最佳实践
Output Format:
- 首先分析现有代码的问题
- 然后提供重构后的代码
- 最后解释重构的好处
## 4. 自动化脚本生成
### 自动化脚本的类型
- **CI/CD 配置**:持续集成和持续部署配置文件
- **数据迁移脚本**:数据库迁移和数据处理脚本
- **构建脚本**:项目构建和打包脚本
- **测试脚本**:自动化测试脚本
- **部署脚本**:应用部署和配置脚本
### AI 生成脚本的优势
- **快速生成**:快速生成各种脚本,节省开发时间
- **最佳实践**:应用行业最佳实践
- **错误减少**:减少手动编写脚本的错误
- **一致性**:保持脚本风格和结构的一致性
### 实战示例
#### 输入示例Role: 你是一位 DevOps 专家,擅长编写 CI/CD 配置和自动化脚本。
Context:
- 技术栈:Node.js + GitHub Actions
- 项目结构:
- src/:源代码目录
- test/:测试目录
- package.json:项目配置文件
Task:
- 生成一个 GitHub Actions 配置文件,实现以下功能:
- 在 push 到 main 分支时运行
- 安装依赖
- 运行测试
- 构建项目
- 部署到 Vercel
Output Format:
- 提供完整的 GitHub Actions 配置文件
- 包含必要的注释说明
- 确保配置正确无误
#### 输出示例
```yaml
# .github/workflows/ci-cd.yml
name: CI/CD
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 检出代码
- uses: actions/checkout@v3
# 设置 Node.js 环境
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 16
cache: 'npm'
# 安装依赖
- name: Install dependencies
run: npm install
# 运行测试
- name: Run tests
run: npm test
# 构建项目
- name: Build project
run: npm run build
# 部署到 Vercel
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
working-directory: ./
production: true脚本生成提示词模板
Role: 你是一位 [相关领域] 专家,擅长编写 [脚本类型] 脚本。
Context:
- 技术栈:[技术栈信息]
- 项目结构:[项目结构信息]
- 目标平台:[目标平台信息]
Task:
- 生成一个 [脚本类型] 脚本,实现以下功能:
1. [功能1]
2. [功能2]
3. [功能3]
Output Format:
- 提供完整的脚本代码
- 包含必要的注释说明
- 确保脚本正确无误
- 提供使用说明通过掌握这些拓展技巧,开发者可以更全面地利用 AI 辅助开发,提高开发效率和代码质量,同时确保安全性和可维护性。