""" Shared prompt templates for AI Service. Centralized prompt configuration for consistent AI behavior across all endpoints. """ SYSTEM_PROMPT = """你是一名经验丰富的客服专员,名字叫"小N"。请遵循以下准则: 像朋友一样聊天:使用自然、口语化的中文,语气亲切有礼貌,就像在和一位老朋友聊天。多使用"咱们"、"您看"、"是不是"这样拉近距离的表达。 避免生硬罗列:介绍多个信息时,不要用"第一、第二"或分点列举,而是用流畅的段落把它们串联起来。比如:"我们这边有几类课程挺受欢迎的,一个是……另外还有……您对哪方面更感兴趣呀?" 主动引导对话:不要一次性把知识库里的所有内容都倒出来。可以先简单概括,然后问问客户具体想了解什么,比如:"您是想提升职场英语,还是有留学方面的打算呢?" 委婉处理未知:如果知识库里没有答案,别直接说"不知道",可以说:"您稍等,我帮您确认一下"、"这个问题我需要问问同事,马上给您回复"。 隐藏机器身份:绝不要提及"作为AI"、"根据算法"等词,也避免使用过于官方的术语。就像普通人一样用"我"、"我们"。 多用语气词和情感表达:适当加入"呢"、"哦"、"哈"、"呀"等语气词,根据情况使用表情符号(😊)。表达理解和关心,比如"我明白您的意思"、"别着急,我们一起看看"。 保持简洁但有温度:回答一般控制在3-5句话,如果需要详细说明,可以分成小段落,但每段都要口语化,读起来不累。 隐私与安全提醒:如果客户问到敏感信息(如密码、转账),要温和地引导至人工渠道:"为了您的信息安全,建议您拨打官方电话400-xxx-xxxx咨询会更稳妥哦。""" def format_evidence_for_prompt( retrieval_results: list, max_results: int = 5, max_content_length: int = 500 ) -> str: """ Format retrieval results as evidence text for prompts. Args: retrieval_results: List of retrieval hits. Can be: - dict format: {'content', 'score', 'source', 'metadata'} - RetrievalHit object: with .text, .score, .source, .metadata attributes max_results: Maximum number of results to include max_content_length: Maximum length of each content snippet Returns: Formatted evidence text """ if not retrieval_results: return "" evidence_parts = [] for i, hit in enumerate(retrieval_results[:max_results]): if hasattr(hit, 'text'): content = hit.text score = hit.score source = getattr(hit, 'source', '知识库') metadata = getattr(hit, 'metadata', {}) or {} else: content = hit.get('content', '') score = hit.get('score', 0) source = hit.get('source', '知识库') metadata = hit.get('metadata', {}) or {} if len(content) > max_content_length: content = content[:max_content_length] + '...' nested_meta = metadata.get('metadata', {}) source_doc = nested_meta.get('source_doc', source) if nested_meta else source category = nested_meta.get('category', '') if nested_meta else '' department = nested_meta.get('department', '') if nested_meta else '' header = f"[文档{i+1}]" if source_doc and source_doc != "知识库": header += f" 来源:{source_doc}" if category: header += f" | 类别:{category}" if department: header += f" | 部门:{department}" evidence_parts.append(f"{header}\n相关度:{score:.2f}\n内容:{content}") return "\n\n".join(evidence_parts) def build_system_prompt_with_evidence(evidence_text: str) -> str: """ Build system prompt with knowledge base evidence. Args: evidence_text: Formatted evidence from retrieval results Returns: Complete system prompt """ if not evidence_text: return SYSTEM_PROMPT return f"""{SYSTEM_PROMPT} 知识库参考内容: {evidence_text}""" def build_user_prompt_with_evidence(query: str, evidence_text: str) -> str: """ Build user prompt with knowledge base evidence (for single-message format). Args: query: User's question evidence_text: Formatted evidence from retrieval results Returns: Complete user prompt """ if not evidence_text: return f"""用户问题:{query} 未找到相关检索结果,请基于通用知识回答用户问题。""" return f"""【系统指令】 {SYSTEM_PROMPT} 【知识库内容】 {evidence_text} 【用户问题】 {query}"""