5.2 提示工程实践 — RAG知识库实战提示优化 本节导读:掌握在RAG系统中设计和优化提示词的核技术,学会从基础prompt设计到复杂提示策略的完整流程,实现高质量的检索增强生成效果。 学习目标 理解提示工程的基本概念和重要性 掌握RAG系统中的提示设计原则 学会优化提示词以获得更好的检索效果 能够处理复杂的提示场景和多轮对话 了解提示模板和最佳实践 核心概念 提示工程是指导LLM生成高质量响应的关键技术,在RAG系统中尤为重要,因为它直接影响检索到的知识的有效利用。
本节导读:掌握在RAG系统中设计和优化提示词的核技术,学会从基础prompt设计到复杂提示策略的完整流程,实现高质量的检索增强生成效果。
提示工程是指导LLM生成高质量响应的关键技术,在RAG系统中尤为重要,因为它直接影响检索到的知识的有效利用。
| 原则 | 描述 | 重要性 |
|---|---|---|
| 明确性 | 清晰表达任务要求和期望 | ⭐⭐⭐⭐⭐ |
| 相关性 | 确保提示与检索到的内容相关 | ⭐⭐⭐⭐⭐ |
| 结构性 | 采用逻辑清晰的段落结构 | ⭐⭐⭐⭐ |
| 完整性 | 包含必要的背景信息 | ⭐⭐⭐⭐ |
| 简洁性 | 避免冗长和无关信息 | ⭐⭐⭐ |
import json import re from typing import Dict, List, Optional from dataclasses import dataclass from enum import Enum import numpy as np
# 基础提示模板 BASE_PROMPT_TEMPLATE = """ 请根据以下提供的信息回答问题: {context} 问题:{question} 要求: 1. 只基于提供的上下文回答 2. 如果上下文中没有相关信息,请说明"无法从提供的上下文中找到答案" 3. 答案要准确、简洁、有条理 4. 重要概念需要简要解释 答案: """ # 问答提示模板 QAPROMPT_TEMPLATE = """ 上下文信息: {context} 用户问题:{question} 回答要求: - 基于上下文提供准确答案 - 如果信息不足,明确说明 - 使用简洁明了的语言 - 包含必要的解释说明 回答: """ # 代码生成提示模板 CODE_GENERATION_TEMPLATE = """ 根据以下技术文档和用户需求,生成完整的代码实现: 技术文档: {context} 需求描述: {requirements} 输出要求: 1. 提供完整的可执行代码 2. 包含必要的注释和文档字符串 3. 遵循最佳编码规范 4. 考虑错误处理和边界情况 5. 提供使用示例 代码实现: """
class SimpleQAPrompt: """ 简单问答提示设计器 """ def __init__(self, template: str = BASE_PROMPT_TEMPLATE): self.template = template def build_prompt(self, context: str, question: str) -> str: """ 构建基础问答提示 """ return self.template.format( context=context, question=question ) def validate_response(self, response: str, context: str) -> bool: """ 验证回答是否基于上下文 """ # 检查回答是否包含不在上下文中的关键信息 context_words = set(re.findall(r'\w+', context.lower())) response_words = set(re.findall(r'\w+', response.lower())) # 如果回答中有很多词不在上下文中,可能是编造的 if len(response_words - context_words) > len(response_words) * 0.1: return False return True
class ContextAwarePrompt: """ 上下文感知提示设计器 """ def __init__(self): self.context_filters = { 'relevance': self._filter_relevant_content, 'length': self._filter_by_length, 'completeness': self._filter_by_completeness } def build_enhanced_prompt(self, context_chunks: List[str], question: str, max_length: int = 2000) -> str: """ 构建增强的提示词 """ # 过滤相关内容 filtered_chunks = self._filter_relevant_content(context_chunks, question) # 控制长度 truncated_chunks = self._filter_by_length(filtered_chunks, max_length) # 确保完整性 complete_chunks = self._filter_by_completeness(truncated_chunks, question) # 构建完整提示 context_text = "\n\n".join(complete_chunks) enhanced_prompt = f""" 基于以下相关信息回答问题: 【相关上下文】 {context_text} 【用户问题】 {question} 【回答要求】 1. 严格基于提供的上下文回答 2. 答案要准确、有条理 3. 如果信息不足,明确说明 4. 重点突出关键信息 【回答】 """ return enhanced_prompt def _filter_relevant_content(self, chunks: List[str], question: str) -> List[str]: """ 过滤与问题相关的上下文 """ # 这里可以实现更复杂的相关性判断 # 简化版本:保留所有chunks,实际情况可能需要向量相似度计算 return chunks[:5] # 限制最多5个chunks def _filter_by_length(self, chunks: List[str], max_length: int) -> List[str]: """ 按长度过滤上下文 """ result = [] current_length = 0 for chunk in chunks: if current_length + len(chunk) <= max_length: result.append(chunk) current_length += len(chunk) else: break return result def _filter_by_completeness(self, chunks: List[str], question: str) -> List[str]: """ 确保上下文的完整性 """ # 检查是否有完整的主题覆盖 question_keywords = set(question.lower().split()) # 简化判断:如果有足够的chunks,认为完整 if len(chunks) >= 3: return chunks else: # 如果chunks太少,返回所有可用chunks return chunks
class ConversationAwarePrompt: """ 多轮对话提示设计器 """ def __init__(self): self.conversation_history = [] self.max_history = 5 def add_to_history(self, user_input: str, system_response: str): """ 添加对话历史 """ self.conversation_history.append({ 'user': user_input, 'system': system_response }) # 保持历史长度限制 if len(self.conversation_history) > self.max_history: self.conversation_history.pop(0) def build_conversation_prompt(self, context: str, current_question: str) -> str: """ 构建多轮对话提示 """ # 格式化对话历史 history_text = "" for i, (user, system) in enumerate(self.conversation_history): history_text += f""" 历史对话 {i+1}: 用户: {user} 系统: {system} """ prompt = f""" 对话历史: {history_text} 当前上下文: {context} 当前用户问题:{current_question} 多轮回答要求: 1. 基于完整对话历史理解用户意图 2. 保持对话的连续性 3. 回答要自然流畅,符合对话逻辑 4. 对于复杂问题,可以分步骤回答 5. 适当引用之前的对话内容 当前回答: """ return prompt def summarize_conversation(self, context: str) -> str: """ 总结对话历史以构建简洁提示 """ if not self.conversation_history: return context # 构建对话总结 summary = "对话历史总结:\n" for i, (user, system) in enumerate(self.conversation_history): summary += f"Q{i+1}: {user[:50]}...\n" summary += f"A{i+1}: {system[:100]}...\n\n" summary += f"\n新上下文:{context}" return summary
class CodeGenerationPrompt: """ 代码生成提示设计器 """ def __init__(self): self.code_styles = { 'basic': self._basic_code_style, 'documented': self._documented_code_style, 'production': self._production_code_style } def build_code_prompt(self, context: str, requirements: str, style: str = 'documented') -> str: """ 构建代码生成提示 """ style_func = self.code_styles.get(style, self._documented_code_style) prompt = f""" 基于以下技术文档和需求,生成高质量的{style}代码: 【技术文档】 {context} 【需求描述】 {requirements} 【代码要求】 {style_func()} 【输出格式】 请按照以下格式输出代码: ```python # 完整的代码实现
【代码说明】
【使用示例】
"""
return prompt def _basic_code_style(self) -> str: return "1. 提供基础功能实现\n2. 包含必要的错误处理\n3. 代码简洁易读" def _documented_code_style(self) -> str: return """1. 包含完整的文档字符串
有清晰的注释说明
良好的函数和变量命名
适当的类型提示
包含单元测试示例
遵循PEP 8规范"""
def _production_code_style(self) -> str:
return """1. 完整的生产级代码
全面的错误处理和日志记录
配置文件支持
性能优化
安全考虑
监控和指标
部署说明"""
## 完整示例 ### 完整的提示工程系统 ```python class PromptEngineeringSystem: """ 完整的提示工程系统 """ def __init__(self): self.simple_qa = SimpleQAPrompt() self.context_aware = ContextAwarePrompt() self.conversation = ConversationAwarePrompt() self.code_generator = CodeGenerationPrompt() def process_query(self, query_type: str, context: str, question: str, **kwargs) -> str: """ 根据查询类型处理请求 """ if query_type == 'simple': return self.simple_qa.build_prompt(context, question) elif query_type == 'enhanced': return self.context_aware.build_enhanced_prompt( context, question, **kwargs ) elif query_type == 'conversation': # 添加到对话历史 if 'response' in kwargs: self.conversation.add_to_history(question, kwargs['response']) return self.conversation.build_conversation_prompt( context, question ) elif query_type == 'code': return self.code_generator.build_code_prompt( context, question, kwargs.get('style', 'documented') ) else: raise ValueError(f"不支持的查询类型: {query_type}") def evaluate_prompt_quality(self, prompt: str, expected_response: str, actual_response: str) -> Dict: """ 评估提示质量 """ # 这里可以实现更复杂的评估逻辑 evaluation = { 'prompt_length': len(prompt), 'relevance_score': self._calculate_relevance(prompt, actual_response), 'completeness_score': self._calculate_completeness( expected_response, actual_response ), 'clarity_score': self._calculate_clarity(actual_response), 'total_score': 0 # 将根据各项指标计算 } # 计算总分 evaluation['total_score'] = ( evaluation['relevance_score'] * 0.3 + evaluation['completeness_score'] * 0.4 + evaluation['clarity_score'] * 0.3 ) return evaluation def _calculate_relevance(self, prompt: str, response: str) -> float: """计算相关性分数""" # 简化的相关性计算 prompt_words = set(prompt.lower().split()) response_words = set(response.lower().split()) if not prompt_words: return 0.5 overlap = len(prompt_words & response_words) return min(1.0, overlap / len(prompt_words)) def _calculate_completeness(self, expected: str, actual: str) -> float: """计算完整性分数""" expected_words = set(expected.lower().split()) actual_words = set(actual.lower().split()) if not expected_words: return 0.5 coverage = len(expected_words & actual_words) return min(1.0, coverage / len(expected_words)) def _calculate_clarity(self, response: str) -> float: """计算清晰度分数""" # 基于响应长度和结构评估 word_count = len(response.split()) # 适当的长度 length_score = 1.0 if 50 <= word_count <= 500 else 0.5 # 句子结构 sentences = response.split('.') avg_sentence_length = word_count / len(sentences) if sentences else 0 structure_score = 1.0 if 10 <= avg_sentence_length <= 30 else 0.5 return (length_score + structure_score) / 2
A:设计特定领域提示词的关键步骤:
A:提示词过长的处理方法:
A:多轮对话上下文管理策略:
本节深入讲解了RAG系统中的提示工程实践:
提示工程是RAG系统成功的关键因素,需要根据具体应用场景进行精细化设计。下一节我们将探讨上下文管理的重要技术。
关键词:RAG知识库实战, 提示工程, prompt设计, 上下文增强, 对话管理, 代码生成
难度:进阶
预计阅读:45分钟