Skip to content

第五部分:拓展补充(开发者必修课)

除了基本的提示词技巧外,还有一些进阶维度可以帮助开发者更有效地利用 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);
}

重构的好处

  1. 可读性:使用函数式编程方法,代码更简洁易读
  2. 可维护性:添加了 JSDoc 注释,提高了代码的可维护性
  3. 性能:虽然时间复杂度相同,但代码更高效
  4. 现代性:使用了现代 JavaScript 的 filter 和 reduce 方法
  5. 可扩展性:代码结构更易于扩展和修改

### 重构提示词模板

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 配置文件,实现以下功能:
    1. 在 push 到 main 分支时运行
    2. 安装依赖
    3. 运行测试
    4. 构建项目
    5. 部署到 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 辅助开发,提高开发效率和代码质量,同时确保安全性和可维护性。