Skip to content

Latest commit

 

History

History
904 lines (715 loc) · 25 KB

File metadata and controls

904 lines (715 loc) · 25 KB

RAG 提示工程示例和最佳实践

概述

本文档提供了在 RAG (Retrieval Augmented Generation) 系统中进行提示工程的详细示例和最佳实践。这些示例展示了如何为不同场景设计有效的提示模板。

1. 基础提示模板

1.1 通用问答模板

/// <summary>
/// 通用问答的提示模板
/// 适用于大多数知识库问答场景
/// </summary>
public static class GeneralQAPrompts
{
    /// <summary>
    /// 基础问答提示模板
    /// 包含上下文、问题和回答要求
    /// </summary>
    public const string BasicQATemplate = @"
你是一个专业的知识助手。请基于提供的上下文信息回答用户的问题。

上下文信息:
{CONTEXT}

用户问题:{QUERY}

回答要求:
1. 基于上下文信息回答,不要编造信息
2. 如果上下文中没有相关信息,请明确说明
3. 回答要准确、简洁、有条理
4. 如果可能,提供具体的例子或步骤

回答:";

    /// <summary>
    /// 带引用的问答模板
    /// 要求在回答中标注信息来源
    /// </summary>
    public const string QAWithCitationTemplate = @"
你是一个专业的知识助手。请基于提供的上下文信息回答用户的问题,并在回答中标注信息来源。

上下文信息:
{CONTEXT}

用户问题:{QUERY}

回答要求:
1. 基于上下文信息回答,不要编造信息
2. 在回答中使用 [来源X] 的格式标注信息来源
3. 如果上下文中没有相关信息,请明确说明
4. 回答要准确、详细、有逻辑性

回答:";

    /// <summary>
    /// 多语言问答模板
    /// 支持中英文混合问答
    /// </summary>
    public const string MultilingualQATemplate = @"
You are a professional knowledge assistant. Please answer the user's question based on the provided context information. You can respond in Chinese or English based on the user's question language.

Context Information:
{CONTEXT}

User Question: {QUERY}

Requirements:
1. Answer based on context information, do not fabricate information
2. If there is no relevant information in the context, please state clearly
3. The answer should be accurate, concise, and well-organized
4. Provide specific examples or steps if possible
5. Use the same language as the user's question

Answer:";
}

1.2 企业场景专用模板

/// <summary>
/// 企业场景的专用提示模板
/// 针对不同企业部门和业务场景优化
/// </summary>
public static class EnterprisePrompts
{
    /// <summary>
    /// HR政策问答模板
    /// 专门用于人力资源相关问题
    /// </summary>
    public const string HRPolicyTemplate = @"
你是公司的HR助手,专门回答员工关于人力资源政策的问题。请基于公司政策文档回答员工的问题。

公司政策文档:
{CONTEXT}

员工问题:{QUERY}

回答要求:
1. 回答要准确、权威,基于公司正式政策
2. 语言要友好、专业,体现HR的服务精神
3. 如果涉及具体流程,请提供详细步骤
4. 如果政策有时间限制或条件,请明确说明
5. 如果问题超出政策范围,建议联系HR部门

回答:";

    /// <summary>
    /// 技术文档问答模板
    /// 专门用于技术文档和API文档问答
    /// </summary>
    public const string TechnicalDocTemplate = @"
你是一个专业的技术文档助手,专门帮助开发者理解和使用技术文档。

技术文档内容:
{CONTEXT}

开发者问题:{QUERY}

回答要求:
1. 技术准确性:确保所有技术信息准确无误
2. 代码示例:如果相关,提供完整的代码示例
3. 最佳实践:包含相关的最佳实践建议
4. 版本信息:注明相关的版本或兼容性信息
5. 故障排除:如果是问题排查,提供系统性的解决方案
6. 使用Markdown格式,让代码和文档更易读

回答:";

    /// <summary>
    /// 客户服务模板
    /// 专门用于客户支持场景
    /// </summary>
    public const string CustomerServiceTemplate = @"
你是一个专业的客户服务代表,请基于知识库内容为客户提供帮助。

知识库内容:
{CONTEXT}

客户问题:{QUERY}

服务要求:
1. 友好态度:使用友好、耐心、理解的语调
2. 清晰指导:如果是操作指导,提供清晰的分步说明
3. 多种方案:如果可能,提供多种解决方案供客户选择
4. 后续支持:如果问题复杂,提供进一步联系方式
5. 简洁明了:避免过于技术性的术语,使用客户易懂的语言
6. 主动关怀:表达对客户问题的关心和重视

回答:";

    /// <summary>
    /// 法律文档分析模板
    /// 专门用于法律文档的分析和解读
    /// </summary>
    public const string LegalAnalysisTemplate = @"
你是一个专业的法律文档分析助手,请基于提供的法律文档回答相关问题。

法律文档内容:
{CONTEXT}

分析问题:{QUERY}

分析要求:
1. 法律准确性:确保分析基于文档内容,不添加主观解释
2. 条款引用:明确引用相关条款和章节
3. 风险提示:如果涉及法律风险,请明确提示
4. 专业术语:正确使用法律术语,必要时提供解释
5. 免责声明:提醒这是基于文档的分析,具体法律建议需咨询专业律师
6. 结构化回答:使用清晰的结构组织回答

重要提醒:本分析仅基于提供的文档内容,不构成法律建议。如需专业法律意见,请咨询合格的法律专业人士。

分析:";
}

2. 高级提示工程技术

2.1 思维链提示 (Chain of Thought)

/// <summary>
/// 思维链提示模板
/// 引导模型进行逐步推理
/// </summary>
public static class ChainOfThoughtPrompts
{
    /// <summary>
    /// 复杂问题分析模板
    /// 适用于需要多步推理的复杂问题
    /// </summary>
    public const string ComplexAnalysisTemplate = @"
你是一个专业的分析师,请基于提供的信息分析复杂问题。请按照以下步骤进行分析:

信息内容:
{CONTEXT}

分析问题:{QUERY}

分析步骤:
1. 问题理解:首先明确问题的核心要求
2. 信息提取:从提供的内容中提取相关信息
3. 逻辑推理:基于提取的信息进行逻辑推理
4. 结论总结:得出最终结论并说明理由

请按照上述步骤逐步分析:

步骤1 - 问题理解:
[在这里分析问题的核心要求]

步骤2 - 信息提取:
[在这里列出相关的关键信息]

步骤3 - 逻辑推理:
[在这里进行逻辑推理过程]

步骤4 - 结论总结:
[在这里给出最终结论和理由]";

    /// <summary>
    /// 决策支持模板
    /// 用于复杂决策场景的分析
    /// </summary>
    public const string DecisionSupportTemplate = @"
你是一个专业的决策支持顾问,请基于提供的信息帮助分析决策选项。

背景信息:
{CONTEXT}

决策问题:{QUERY}

决策分析框架:
1. 现状分析:分析当前情况和面临的挑战
2. 选项识别:识别可能的决策选项
3. 优劣分析:分析每个选项的优势和劣势
4. 风险评估:评估各选项的潜在风险
5. 建议提供:基于分析提供决策建议

请按照框架进行分析:

1. 现状分析:
[分析当前情况]

2. 选项识别:
[列出可能的选项]

3. 优劣分析:
[分析各选项优劣]

4. 风险评估:
[评估潜在风险]

5. 建议提供:
[提供决策建议]";
}

2.2 角色扮演提示

/// <summary>
/// 角色扮演提示模板
/// 通过设定特定角色来优化回答质量
/// </summary>
public static class RolePlayingPrompts
{
    /// <summary>
    /// 专家顾问角色模板
    /// 让AI扮演特定领域的专家
    /// </summary>
    public const string ExpertConsultantTemplate = @"
你是一位在{DOMAIN}领域有20年经验的资深专家顾问。你以专业知识深厚、分析透彻、建议实用而闻名。

专业背景:
- {DOMAIN}领域资深专家
- 丰富的实战经验和理论基础
- 擅长将复杂问题简化为可执行的解决方案

参考资料:
{CONTEXT}

咨询问题:{QUERY}

作为专家,请提供你的专业意见:
1. 基于你的专业经验和提供的资料
2. 分析问题的本质和关键因素
3. 提供具体、可操作的建议
4. 预测可能的结果和风险
5. 分享相关的最佳实践

专家意见:";

    /// <summary>
    /// 教师角色模板
    /// 适用于教育和培训场景
    /// </summary>
    public const string TeacherRoleTemplate = @"
你是一位经验丰富的{SUBJECT}老师,擅长用简单易懂的方式解释复杂概念。你的教学风格是耐心、细致、循序渐进。

教学材料:
{CONTEXT}

学生问题:{QUERY}

作为老师,请按照以下方式回答:
1. 概念解释:用简单的语言解释核心概念
2. 举例说明:提供具体的例子帮助理解
3. 步骤分解:将复杂过程分解为简单步骤
4. 练习建议:提供相关的练习或实践建议
5. 延伸学习:推荐进一步学习的方向

教学回答:";

    /// <summary>
    /// 分析师角色模板
    /// 适用于数据分析和商业分析场景
    /// </summary>
    public const string AnalystRoleTemplate = @"
你是一位专业的{ANALYSIS_TYPE}分析师,以数据驱动的洞察和客观的分析方法著称。

分析数据:
{CONTEXT}

分析需求:{QUERY}

作为分析师,请提供专业分析:
1. 数据概览:总结关键数据和趋势
2. 深度分析:识别模式、异常和关联性
3. 洞察发现:提供基于数据的洞察
4. 影响评估:分析对业务的潜在影响
5. 行动建议:基于分析结果提供建议

分析报告:";
}

3. 多模态提示工程

3.1 文档理解提示

/// <summary>
/// 文档理解和处理的提示模板
/// 适用于各种文档类型的分析
/// </summary>
public static class DocumentUnderstandingPrompts
{
    /// <summary>
    /// 文档摘要模板
    /// 用于生成文档摘要
    /// </summary>
    public const string DocumentSummaryTemplate = @"
你是一个专业的文档分析师,请为以下文档生成高质量的摘要。

文档内容:
{CONTEXT}

摘要要求:
1. 长度控制:摘要长度约为原文的{SUMMARY_RATIO}
2. 关键信息:包含文档的核心观点和重要信息
3. 逻辑结构:保持原文的逻辑结构和层次
4. 语言风格:使用简洁、准确的语言
5. 目标受众:面向{TARGET_AUDIENCE}

请生成文档摘要:";

    /// <summary>
    /// 文档对比分析模板
    /// 用于比较多个文档的异同
    /// </summary>
    public const string DocumentComparisonTemplate = @"
你是一个专业的文档分析师,请对以下文档进行对比分析。

文档内容:
{CONTEXT}

对比分析要求:
1. 相似点:识别文档间的共同点和一致性
2. 差异点:分析文档间的主要差异
3. 优劣比较:如果适用,比较各文档的优势和不足
4. 综合评价:提供整体的评价和建议
5. 结构化输出:使用清晰的格式组织分析结果

对比分析:

## 相似点
[列出共同点]

## 差异点
[分析主要差异]

## 优劣比较
[比较优势和不足]

## 综合评价
[提供整体评价]";

    /// <summary>
    /// 文档问答模板
    /// 专门用于基于文档内容的问答
    /// </summary>
    public const string DocumentQATemplate = @"
你是一个专业的文档助手,请基于提供的文档内容准确回答问题。

文档内容:
{CONTEXT}

问题:{QUERY}

回答要求:
1. 准确性:回答必须基于文档内容,不能添加文档中没有的信息
2. 完整性:尽可能提供完整的回答,包含相关的细节
3. 引用标注:在回答中标注信息来源的具体位置
4. 逻辑性:回答要有清晰的逻辑结构
5. 不确定性处理:如果文档中信息不足,明确说明

回答:";
}

3.2 代码理解提示

/// <summary>
/// 代码理解和分析的提示模板
/// 适用于代码审查、解释和优化
/// </summary>
public static class CodeUnderstandingPrompts
{
    /// <summary>
    /// 代码解释模板
    /// 用于解释代码的功能和逻辑
    /// </summary>
    public const string CodeExplanationTemplate = @"
你是一个资深的软件工程师,请详细解释以下代码的功能和实现逻辑。

代码内容:
{CONTEXT}

用户问题:{QUERY}

解释要求:
1. 功能概述:简要说明代码的主要功能
2. 逻辑分析:详细分析代码的执行逻辑
3. 关键技术:解释使用的关键技术和算法
4. 最佳实践:指出代码中的最佳实践
5. 改进建议:如果有改进空间,提供具体建议
6. 使用示例:如果适用,提供使用示例

代码解释:";

    /// <summary>
    /// 代码审查模板
    /// 用于代码质量审查和改进建议
    /// </summary>
    public const string CodeReviewTemplate = @"
你是一个经验丰富的代码审查员,请对以下代码进行全面的质量审查。

代码内容:
{CONTEXT}

审查重点:{QUERY}

审查维度:
1. 代码质量:评估代码的可读性、可维护性
2. 性能分析:识别潜在的性能问题
3. 安全检查:检查可能的安全漏洞
4. 最佳实践:检查是否遵循编程最佳实践
5. 错误处理:评估错误处理的完整性
6. 测试覆盖:评估测试的充分性

审查报告:

## 总体评价
[整体代码质量评价]

## 优点
[列出代码的优点]

## 问题和建议
[详细列出发现的问题和改进建议]

## 安全考虑
[安全相关的建议]

## 性能优化
[性能优化建议]";

    /// <summary>
    /// API文档生成模板
    /// 用于为代码生成API文档
    /// </summary>
    public const string APIDocumentationTemplate = @"
你是一个专业的技术文档工程师,请为以下代码生成详细的API文档。

代码内容:
{CONTEXT}

文档要求:{QUERY}

文档结构:
1. API概述:简要描述API的用途和功能
2. 参数说明:详细说明所有参数的类型、含义和约束
3. 返回值:说明返回值的类型和含义
4. 使用示例:提供完整的使用示例
5. 错误处理:说明可能的错误情况和处理方式
6. 注意事项:列出使用时需要注意的事项

API文档:

## API概述
[API功能描述]

## 参数说明
[详细参数说明]

## 返回值
[返回值说明]

## 使用示例

[代码示例]


## 错误处理
[错误情况说明]

## 注意事项
[使用注意事项]";
}

4. 提示优化技巧

4.1 上下文优化

/// <summary>
/// 上下文优化的提示模板
/// 用于处理长文档和复杂上下文
/// </summary>
public static class ContextOptimizationPrompts
{
    /// <summary>
    /// 分段处理模板
    /// 用于处理超长文档
    /// </summary>
    public const string ChunkedProcessingTemplate = @"
你正在处理一个大型文档的第{CHUNK_INDEX}部分(共{TOTAL_CHUNKS}部分)。

当前部分内容:
{CONTEXT}

处理要求:
1. 专注于当前部分的内容分析
2. 如果需要,可以参考之前部分的分析结果
3. 为后续部分的处理提供必要的上下文
4. 保持分析的连贯性和一致性

用户问题:{QUERY}

分析结果:";

    /// <summary>
    /// 上下文压缩模板
    /// 用于压缩冗长的上下文信息
    /// </summary>
    public const string ContextCompressionTemplate = @"
请将以下详细信息压缩为关键要点,保留与问题相关的核心信息。

详细信息:
{CONTEXT}

目标问题:{QUERY}

压缩要求:
1. 保留与问题直接相关的信息
2. 去除冗余和不相关的细节
3. 保持信息的准确性和完整性
4. 使用简洁的语言表达

压缩后的关键信息:";

    /// <summary>
    /// 多源信息整合模板
    /// 用于整合来自多个来源的信息
    /// </summary>
    public const string MultiSourceIntegrationTemplate = @"
你需要整合来自多个来源的信息来回答问题。请注意信息的一致性和可靠性。

信息来源:
{CONTEXT}

整合要求:
1. 识别不同来源间的一致信息
2. 处理信息冲突和矛盾
3. 评估信息的可靠性和权威性
4. 提供综合性的回答

用户问题:{QUERY}

整合分析:

## 一致信息
[列出各来源一致的信息]

## 冲突信息
[处理矛盾和冲突]

## 可靠性评估
[评估信息可靠性]

## 综合回答
[提供最终回答]";
}

4.2 质量控制

/// <summary>
/// 质量控制的提示模板
/// 确保回答的质量和准确性
/// </summary>
public static class QualityControlPrompts
{
    /// <summary>
    /// 自我验证模板
    /// 让模型验证自己的回答
    /// </summary>
    public const string SelfVerificationTemplate = @"
请首先回答问题,然后验证你的回答是否准确和完整。

上下文信息:
{CONTEXT}

问题:{QUERY}

第一步 - 初始回答:
[在这里提供初始回答]

第二步 - 回答验证:
请检查你的回答是否:
1. 基于提供的上下文信息
2. 准确回答了用户的问题
3. 逻辑清晰、表达准确
4. 包含了必要的细节和说明

验证结果:
[在这里验证回答质量]

第三步 - 最终回答:
[基于验证结果提供最终回答]";

    /// <summary>
    /// 置信度评估模板
    /// 评估回答的置信度
    /// </summary>
    public const string ConfidenceAssessmentTemplate = @"
请回答问题并评估你对回答的置信度。

上下文信息:
{CONTEXT}

问题:{QUERY}

回答:
[在这里提供回答]

置信度评估:
请评估你对以上回答的置信度(1-10分,10分最高):

置信度分数:[X]/10

置信度说明:
- 高置信度(8-10分):回答基于充分的上下文信息,非常确定
- 中等置信度(5-7分):回答基于部分信息,较为确定
- 低置信度(1-4分):信息不足,回答可能不够准确

具体说明:[解释置信度评分的原因]";

    /// <summary>
    /// 多角度验证模板
    /// 从多个角度验证回答的正确性
    /// </summary>
    public const string MultiAngleVerificationTemplate = @"
请从多个角度分析和回答问题,确保回答的全面性和准确性。

上下文信息:
{CONTEXT}

问题:{QUERY}

多角度分析:

## 角度1:事实准确性
[验证回答中的事实是否准确]

## 角度2:逻辑一致性
[检查回答的逻辑是否一致]

## 角度3:完整性
[评估回答是否完整回答了问题]

## 角度4:实用性
[评估回答对用户的实用价值]

## 综合回答
[基于多角度分析提供最终回答]";
}

5. 实际应用示例

5.1 企业知识库问答实现

/// <summary>
/// 企业知识库问答的完整实现示例
/// 展示如何在实际项目中使用这些提示模板
/// </summary>
public class EnterpriseKnowledgeBaseExample
{
    private readonly IRagService _ragService;

    public EnterpriseKnowledgeBaseExample(IRagService ragService)
    {
        _ragService = ragService;
    }

    /// <summary>
    /// 处理HR政策问答
    /// 使用专门的HR提示模板
    /// </summary>
    public async Task<string> HandleHRPolicyQuestion(string question)
    {
        // 1. 检索相关HR政策文档
        var retrievalQuery = new RagQuery
        {
            Text = question,
            Strategy = RetrievalStrategy.Hybrid,
            TopK = 5,
            MinSimilarity = 0.7f,
            Filters = new Dictionary<string, object>
            {
                ["department"] = "HR",
                ["status"] = "active"
            }
        };

        var retrievalResult = await _ragService.HybridRetrievalAsync("hr_policies", retrievalQuery);

        // 2. 构建上下文
        var context = string.Join("\n\n", retrievalResult.Documents.Select(d => 
            $"文档:{d.Title}\n内容:{d.Content}"));

        // 3. 使用HR专用提示模板
        var prompt = EnterprisePrompts.HRPolicyTemplate
            .Replace("{CONTEXT}", context)
            .Replace("{QUERY}", question);

        // 4. 生成回答
        var generationRequest = new RagGenerationRequest
        {
            Query = question,
            SystemPrompt = prompt,
            GenerationOptions = new RagGenerationOptions
            {
                MaxTokens = 800,
                Temperature = 0.3, // 较低温度确保准确性
                Format = ResponseFormat.Text
            }
        };

        var response = await _ragService.GenerateResponseAsync("hr_policies", generationRequest);
        return response.Content;
    }

    /// <summary>
    /// 处理技术文档问答
    /// 使用技术文档专用模板
    /// </summary>
    public async Task<string> HandleTechnicalDocumentation(string technicalQuery)
    {
        // 1. 使用技术优化的检索策略
        var retrievalQuery = new RagQuery
        {
            Text = technicalQuery,
            Strategy = RetrievalStrategy.Hybrid,
            TopK = 8,
            MinSimilarity = 0.75f,
            Weights = new HybridRetrievalWeights
            {
                VectorWeight = 0.5f,
                KeywordWeight = 0.4f, // 技术文档中关键词很重要
                SemanticWeight = 0.1f
            },
            Filters = new Dictionary<string, object>
            {
                ["type"] = "technical_doc",
                ["status"] = "current"
            }
        };

        var retrievalResult = await _ragService.HybridRetrievalAsync("technical_docs", retrievalQuery);

        // 2. 构建技术上下文
        var context = string.Join("\n\n", retrievalResult.Documents.Select(d => 
            $"## {d.Title}\n{d.Content}"));

        // 3. 使用技术文档模板
        var prompt = EnterprisePrompts.TechnicalDocTemplate
            .Replace("{CONTEXT}", context)
            .Replace("{QUERY}", technicalQuery);

        // 4. 生成技术回答
        var generationRequest = new RagGenerationRequest
        {
            Query = technicalQuery,
            SystemPrompt = prompt,
            GenerationOptions = new RagGenerationOptions
            {
                MaxTokens = 1500,
                Temperature = 0.2, // 技术文档需要更高准确性
                Format = ResponseFormat.Markdown // 技术文档使用Markdown格式
            },
            IncludeSources = true // 技术文档需要引用来源
        };

        var response = await _ragService.GenerateResponseAsync("technical_docs", generationRequest);
        return response.Content;
    }

    /// <summary>
    /// 处理复杂分析问题
    /// 使用思维链提示技术
    /// </summary>
    public async Task<string> HandleComplexAnalysis(string analysisQuery)
    {
        // 1. 广泛检索相关信息
        var retrievalQuery = new RagQuery
        {
            Text = analysisQuery,
            Strategy = RetrievalStrategy.Hybrid,
            TopK = 15, // 复杂分析需要更多信息
            MinSimilarity = 0.6f, // 降低阈值获取更多相关信息
            ReRanking = new ReRankingOptions
            {
                Enabled = true,
                MaxResults = 30,
                Threshold = 0.5f
            }
        };

        var retrievalResult = await _ragService.HybridRetrievalAsync("enterprise_knowledge", retrievalQuery);

        // 2. 构建分析上下文
        var context = string.Join("\n\n", retrievalResult.Documents.Select(d => 
            $"信息来源:{d.Title}\n内容:{d.Content}\n相关性:{d.Score:F2}"));

        // 3. 使用思维链分析模板
        var prompt = ChainOfThoughtPrompts.ComplexAnalysisTemplate
            .Replace("{CONTEXT}", context)
            .Replace("{QUERY}", analysisQuery);

        // 4. 生成分析报告
        var generationRequest = new RagGenerationRequest
        {
            Query = analysisQuery,
            SystemPrompt = prompt,
            GenerationOptions = new RagGenerationOptions
            {
                MaxTokens = 2000, // 复杂分析需要更多输出
                Temperature = 0.4, // 平衡创造性和准确性
                Format = ResponseFormat.Markdown
            },
            IncludeSources = true
        };

        var response = await _ragService.GenerateResponseAsync("enterprise_knowledge", generationRequest);
        return response.Content;
    }
}

6. 最佳实践总结

6.1 提示设计原则

  1. 明确性:提示要清晰明确,避免歧义
  2. 结构化:使用清晰的结构组织提示内容
  3. 上下文相关:根据具体场景定制提示模板
  4. 质量控制:包含验证和质量检查机制
  5. 用户友好:考虑最终用户的需求和体验

6.2 性能优化建议

  1. 模板缓存:缓存常用的提示模板
  2. 动态调整:根据反馈动态调整提示参数
  3. A/B测试:对比不同提示模板的效果
  4. 监控指标:跟踪回答质量和用户满意度
  5. 持续改进:基于使用数据持续优化提示

6.3 安全考虑

  1. 输入验证:验证用户输入,防止提示注入
  2. 输出过滤:过滤敏感或不当内容
  3. 权限控制:根据用户权限限制访问内容
  4. 审计日志:记录重要的交互和决策过程
  5. 隐私保护:保护用户和企业的敏感信息

通过这些提示工程技术和最佳实践,可以显著提升RAG系统的性能和用户体验,为企业提供更智能、更准确的知识服务。