sauravbhattacharya001/prompt

GitHub: sauravbhattacharya001/prompt

一个基于 .NET 8 的 Azure OpenAI 提示工程库,提供模板编排、安全防护与全链路测试,简化提示管理与合规治理。

Stars: 1 | Forks: 0

# 🤖 提示词 **一个用于 Azure OpenAI 提示词工程的综合 .NET 库** [![NuGet](https://img.shields.io/nuget/v/prompt-llm-aoi?style=flat-square&logo=nuget&color=004880)](https://www.nuget.org/packages/prompt-llm-aoi) [![NuGet Downloads](https://img.shields.io/nuget/dt/prompt-llm-aoi?style=flat-square&logo=nuget&color=004880)](https://www.nuget.org/packages/prompt-llm-aoi) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](LICENSE) [![.NET](https://img.shields.io/badge/.NET-8.0-blueviolet?style=flat-square&logo=dotnet)](https://dotnet.microsoft.com/download/dotnet/8.0) [![CodeQL](https://img.shields.io/github/actions/workflow/status/sauravbhattacharya001/prompt/codeql.yml?style=flat-square&label=CodeQL&logo=github)](https://github.com/sauravbhattacharya001/prompt/actions/workflows/codeql.yml) [![CI](https://img.shields.io/github/actions/workflow/status/sauravbhattacharya001/prompt/ci.yml?style=flat-square&label=CI&logo=github)](https://github.com/sauravbhattacharya001/prompt/actions/workflows/ci.yml) [![Publish](https://img.shields.io/github/actions/workflow/status/sauravbhattacharya001/prompt/nuget-publish.yml?style=flat-square&label=Publish&logo=github)](https://github.com/sauravbhattacharya001/prompt/actions/workflows/nuget-publish.yml) [![codecov](https://img.shields.io/codecov/c/github/sauravbhattacharya001/prompt?style=flat-square&logo=codecov)](https://codecov.io/gh/sauravbhattacharya001/prompt) ![Tests](https://img.shields.io/badge/tests-1011%20passed-brightgreen?style=flat-square) [![Docker](https://img.shields.io/github/actions/workflow/status/sauravbhattacharya001/prompt/docker.yml?style=flat-square&label=Docker&logo=docker)](https://github.com/sauravbhattacharya001/prompt/actions/workflows/docker.yml) [![Pages](https://img.shields.io/github/actions/workflow/status/sauravbhattacharya001/prompt/pages.yml?style=flat-square&label=Docs&logo=github)](https://sauravbhattacharya001.github.io/prompt/) [![GitHub Release](https://img.shields.io/github/v/release/sauravbhattacharya001/prompt?style=flat-square&logo=github&color=blue)](https://github.com/sauravbhattacharya001/prompt/releases) [![Last Commit](https://img.shields.io/github/last-commit/sauravbhattacharya001/prompt?style=flat-square&logo=git&color=orange)](https://github.com/sauravbhattacharya001/prompt/commits/main) 发送提示到 Azure OpenAI 并获取响应 —— 支持模板、链式、安全防护、令牌管理、版本控制以及完整的提示工程工具包。零样板代码。 [安装指南](#installation) · [快速开始](#quick-start) · [完整类库](#full-class-library) · [API 参考](#api-reference) · [更新日志](CHANGELOG.md)
## ✨ 功能特性 ### 核心功能 - **单方法调用** — `GetResponseAsync()` 处理所有流程 - **多轮对话** — `Conversation` 类维护消息历史,跨轮次保持上下文 - **可配置参数** — `PromptOptions` 类提供预设(`ForCodeGeneration()`、`ForCreativeWriting()` 等) - **自动重试** — 对 429 限流与 503 错误采用指数退避策略 - **取消支持** — 传递 `CancellationToken` 以取消长时间运行请求 - **连接池** — 线程安全的单例客户端,采用双重检查锁定 ### 提示词工程 - **模板** — `PromptTemplate` 支持 `{{variable}}` 占位符、默认值、校验与组合 - **链式** — `PromptChain` 按顺序串联多个提示,每步输出作为下一步变量 - **编排器** — `PromptComposer` 流畅构建器,支持人格、上下文、任务、约束、示例与输出格式 - **少样本构造器** — `FewShotBuilder` 支持 5 种格式与令牌预算感知的少样本提示构建 - **库** — `PromptLibrary` 集中模板注册,支持搜索、分类、标签与 8 个内置模板 - **路由** — `PromptRouter` 基于意图的路由,支持关键词/正则评分与回退 ### 安全与质量 - **防护** — `PromptGuard` 注入检测(10 个攻击向量)、质量评分(0–100,A–F 级)、清洗与格式封装 - **令牌预算** — `TokenBudget` 自动修剪对话以适配模型上下文窗口,支持 3 种修剪策略 - **测试套件** — `PromptTestSuite` 自动化提示评估框架,支持 10 种断言类型与可插拔响应提供器 ### 管理 - **版本管理** — `PromptVersionManager` 支持提示模板的版本历史、行级差异与回滚 - **响应解析器** — `ResponseParser` 从 LLM 响应中提取结构化数据(JSON、列表、表格、键值对、代码块) - **序列化** — 所有类均支持 JSON 往返(ToJson/FromJson/SaveToFileAsync/LoadFromFileAsync) ### 基础设施 - **1,000+ 测试** — 全面的 xUnit 测试套件 - **跨平台** — 在 Windows、Linux 与 macOS 上解析环境变量 - **NuGet 就绪** — 以 [`prompt-llm-aoi`](https://www.nuget.org/packages/prompt-llm-aoi) 发布 ### 完整类库 | 类 | 描述 | |-------|-------------| | [`Conversation`](#conversation-class) | 带可配置模型参数的多轮消息历史 | | `FewShotBuilder` | 支持 5 种格式与令牌预算集成的少样本提示构造 | | [`Main`](#maingettresponseasync) | 带重试与取消的单次调用 Azure OpenAI 补全 | | `PromptABTester` | 提示变体性能的 A/B 测试框架 | | `PromptAnalytics` | 提示使用分析与指标收集 | | `PromptAnnotation` | 提示中的结构化内联注释与元数据 | | `PromptAuditLog` | 不可变的哈希链执行审计轨迹 | | `PromptBatchProcessor` | 带并发控制的批量提示执行 | | `PromptBenchmarkSuite` | 对提示变体进行测试场景基准测试 | | `PromptCache` | 带可配置过期策略的响应缓存 | | `PromptCatalogExporter` | 将提示库导出为 HTML、CSV 与 JSON 格式 | | [`PromptChain`](#promptchain-class) | 多步骤 LLM 流水线,步骤间变量自动转发 | | `PromptChainVisualizer` | 从提示链生成 Mermaid、DOT 与 ASCII 流程图 | | `PromptChangeImpactAnalyzer` | 提示模板变更的冲击范围分析 | | `PromptChangelogGenerator` | 带多种输出格式的版本历史格式化变更日志 | | `PromptChatFormatter` | 多提供程序聊天消息格式化 | | `PromptCompatibilityChecker` | 跨提供程序提示可移植性分析 | | `PromptComplexityScorer` | 多维度提示复杂度分析 | | `PromptComplianceChecker` | 提示的策略与监管合规性校验 | | `PromptComposer` | 带语义分区与 4 种预设的可流畅结构化提示构造 | | `PromptConditional` | 提示模板的条件逻辑 | | `PromptContextBuilder` | 基于令牌预算的优先级提示上下文组装 | | `PromptContextCompressor` | 带 4 种策略的智能对话上下文压缩 | | `PromptCostEstimator` | 基于令牌的提示执行成本估算 | | `PromptCoverageAnalyzer` | 库覆盖分析与健康评分 | | `PromptDatasetBuilder` | 评估与微调数据集构造 | | `PromptDebugger` | 深度结构分析 —— 反模式检测、清晰度评分与修复建议 | | `PromptDependencyGraph` | 提示流水线的 DAG 分析 | | `PromptDiff` | 提示版本间的行级差异对比 | | `PromptDocGenerator` | 从提示模板自动生成文档 | | `PromptEnsemble` | 多响应聚合(多数投票、最佳 N、共识) | | `PromptEnvironmentManager` | 环境相关提示配置管理 | | `PromptExplainer` | 分析提示中的技术、章节与改进建议 | | `PromptFallbackChain` | 带自动回退的多模型健壮执行 | | `PromptFingerprint` | 基于内容的提示指纹用于去重 | | `PromptFuzzer` | 鲁棒性测试 —— 通过 7 种变异策略生成提示变体 | | `PromptGoldenTester` | 提示输出的快照测试 | | `PromptGrammarValidator` | 响应格式校验,11 种规则类型(正则、JSON、长度、结构) | | `PromptGuard` | 注入检测、质量评分、清洗与输出封装 | | `PromptHealthCheck` | 库级质量分析与健康评分 | | `PromptHistory` | 提示执行历史追踪与检索 | | `PromptInheritance` | 块级模板继承,支持 `{{super}}` | | `PromptInterpolator` | 基于管道的模板变量转换 | | `PromptLibrary` | 中央模板注册表,支持 CRUD、按分类/标签搜索、合并与 8 个内置模板 | | `PromptLinter` | 基于规则的静态提示分析 | | `PromptLocalizer` | 提示本地化与翻译管理 | | `PromptMarkdownExporter` | 导出/导入提示库为 Markdown 格式 | | `PromptMatrix` | 提示变量的组合测试 | | `PromptMerger` | 合并与组合多个提示模板 | | `PromptMetadataExtractor` | 结构化提示分析用于路由与分析 | | `PromptMigrationAssistant` | 跨提供程序提示适配助手 | | `PromptMinifier` | 提示压缩与空白优化 | | `PromptNegotiator` | 带验证反馈循环的迭代提示优化 | | `PromptOptions` | 模型参数预设(代码生成、创意写作、数据提取、摘要) | | `PromptOutputValidator` | 基于可配置规则的 LLM 响应校验 | | `PromptPerformanceProfiler` | 执行分析,含百分位、对比与报告 | | `PromptPipeline` | 带中间件的提示处理流水线 | | `PromptPromotionManager` | 生命周期阶段管理,含审批门与回滚 | | `PromptQualityGate` | 可通过/失败的提示校验门 | | `PromptRateLimiter` | 请求速率限制与节流 | | `PromptRefactorer` | 自动化提示重构与优化建议 | | `PromptReplayRecorder` | 类 VCR 的提示交互记录与回放 | | `PromptResponseEvaluator` | 5 个维度(相关性、完整性等)的启发式质量评分 | | `PromptRetryPolicy` | 带退避、断路器与错误分类的可配置重试 | | `PromptRiskAssessor` | 多维度安全风险分析 | | `PromptRouter` | 基于意图的提示路由,支持关键词/正则评分与回退 | | `PromptSamplerConfig` | LLM 采样参数构造器 | | `PromptSanitizer` | 提示清理与标准化工具 | | `PromptSchemaGenerator` | 流畅的结构化输出模式构造 | | `PromptScorecardBuilder` | 带权重评分的自定义评估量表 | | `PromptSemanticSearch` | 基于语义相似性的提示库检索 | | `PromptSignature` | 强类型提示签名(DSPy 风格) | | `PromptSimilarityAnalyzer` | 多指标提示对比与重复检测 | | `PromptSlotFiller` | 结构化槽位提取与多轮填充 | | `PromptSnapshotManager` | 时间点库快照,含差异对比与回滚 | | `PromptSplitter` | 边界感知的内容分块(用于长提示) | | `PromptStreamParser` | 实时流式内容提取 | | `PromptStyleTransfer` | 启发式提示语气与风格改写 | | [`PromptTemplate`](#prompttemplate-class) | 支持 `{{variable}}` 占位符、默认值、校验与组合的复用模板 | | `PromptTestSuite` | 带 10 种断言类型与可插拔响应提供器的自动化提示评估 | | `PromptTokenOptimizer` | 令牌使用优化与提示压缩 | | `PromptToolFormatter` | 跨 LLM 提供商的统一工具/函数调用格式 | | `PromptUsageReport` | 含按时间分桶统计与成本分析的全面使用报告 | | `PromptVariantGenerator` | 为测试生成提示变体 | | `PromptVersionManager` | 提示模板的版本历史、行级差异与回滚 | | `PromptWorkflow` | 基于 DAG 的提示工作流引擎 | | `ResponseParser` | 从 LLM 响应中提取 JSON、列表、表格、键值对与代码块 | | `SerializationGuards` | 反序列化的输入校验与安全检查 | | `StreamChunk` | 流式响应解析的 Typed Chunk 模型 | | `TokenBudget` | 上下文窗口管理,含 3 种修剪策略与 15+ 模型预设 | ## 先决条件 - [.NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0) 或更高版本 - 已部署模型的 [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) 资源 ## 安装 ``` dotnet add package prompt-llm-aoi ``` ## 配置 设置以下环境变量: | 变量 | 描述 | 示例 | |---|---|---| | `AZURE_OPENAI_API_URI` | Azure OpenAI 终结点 URI | `https://myresource.openai.azure.com/` | | `AZURE_OPENAI_API_KEY` | Azure OpenAI API 密钥 | `sk-...` | | `AZURE_OPENAI_API_MODEL` | 已部署的模型名称 | `gpt-4` | ## 快速开始 ``` using Prompt; // Simple prompt (single-turn) string? response = await Main.GetResponseAsync("Explain quantum computing in simple terms."); Console.WriteLine(response); ``` ### 使用自定义选项 使用 `PromptOptions` 为任意用例自定义模型行为: ``` using Prompt; // Code generation — low temperature, high token limit var codeOpts = PromptOptions.ForCodeGeneration(); string? code = await Main.GetResponseAsync( "Write a merge sort in C#", options: codeOpts); // Creative writing — high temperature var creativeOpts = PromptOptions.ForCreativeWriting(); string? story = await Main.GetResponseAsync( "Write a short story about a time-traveling cat", options: creativeOpts); // Custom configuration var custom = new PromptOptions { Temperature = 0.4f, MaxTokens = 4000, TopP = 0.9f, FrequencyPenalty = 0.3f, PresencePenalty = 0.1f }; string? result = await Main.GetResponseAsync("Summarize this article...", options: custom); ``` **内置预设:** | 预设 | 温度 | 最大令牌 | TopP | 用途 | |---|---|---|---|---| | `ForCodeGeneration()` | 0.1 | 4000 | 0.95 | 确定性代码输出 | | `ForCreativeWriting()` | 0.9 | 2000 | 0.9 | 故事、诗歌、创意文本 | | `ForDataExtraction()` | 0.0 | 2000 | 1.0 | JSON、结构化输出 | | `ForSummarization()` | 0.3 | 1000 | 0.9 | 文本摘要 | ## 多轮对话 `Conversation` 类维护消息历史,使模型拥有完整上下文: ``` using Prompt; var conv = new Conversation("You are a helpful math tutor."); string? r1 = await conv.SendAsync("What is 2+2?"); Console.WriteLine(r1); // "4" string? r2 = await conv.SendAsync("Now multiply that by 3."); Console.WriteLine(r2); // "12" — the model remembers the context! string? r3 = await conv.SendAsync("What was my first question?"); Console.WriteLine(r3); // It knows: "What is 2+2?" ``` ### 自定义参数 每轮对话均可拥有独立的模型参数,可通过 `PromptOptions` 或单独属性设置: ``` // Using PromptOptions (recommended) var opts = PromptOptions.ForCreativeWriting(); var conv = new Conversation("You are a creative writer.", opts); // Or set properties individually var conv2 = new Conversation("You are a creative writer.") { Temperature = 1.2f, // More creative MaxTokens = 2000, // Longer responses TopP = 0.9f, FrequencyPenalty = 0.5f // Less repetition }; string? story = await conv.SendAsync("Write a short story about a robot."); ``` ### 重放对话 注入先前的消息,为模型提供上一会话的上下文: ``` var conv = new Conversation("You are a coding assistant."); conv.AddUserMessage("How do I sort a list in C#?"); conv.AddAssistantMessage("Use list.Sort() for in-place sorting or list.OrderBy() for LINQ."); // Now continue the conversation with full context string? response = await conv.SendAsync("Show me the LINQ version with a custom comparer."); ``` ### 对话历史 导出对话用于日志记录、序列化或展示: ``` var conv = new Conversation("System prompt"); conv.AddUserMessage("Hello"); conv.AddAssistantMessage("Hi there!"); List<(string Role, string Content)> history = conv.GetHistory(); foreach (var (role, content) in history) Console.WriteLine($"[{role}] {content}"); // [system] System prompt // [user] Hello // [assistant] Hi there! ``` ### 清除历史 重置对话但保留系统提示: ``` var conv = new Conversation("You are helpful."); conv.AddUserMessage("Hello"); conv.Clear(); // Removes user/assistant messages, keeps system prompt ``` ### 保存与加载对话 将对话保存为 JSON 并随时恢复 —— 适用于持久化会话、跨应用共享或实现对话历史: ``` var conv = new Conversation("You are a coding tutor."); await conv.SendAsync("Explain SOLID principles"); await conv.SendAsync("Show me an example of SRP"); // Save to JSON string string json = conv.SaveToJson(); // Save to file await conv.SaveToFileAsync("session.json"); // Later... restore from JSON var restored = Conversation.LoadFromJson(json); // Or restore from file var fromFile = await Conversation.LoadFromFileAsync("session.json"); // Continue the conversation with full context string? response = await fromFile.SendAsync("Now show me OCP"); ``` 序列化的 JSON 包含所有消息与模型参数(温度、最大令牌等),因此恢复的对话是精确副本: ``` { "messages": [ { "role": "system", "content": "You are a coding tutor." }, { "role": "user", "content": "Explain SOLID principles" }, { "role": "assistant", "content": "SOLID stands for..." } ], "parameters": { "temperature": 0.7, "maxTokens": 800, "topP": 0.95, "frequencyPenalty": 0, "presencePenalty": 0, "maxRetries": 3 } } ``` ## 提示模板 `PromptTemplate` 类允许你定义带有 `{{variable}}` 占位符的可复用提示。设置默认值、校验输入、组合模板并序列化以共享。 ### 基础用法 ``` using Prompt; var template = new PromptTemplate( "You are a {{role}} assistant. Help the user with {{topic}}.", new Dictionary { ["role"] = "helpful" } ); // Render with variables (role uses default, topic is provided) string prompt = template.Render(new Dictionary { ["topic"] = "C# programming" }); // → "You are a helpful assistant. Help the user with C# programming." ``` ### 变量自省 ``` var template = new PromptTemplate( "Translate {{text}} from {{source}} to {{target}}.", new Dictionary { ["source"] = "English" } ); HashSet all = template.GetVariables(); // { "text", "source", "target" } HashSet required = template.GetRequiredVariables(); // { "text", "target" } — source has a default ``` ### 严格与非严格渲染 ``` var template = new PromptTemplate("Hello {{name}}, you are {{role}}!"); // Strict (default) — throws if variables are missing template.Render(); // ❌ InvalidOperationException // Non-strict — leaves unresolved placeholders as-is string result = template.Render(strict: false); // → "Hello {{name}}, you are {{role}}!" ``` ### 组合模板 将模板串联以构建复杂提示,来自可复用部件: ``` var persona = new PromptTemplate( "You are a {{role}} with expertise in {{domain}}.", new Dictionary { ["role"] = "senior developer" } ); var task = new PromptTemplate( "Review this code and suggest improvements:\n{{code}}"); var combined = persona.Compose(task); string prompt = combined.Render(new Dictionary { ["domain"] = "C#", ["code"] = "public void Foo() { /* ... */ }" }); ``` ### 一次性渲染并发送 跳过手动渲染步骤,直接发送至 Azure OpenAI: ``` // Single-turn var template = new PromptTemplate("Explain {{concept}} in simple terms."); string? response = await template.RenderAndSendAsync( new Dictionary { ["concept"] = "recursion" }, systemPrompt: "You are a teacher." ); // Multi-turn (with existing Conversation) var conv = new Conversation("You are a coding tutor."); await template.RenderAndSendAsync(conv, new Dictionary { ["concept"] = "closures" }); ``` ### 保存与加载模板 ``` var template = new PromptTemplate( "Summarize {{text}} in {{style}} style.", new Dictionary { ["style"] = "concise" } ); // Save to file await template.SaveToFileAsync("summarizer.json"); // Load from file var loaded = await PromptTemplate.LoadFromFileAsync("summarizer.json"); // Or use JSON strings directly string json = template.ToJson(); var restored = PromptTemplate.FromJson(json); ``` ## 提示链 `PromptChain` 类允许构建多步骤 LLM 流水线,其中每步的输出自动成为后续步骤的变量。适用于“先总结后翻译”或“先提取后分析”等顺序推理模式。 ### 基础链 ``` using Prompt; var chain = new PromptChain() .AddStep("summarize", new PromptTemplate("Summarize this text in 2 sentences: {{text}}"), "summary") .AddStep("translate", new PromptTemplate("Translate to French: {{summary}}"), "french") .AddStep("keywords", new PromptTemplate("Extract 5 keywords from: {{summary}}"), "keywords"); var result = await chain.RunAsync(new Dictionary { ["text"] = "Your long article text here..." }); Console.WriteLine(result.FinalResponse); // keywords output Console.WriteLine(result.GetOutput("summary")); // the summary Console.WriteLine(result.GetOutput("french")); // the French translation ``` ### 链配置 ``` var chain = new PromptChain() .WithSystemPrompt("You are a precise analyst.") .WithMaxRetries(5) .AddStep("extract", new PromptTemplate("Extract key facts from: {{document}}"), "facts") .AddStep("analyze", new PromptTemplate("Analyze these facts for trends: {{facts}}"), "analysis"); ``` ### 校验 在运行前检查所有变量是否已满足(无需 API 调用): ``` var chain = new PromptChain() .AddStep("s1", new PromptTemplate("Process: {{input}}"), "result") .AddStep("s2", new PromptTemplate("Refine: {{result}}"), "final"); List errors = chain.Validate( new Dictionary { ["input"] = "test" }); if (errors.Count == 0) Console.WriteLine("Chain is valid!"); else errors.ForEach(Console.WriteLine); ``` ### 链结果 每步均被记录,包含耗时、渲染提示与响应: ``` var result = await chain.RunAsync(initialVars); Console.WriteLine($"Total time: {result.TotalElapsed.TotalSeconds}s"); Console.WriteLine($"Steps: {result.Steps.Count}"); foreach (var step in result.Steps) { Console.WriteLine($" [{step.StepName}] {step.Elapsed.TotalMilliseconds}ms"); Console.WriteLine($" Prompt: {step.RenderedPrompt}"); Console.WriteLine($" Response: {step.Response}"); } // Export results as JSON for logging/analysis string json = result.ToJson(); ``` ### 保存与加载链 ``` var chain = new PromptChain() .WithSystemPrompt("Be helpful") .AddStep("step1", new PromptTemplate("Summarize: {{text}}"), "summary"); // Save to file await chain.SaveToFileAsync("my-chain.json"); // Load from file var loaded = await PromptChain.LoadFromFileAsync("my-chain.json"); // Or use JSON strings string chainJson = chain.ToJson(); var restored = PromptChain.FromJson(chainJson); ``` ## 使用示例 ###提示 设置助理行为以控制响应风格: ``` string? response = await Main.GetResponseAsync( "Summarize this text: ...", systemPrompt: "You are a concise summarizer. Respond in 2-3 sentences max."); ``` ### 取消 使用超时取消长时间运行请求: ``` using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); try { string? response = await Main.GetResponseAsync("Hello!", cancellationToken: cts.Token); } catch (OperationCanceledException) { Console.WriteLine("Request timed out."); } ``` ### 自定义重试策略 调整临时故障的重试次数: ``` // Default: 3 retries with exponential backoff string? response = await Main.GetResponseAsync("Hello!"); // Custom: 5 retries for high-reliability scenarios string? response = await Main.GetResponseAsync("Hello!", maxRetries: 5); ``` ### 重置客户端 强制客户端重新读取环境变量(适用于运行时配置变更): ``` Main.ResetClient(); ``` ## API 参考 ### Main.GetResponseAsync() ``` public static async Task GetResponseAsync( string prompt, string? systemPrompt = null, int maxRetries = 3, CancellationToken cancellationToken = default) ``` | 参数 | 类型 | 默认值 | 描述 | |---|---|---|---| | `prompt` | `string` | *(必需)* | 要发送给用户的提示 | | `systemPrompt` | `string?` | `null` | 可选系统提示,用于控制助理行为 | | `maxRetries` | `int` | `3` | 临时故障的最大重试次数 | | `cancellationToken` | `CancellationToken` | `default` | 用于取消操作的令牌 | **返回:** `Task` — 模型的响应文本,若无响应则返回 `null`。 **异常:** - `ArgumentException` — 若 `prompt` 为空或空字符串 - `ArgumentOutOfRangeException` — 若 `maxRetries` 为负数 - `InvalidOperationException` — 若缺少必需的环境变量 - `OperationCanceledException` — 若通过令牌取消 ### Main.ResetClient() ``` public static void ResetClient() ``` 清除缓存客户端,强制下次调用时重新初始化。线程安全。 ### `Conversation` 类 ``` public class Conversation ``` 带完整消息历史记录和可配置模型参数的多轮对话管理器。 #### 构造函数 | 参数 | 类型 | 默认值 | 描述 | |---|---|---|---| | `systemPrompt` | `string?` | `null` | 整个对话的可选系统提示 | #### 方法 | 方法 | 返回值 | 描述 | |---|---|---| | `SendAsync(message, cancellationToken)` | `Task` | 发送消息并返回响应。两者均加入历史记录 | | `AddUserMessage(message)` | `void` | 向历史记录添加用户消息,不调用 API | | `AddAssistantMessage(message)` | `void` | 向历史记录添加助理消息,不调用 API | | `Clear()` | `void` | 清除历史记录,保留系统提示 | | `GetHistory()` | `List<(string Role, string Content)>` | 返回对话快照 | | `SaveToJson(indented)` | `string` | 序列化对话(消息与参数)为 JSON 字符串 | | `LoadFromJson(json)` | `Conversation` | *静态*。从 JSON 字符串恢复对话 | | `SaveToFileAsync(filePath, indented, cancellationToken)` | `Task` | 将对话保存到 JSON 文件 | | `LoadFromFileAsync(filePath, cancellationToken)` | `Task` | *静态*。从 JSON 文件加载对话 | #### 属性 | 属性 | 类型 | 默认值 | 范围 | 描述 | |---|---|---|---|---| | `MessageCount` | `int` | — | — | 包含系统提示的消息数量 | | `Temperature` | `float` | `0.7` | `0.0–2.0` | 采样温度 | | `MaxTokens` | `int` | `800` | `≥ 1` | 最大响应令牌数 | | `TopP` | `float` | `0.95` | `0.0–1.0` | 核采样 | | `FrequencyPenalty` | `float` | `0.0` | `-2.0–2.0` | 频率惩罚 | | `PresencePenalty` | `float` | `0.0` | `-2.0–2.0` | 存在惩罚 | | `MaxRetries` | `int` | `3` | `≥ 0` | 临时故障重试次数 | ### `PromptTemplate` 类 ``` public class PromptTemplate ``` 支持 `{{variable}}` 占位符、默认值、校验与组合的复用提示模板。 #### 构造函数 | 参数 | 类型 | 默认值 | 描述 | |---|---|---|---| | `template` | `string` | *(必需)* | 包含 `{{variable}}` 占位符的模板字符串 | | `defaults` | `Dictionary?` | `null` | 变量的默认值 | #### 方法 | 方法 | 返回值 | 描述 | |---|---|---| | `Render(variables, strict)` | `string` | 通过替换占位符渲染模板。严格模式下缺失变量将抛出异常 | | `RenderAndSendAsync(variables, systemPrompt, maxRetries, cancellationToken)` | `Task` | 渲染并作为单轮提示发送至 `Main.GetResponseAsync()` | | `RenderAndSendAsync(conversation, variables, cancellationToken)` | `Task` | 渲染并作为消息发送至现有 `Conversation` | | `GetVariables()` | `HashSet` | 返回模板中所有变量名 | | `GetRequiredVariables()` | `HashSet` | 返回无默认值的变量名 | | `SetDefault(name, value)` | `void` | 设置或更新变量默认值 | | `RemoveDefault(name)` | `bool` | 移除默认值,使变量变为必需 | | `Compose(other, separator)` | `PromptTemplate` | 合并两个模板及其默认值 | | `ToJson(indented)` | `string` | 序列化模板为 JSON 字符串 | | `FromJson(json)` | `PromptTemplate` | *静态*。从 JSON 字符串反序列化模板 | | `SaveToFileAsync(filePath, indented, cancellationToken)` | `Task` | 将模板保存到 JSON 文件 | | `LoadFromFileAsync(filePath, cancellationToken)` | `Task` | *静态*。从 JSON 文件加载模板 | #### 属性 | 属性 | 类型 | 描述 | |---|---|---| | `Template` | `string` | 原始模板字符串 | | `Defaults` | `IReadOnlyDictionary` | 默认值的只读副本 | ### `PromptChain` 类 ``` public class PromptChain ``` 多步骤提示流水线,每步的输出自动作为下一步的变量。适用于“总结后翻译”、“提取后分析”等顺序推理模式。 #### 方法 | 方法 | 返回值 | 描述 | |---|---|---| | `AddStep(name, template, outputVariable)` | `PromptChain` | 添加步骤(流畅接口)。输出变量名必须唯一 | | `WithSystemPrompt(systemPrompt)` | `PromptChain` | 设置所有 API 调用的系统提示(流畅接口) | | `WithMaxRetries(maxRetries)` | `PromptChain` | 设置 API 调用重试次数(流畅接口) | | `RunAsync(initialVariables, cancellationToken)` | `Task` | 顺序执行所有步骤 | | `Validate(initialVariables)` | `List` | 检查所有必需变量是否可满足(不调用 API) | | `ToJson(indented)` | `string` | 将链定义序列化为 JSON | | `FromJson(json)` | `PromptChain` | *静态*。从 JSON 反序列化链 | | `SaveToFileAsync(filePath, indented, cancellationToken)` | `Task` | 将链定义保存到 JSON 文件 | | `LoadFromFileAsync(filePath, cancellationToken)` | `Task` | *静态*。从 JSON 文件加载链 | #### 属性 | 属性 | 类型 | 描述 | |---|---|---| | `StepCount` | `int` | 链中步骤数量 | | `Steps` | `IReadOnlyList` | 链步骤的只读视图 | ### `ChainResult` 类 | 属性 / 方法 | 类型 | 描述 | |---|---|---| | `Steps` | `IReadOnlyList` | 有序的步骤结果 | | `Variables` | `IReadOnlyDictionary` | 累积的所有 | | `TotalElapsed` | `TimeSpan` | 总执行耗时 | | `FinalResponse` | `string?` | 最后一步的响应(便捷访问) | | `GetOutput(variableName)` | `string?` | 按变量名获取某步的输出 | | `ToJson(indented)` | `string` | 序列化结果为 JSON,用于日志记录 | ### 默认模型参数 | 参数 | 值 | |---|---| | 温度 | 0.7 | | 最大令牌 | 800 | | TopP | 0.95 | | 频率惩罚 | 0 | | 存在惩罚 | 0 | ## 技术栈 | 组件 | 技术 | |---|---| | 语言 | C# 12 | | 框架 | .NET 8.0 | | SDK | [Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI) 2.1.0 | | 重试 | Azure.Core 管道(指数退避与抖动) | | 安全 | [CodeQL](https://github.com/sauravbhattacharya001/prompt/actions/workflows/codeql.yml) | | 包 | [NuGet](https://www.nuget.org/packages/prompt-llm-aoi) | ## 架构 ``` ┌─────────────────────────────────────────────────────┐ │ Your Application │ └──────────────────────┬──────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────┐ │ Prompt Library (this) │ │ │ │ ┌─── Prompt Engineering ─────────────────────────┐ │ │ │ PromptTemplate PromptChain PromptComposer │ │ │ │ FewShotBuilder PromptLibrary PromptRouter │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ ┌─── Safety & Quality ───────────────────────────┐ │ │ │ PromptGuard TokenBudget PromptTestSuite │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ ┌─── Management ─────────────────────────────────┐ │ │ │ PromptVersionManager ResponseParser │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ ┌─── Runtime ────────────────────────────────────┐ │ │ │ Main (Singleton) Conversation PromptOptions │ │ │ │ Env Config Retry Pipeline │ │ │ └────────────────────────────────────────────────┘ │ └──────────────────────┬──────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────┐ │ Azure OpenAI Service │ │ Chat Completions API (GPT-4) │ └─────────────────────────────────────────────────────┘ ``` ## 贡献 欢迎贡献!请: 1. 叉仓库 2. 创建功能分支 (`git checkout -b feature/amazing-feature`) 3. 提交更改 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建拉取请求 ## 许可证 本项目采用 MIT 许可证 —— 参见 [LICENSE](LICENSE) 文件详情。
由 [Saurav Bhattacharya](https://github.com/sauravbhattacharya001) 制作
标签:AI 安全, Azure OpenAI, Bias Detector, CodeQL, Docker, Injection Detection, .NET 8, NLP, NuGet, Prompt Chaining, Template Engine, 人工智能, 代码生成, 大模型, 大语言模型蜜罐, 安全评估工具, 安全防御评估, 开源, 提示词工程, 提示词注入检测, 渗透测试工具, 用户模式Hook绕过, 策略决策点, 软件开发