以下是对 gc-qa-rag-server/ragapp/services/summary.py
文件的详细 Markdown 文档说明:
文档:summary.py
代码详解
文件概述
本文件主要实现了基于 OpenAI 大语言模型(LLM)的异步摘要与问答服务。它通过与 OpenAI 的异步 API 交互,结合用户输入、历史对话和知识库检索结果,生成针对用户问题的综合性回答。该模块是 RAG(Retrieval-Augmented Generation,检索增强生成)系统中的核心服务之一,负责将检索到的知识与上下文对话融合,输出高质量的答案。
主要组件与函数说明
1. OpenAI 客户端初始化
文件开头通过读取配置文件 app_config
,初始化了 OpenAI 的异步客户端 AsyncOpenAI
。配置项包括 API Key、API Base URL 以及模型名称。这种设计方式将敏感信息和环境参数解耦,便于在不同环境下灵活切换和安全管理。
client = AsyncOpenAI(
api_key=app_config.llm_summary.api_key,
base_url=app_config.llm_summary.api_base,
)
model_name = app_config.llm_summary.model_name
2. chat
异步生成器
chat
函数是与 OpenAI 聊天模型交互的底层接口。它接受一组消息(messages),调用 OpenAI 的 chat.completions.create
方法,设置了 top_p
和 temperature
参数以控制生成文本的多样性和随机性,并开启了流式(stream)输出。
流式输出的设计允许模型边生成边返回内容,极大提升了用户体验,尤其在生成长文本时可以实时展示结果。函数通过异步生成器(async for
)逐步产出每一段文本,便于上层调用按需消费。
3. summary_hits
综合摘要函数
summary_hits
是本模块的核心业务函数。其主要流程如下:
- 首先将检索到的知识库命中结果(hits)序列化为 JSON 字符串,保证内容的结构化和可读性。
- 构造提示词(prompt),将用户问题、检索结果和对话上下文整合到一个完整的输入中。提示词明确要求模型参考上下文和知识库,并在回答时附上文档链接,提升答案的相关性和可追溯性。
- 构建消息列表(messages_with_hits),在原有对话历史基础上,插入系统角色设定(system prompt),并将最后一条用户消息内容替换为综合后的提示词。这种做法确保了模型在生成答案时能够完整获取所有关键信息。
- 记录日志,输出当前消息总字数,便于后续监控和调试。
- 最后调用
chat
函数,返回异步生成器,供上层异步消费生成的答案文本。
4. 日志与调试
模块通过标准 logging
库记录了关键步骤的信息,尤其是最终传递给模型的消息长度。这对于排查输入过长、API 限制等问题非常有帮助,也便于后续优化 prompt 设计。
实现原理与设计考虑
1. 检索增强生成(RAG)思想
本模块充分体现了 RAG 的核心思想:将知识库检索结果与生成式模型结合,提升答案的准确性和丰富性。通过将 hits 以结构化 JSON 形式嵌入 prompt,模型能够直接参考外部知识,避免“幻觉”现象,提高了生成内容的可靠性。
2. Prompt 工程与上下文融合
在 prompt 设计上,模块将用户问题、检索结果和历史对话有机融合,并通过系统角色设定引导模型以“乐于解答各种问题的助手”身份作答。这种多层次的 prompt 设计,有助于模型理解任务目标,生成更符合预期的答案。
3. 流式输出与异步处理
采用异步和流式输出的方式,极大提升了系统的响应速度和用户体验。用户可以在模型生成过程中实时看到部分答案,减少等待时间,提升交互性。
4. 配置解耦与安全性
所有与 OpenAI 相关的敏感参数均通过配置文件管理,便于在不同环境下灵活切换,提升了系统的安全性和可维护性。
应用场景
该模块适用于智能问答、知识库检索增强、对话系统等多种场景。通过结合检索结果和生成模型,能够为用户提供更准确、可追溯的答案,广泛应用于企业知识库、客服机器人、智能助手等系统。
代码示例
# 假设在异步环境下调用 summary_hits
import asyncio
async def main():
keyword = "什么是RAG?"
messages = [{"role": "user", "content": "请介绍一下RAG技术。"}]
hits = [{"title": "RAG简介", "url": "http://example.com/rag", "content": "RAG是一种结合检索与生成的AI技术..."}]
async for text in summary_hits(keyword, messages, hits):
print(text, end="")
asyncio.run(main())
总结
summary.py
通过异步与流式的方式,将用户问题、历史对话和知识库检索结果有机融合,调用大语言模型生成高质量答案。其设计兼顾了效率、准确性和可维护性,是现代 RAG 系统中不可或缺的核心服务模块。