Skip to content

以下是对 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_ptemperature 参数以控制生成文本的多样性和随机性,并开启了流式(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 系统中不可或缺的核心服务模块。