ワンクリックで
ai-development
指导在 CodeSpirit 项目中集成 AI 功能的完整开发流程。包括 AI 表单填充、AI 长任务处理、LLM 集成和提示词工程。当用户需要添加 AI 功能、集成 LLM、或开发 AI 驱动的业务功能时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
指导在 CodeSpirit 项目中集成 AI 功能的完整开发流程。包括 AI 表单填充、AI 长任务处理、LLM 集成和提示词工程。当用户需要添加 AI 功能、集成 LLM、或开发 AI 驱动的业务功能时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
BMAD AI 工作流与 CodeSpirit 项目规范的集成技能。引导用户使用 BMAD 工作流,确保 BMAD 生成的文档和代码符合 CodeSpirit 规范。当用户提到 BMAD 工作流、需要完整开发流程管理、或执行 BMAD 命令时使用。
基于 CodeSpirit 项目规范进行系统化代码审查。检查安全、数据库、异步编程、多语言、DTO、控制器、服务类等规范。当用户需要审查代码、检查代码质量、或准备提交代码时使用。
提交前综合验证审阅。执行静态代码审查、运行时错误检查和功能验证。包括代码质量检查、Aspire应用日志分析、租户后台登录测试。当用户准备提交代码、需要全面验证、或要求提交前审查时使用。
指导从 Entity 到 Controller 的完整 CRUD 功能开发流程。包括实体创建、DTO设计、服务实现、控制器开发、数据库配置和迁移。当用户需要开发新的 CRUD 功能、创建 API 接口、或添加新的业务模块时使用。
指导同时为 MySQL 和 SQL Server 创建数据库迁移。使用数据库特定的 DbContext,处理数据库差异,配置雪花ID。当用户需要创建迁移、修改实体、或遇到迁移错误时使用。
| name | ai-development |
| description | 指导在 CodeSpirit 项目中集成 AI 功能的完整开发流程。包括 AI 表单填充、AI 长任务处理、LLM 集成和提示词工程。当用户需要添加 AI 功能、集成 LLM、或开发 AI 驱动的业务功能时使用。 |
CodeSpirit 项目支持三种 AI 功能模式:
需要AI功能?
├── 单字段触发填充?
│ └── 是 → AI 表单填充(字段触发模式)
│
├── 用户自定义需求填充整个表单?
│ └── 是 → AI 表单填充(全局填充模式)
│
├── 批量生成/长时间任务?
│ └── 是 → AI 长任务处理
│
└── 内容分析/审核/生成?
└── 是 → LLM 结构化任务
在 Program.cs 或 API 配置类中:
// 注册 LLM 服务(必需)
builder.Services.AddLLMServices();
// 注册 AI 表单填充自动端点(推荐)
builder.Services.AddAiFormFillEndpoints();
var app = builder.Build();
// 启用 AI 填充中间件
app.UseAiFormFillEndpoints();
字段触发模式:
[AiFormFill(TriggerField = nameof(Topic))]
public class CreateQuestionDto
{
[Required]
[DisplayName("主题")]
public string Topic { get; set; } = string.Empty;
[DisplayName("题目内容")]
[AiFieldFill(Priority = 1, CustomDescription = "根据主题生成的题目内容")]
public string? Content { get; set; }
[DisplayName("选项A")]
[AiFieldFill(Priority = 2)]
public string? OptionA { get; set; }
}
全局填充模式:
[AiFormFill(GlobalFillPrompt = "描述您想创建的内容")]
public class CreateContentDto
{
[DisplayName("标题")]
public string? Title { get; set; }
[DisplayName("内容")]
public string? Content { get; set; }
}
系统自动生成 POST /api/{controller}/ai-fill 端点,无需编写控制器代码。
请求示例:
POST /api/questions/ai-fill
{
"topic": "人工智能"
}
响应示例:
{
"topic": "人工智能",
"content": "人工智能是计算机科学的一个分支...",
"optionA": "..."
}
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TriggerField | string | "" | 触发字段名称,为空时启用全局模式 |
IgnoreFields | string[] | [] | 需要忽略的字段列表 |
CustomPromptTemplate | string | "" | 自定义提示词模板 |
ApiEndpoint | string | "ai-fill" | API端点路径 |
EnableCache | bool | true | 是否启用缓存 |
Temperature | double | 0.1 | 温度参数,控制随机性 |
[AiFormFill(
TriggerField = nameof(Topic),
CustomPromptTemplate = "基于主题 '{Topic}' 生成相关内容,要求专业准确")]
public class CustomPromptDto { }
public class GenerateQuestionsRequest
{
public string Topic { get; set; } = string.Empty;
public int Count { get; set; }
public string Difficulty { get; set; } = "Medium";
}
public class AiTaskStatus
{
public string Status { get; set; } // "pending", "processing", "completed", "failed"
public int Progress { get; set; } // 0-100
public List<string> Logs { get; set; } // 日志列表
public object? Result { get; set; } // 任务结果
public string? ErrorMessage { get; set; } // 错误消息
}
[HttpPost("ai/generate-async")]
[HeaderOperation("AI智能生成", "aiForm",
Icon = "fa-solid fa-magic",
StatusApi = "/exam/api/Questions/ai/task-status", // 状态查询 API(必需)
PollingInterval = 2000, // 轮询间隔(毫秒)
MaxPollingTime = 300000, // 最大轮询时间(5分钟)
FormTitle = "生成配置",
StepsTitle = "AI生成进度",
LogTitle = "生成日志",
ResultTitle = "生成结果")]
[DisplayName("AI智能生成题目")]
public async Task<ActionResult<ApiResponse<string>>> GenerateQuestionsAsync(
[FromBody] GenerateQuestionsRequest request)
{
var taskId = await _aiGeneratorService.GenerateAsync(request);
return SuccessResponse(taskId);
}
[HttpGet("ai/task-status")]
[DisplayName("查询任务状态")]
public async Task<ActionResult<ApiResponse<AiTaskStatus>>> GetTaskStatus(
[FromQuery] string taskId)
{
var status = await _aiGeneratorService.GetTaskStatusAsync(taskId);
return SuccessResponse(status);
}
public class AiGeneratorService : IScopedDependency
{
private readonly LLMAssistant _llmAssistant;
private readonly IMemoryCache _cache;
public async Task<string> GenerateAsync(GenerateQuestionsRequest request)
{
var taskId = Guid.NewGuid().ToString();
// 初始化任务状态
var status = new AiTaskStatus
{
Status = "pending",
Progress = 0,
Logs = new List<string>()
};
_cache.Set($"ai_task_{taskId}", status);
// 后台执行任务
_ = Task.Run(async () => await ProcessTaskAsync(taskId, request));
return taskId;
}
private async Task ProcessTaskAsync(string taskId, GenerateQuestionsRequest request)
{
var status = _cache.Get<AiTaskStatus>($"ai_task_{taskId}");
status.Status = "processing";
status.Logs.Add("开始生成题目...");
try
{
for (int i = 0; i < request.Count; i++)
{
status.Progress = (int)((i + 1) * 100.0 / request.Count);
status.Logs.Add($"正在生成第 {i + 1} 题...");
// 调用 LLM 生成题目
var question = await _llmAssistant.GenerateContentAsync(
$"生成一道关于{request.Topic}的{request.Difficulty}难度题目");
// 保存题目
// ...
}
status.Status = "completed";
status.Progress = 100;
status.Logs.Add("生成完成!");
}
catch (Exception ex)
{
status.Status = "failed";
status.ErrorMessage = ex.Message;
status.Logs.Add($"生成失败: {ex.Message}");
}
}
public async Task<AiTaskStatus> GetTaskStatusAsync(string taskId)
{
return _cache.Get<AiTaskStatus>($"ai_task_{taskId}")
?? new AiTaskStatus { Status = "not_found" };
}
}
public class AuditService : IScopedDependency
{
private readonly LLMAssistant _llmAssistant;
public AuditService(LLMAssistant llmAssistant)
{
_llmAssistant = llmAssistant;
}
}
public static class PromptTemplates
{
public const string QuestionAudit = @"你是一个专业的题目审核专家。
任务:审核以下题目是否符合要求。
题目内容:{Content}
选项:{Options}
要求:
1. 题目内容清晰准确
2. 选项设计合理
3. 只有一个正确答案
输出格式(JSON):
{{
""isValid"": true/false,
""issues"": [""问题1"", ""问题2""],
""suggestions"": [""建议1"", ""建议2""]
}}";
}
public class AuditResult
{
public bool IsValid { get; set; }
public List<string> Issues { get; set; } = new();
public List<string> Suggestions { get; set; } = new();
}
public async Task<AuditResult> AuditQuestionAsync(QuestionDto question)
{
var prompt = PromptTemplates.QuestionAudit
.Replace("{Content}", question.Content)
.Replace("{Options}", string.Join(", ", question.Options));
var result = await _llmAssistant.ProcessStructuredTaskWithTemplateAsync<AuditResult>(
"question_audit",
new { question },
new StructuredTaskOptions
{
EnableRetry = true,
MaxRetries = 2
});
if (result.IsSuccess)
{
return result.Result!;
}
throw new BusinessException($"审核失败: {string.Join("; ", result.Errors)}");
}
public async Task<List<AuditResult>> BatchAuditAsync(List<QuestionDto> questions)
{
var batchResult = await _llmAssistant.ProcessBatchStructuredTaskAsync<QuestionDto, AuditResult>(
questions,
batch => BuildBatchPrompt(batch),
new BatchProcessingOptions
{
BatchSize = 10,
MaxRetries = 2,
DelayBetweenBatches = TimeSpan.FromSeconds(1),
ContinueOnFailure = true
});
return batchResult.SuccessResults
.Where(r => r.IsSuccess)
.Select(r => r.Result!)
.ToList();
}
你是一个专业的{角色}。
任务:根据以下信息生成一道高质量的题目。
主题:{Topic}
题型:{QuestionType}
难度:{Difficulty}
输出格式(JSON):
{
"Content": "string, 必填。题目内容",
"OptionA": "string, 必填。选项A内容",
"OptionB": "string, 必填。选项B内容"
}
要求:
1. 题目内容不超过 2000 字符
2. 选项设计合理,避免明显错误
3. 只有一个正确答案
示例:
输入:主题="人工智能",难度="Medium"
输出:{
"Content": "人工智能的核心技术包括哪些?",
"OptionA": "机器学习、深度学习、自然语言处理",
...
}
参见 prompt-templates/ 目录:
question-generator.txt:题目生成提示词content-audit.txt:内容审核提示词survey-generator.txt:问卷生成提示词| 错误类型 | 原因 | 处理方式 |
|---|---|---|
| 401 Unauthorized | API 密钥无效 | 检查配置,更新密钥 |
| 400 Bad Request | 模型名称错误 | 验证模型名称是否正确 |
| 429 Too Many Requests | 请求限流 | 添加重试和延迟 |
| Timeout | 请求超时 | 增加超时时间,拆分请求 |
| JSON解析失败 | 响应格式不正确 | 使用 ILLMJsonProcessor 自动修复 |
系统自动处理:
public async Task<T> SafeGenerateAsync<T>(string prompt) where T : class
{
try
{
var result = await _llmAssistant.ProcessStructuredTaskWithTemplateAsync<T>(
"template",
new { prompt },
new StructuredTaskOptions { EnableRetry = true, MaxRetries = 3 });
if (result.IsSuccess)
{
return result.Result!;
}
_logger.LogError("AI生成失败: {Errors}", string.Join("; ", result.Errors));
throw new BusinessException("AI生成失败,请稍后重试");
}
catch (HttpRequestException ex)
{
_logger.LogError(ex, "LLM API请求失败");
throw new BusinessException("AI服务暂时不可用");
}
catch (TaskCanceledException ex)
{
_logger.LogError(ex, "LLM请求超时");
throw new BusinessException("AI响应超时,请缩短输入或稍后重试");
}
}
[AiFormFill(
TriggerField = nameof(Topic),
EnableCache = true, // 启用缓存
CacheExpirationMinutes = 30 // 30分钟过期
)]
缓存键规则:包含输入内容的哈希值,相同输入直接返回缓存结果。
var options = new BatchProcessingOptions
{
BatchSize = 10, // 每批10条
DelayBetweenBatches = TimeSpan.FromSeconds(1), // 批次间延迟
MaxRetries = 2, // 最大重试次数
ContinueOnFailure = true // 失败时继续处理
};
MaxTokens,避免过度消耗// ✅ 使用 Aspire 统一配置(推荐)
var llmApiKey = builder.AddParameter("llm-ApiKey", secret: true);
// ✅ 使用环境变量
.WithEnvironment("LLM__ApiKey", llmApiKey)
// ❌ 禁止:硬编码密钥
var apiKey = "sk-xxxxxxxx"; // 绝对禁止!
// 排除敏感字段
[AiFieldFill(Enabled = false)]
public string Password { get; set; }
// 使用 IgnoreFields
[AiFormFill(
TriggerField = nameof(Name),
IgnoreFields = new[] { "Password", "IdCard", "BankAccount" }
)]
[HttpPost("ai-fill")]
[Authorize]
[RequirePermission("Question.AiFill")]
public async Task<ActionResult> AiFill([FromBody] CreateQuestionDto dto)
{
// AI 填充需要特定权限
}
开发 AI 功能时:
AddLLMServices)AiFormFill、AiFieldFill)