Files
prompt-optimizer/docs/experience.md
T
linshen 688bb2e2bf feat(core): 添加高级LLM参数配置功能
- 在模型配置中引入 `llmParams` 字段,允许用户为每个模型单独设置高级LLM参数
- 更新文档,详细说明 `llmParams` 的使用方法及示例
- 在模型管理器中实现对 `llmParams` 的验证和处理逻辑
- 增强 LLMService 以支持从 `llmParams` 中提取参数,优化模型行为控制
- 更新 UI 组件以支持高级参数的配置和展示,提升用户体验
2025-06-07 16:30:39 +08:00

218 lines
5.4 KiB
Markdown

# 项目核心经验总结
## 📋 核心知识点
- [架构设计](#架构设计) - API集成、模块化结构
- [错误处理](#错误处理) - 常见问题与解决方案
- [测试规范](#测试规范) - 关键测试要点
- [开发实践](#开发实践) - Vue、工具配置、最佳实践
- [重要Bug修复](#重要bug修复) - 安全漏洞与性能问题
---
## 架构设计
### API集成核心原则
```js
// 统一OpenAI兼容格式
export default {
baseURL: "https://api.openai.com/v1",
models: ["gpt-4", "gpt-3.5"],
apiKey: import.meta.env.VITE_API_KEY // Vite项目必须使用import.meta.env
}
```
### 模块化结构
```
src/
├─ api/ # API封装层
├─ services/ # 业务逻辑
├─ config/ # 配置管理
├─ components/ # UI组件
└─ prompts/ # 提示模板
```
### LLM服务设计要点
- **接口标准化**: 统一使用OpenAI格式
- **多服务商兼容**: Provider标识区分
- **敏感信息管理**: 环境变量+本地加密存储
- **用户自管理API密钥**: 避免后端开销,保持应用简单性
- **参数透明化**: 只使用用户明确配置的参数,不设置默认值避免误解
---
## 错误处理
### 核心处理策略
```js
// 统一错误处理模板
try {
await apiCall();
} catch (err) {
console.error("[API Error]", err.context);
throw new Error("友好的错误提示");
}
```
### 常见问题速查表
| 问题 | 解决方案 | 日期 |
|------|----------|------|
| 模板ID与模型Key混淆 | 明确功能ID与API Key分离 | 2024-03-22 |
| 状态同步异常 | 增加状态同步处理函数 | 2024-03-22 |
| 全局Provider污染 | 显式传递模型参数 | 2024-03-22 |
---
## 测试规范
### 关键要点
1. **环境变量**: Vite项目使用 `import.meta.env.VITE_*`
2. **测试隔离**: 使用动态唯一标识符避免冲突
3. **错误场景**: 覆盖网络错误、无效Token等异常
4. **状态管理**: 独立测试数据库、正确清理状态
5. **参数测试**: 为每个LLM参数创建独立测试用例,确保参数兼容性
### 测试模板
```js
describe("功能测试", () => {
beforeEach(() => {
// 使用唯一标识符
testId = `test-${Date.now()}`;
});
it("应正确处理异常", async () => {
await expect(func()).rejects.toThrow("预期错误");
});
});
// LLM参数测试最佳实践
describe("Individual Parameter Tests", () => {
// 为每个advancedParameterDefinitions中的参数创建独立测试
it("should accept valid temperature", async () => {
await modelManager.updateModel(configKey, {
// ... 基础配置
llmParams: { temperature: 0.3 } // 只测试一个参数
});
const response = await llmService.sendMessage(messages, configKey);
expect(response).toBeDefined();
});
// 组合参数测试
it("should handle multiple parameters together", async () => {
await modelManager.updateModel(configKey, {
// ... 基础配置
llmParams: {
temperature: 0.6,
max_tokens: 150,
top_p: 0.9
}
});
});
});
```
---
## 开发实践
### Vue开发规范
```js
// ✅ 正确: 组件顶层调用Composable
const { data } = useFetch();
// ❌ 错误: 生命周期内调用
onMounted(() => {
const { data } = useFetch(); // 禁止
});
```
### 工具配置
```bash
# 常用NPM命令
npm outdated # 检查更新
ncu -u "eslint*" # 安全更新指定包
npm run test # 每次修改后必须执行
```
### 流式处理最佳实践
```js
// 统一流式处理器
const handlers = {
onToken: (token) => result.value += token,
onComplete: () => isLoading.value = false,
onError: (error) => toast.error(error.message)
};
```
---
## 重要Bug修复
### 安全漏洞修复 (2024-12-20)
| Bug类型 | 风险等级 | 修复状态 |
|---------|----------|----------|
| UI配置导入验证不充分 | 中 | ✅ 已修复 |
| 数据迁移竞态条件 | 中 | ✅ 已修复 |
| 测试覆盖缺失 | 高 | ✅ 已修复 |
| LLM参数默认值误导用户 | 中 | ✅ 已修复 |
#### 关键修复示例
```ts
// UI配置导入安全验证
for (const [key, value] of Object.entries(typedData.userSettings)) {
// 白名单验证
if (!UI_SETTINGS_KEYS.includes(key as any)) {
console.warn(`跳过未知的UI配置键: ${key}`);
continue;
}
// 类型验证
if (typeof value !== 'string') {
console.warn(`跳过无效类型 ${key}: ${typeof value}`);
continue;
}
await this.storage.setItem(key, value);
}
// LLM参数透明化处理 (2024-12-20)
// ❌ 旧版本:自动设置默认值
if (completionConfig.temperature === undefined) {
completionConfig.temperature = 0.7; // 可能误导用户
}
// ✅ 新版本:只使用用户明确配置的参数
const completionConfig: any = {
model: modelConfig.defaultModel,
messages: formattedMessages,
...restLlmParams // 只传递用户配置的参数
};
// 不设置任何默认值,让API服务商使用其默认配置
```
---
## 核心经验要点
### 配置管理
- 业务逻辑与API配置解耦
- 支持动态配置更新
- 环境变量使用Vite规范
### 错误处理
- 开发环境保留完整堆栈
- 生产环境友好提示+日志
- 统一错误处理机制
### 测试策略
- 测试用例隔离
- 覆盖边界条件
- Mock最小必要依赖
### 安全考虑
- 输入验证白名单
- 防止原型污染
- 数据迁移原子性
### 性能优化
- 流式处理提升体验
- 组件懒加载
- 合理状态管理