Skip to content

以下是对 gc-qa-rag-server/ragapp/services/query.py 文件的详细 Markdown 文档说明:


文档:query.py 代码详解

文件概述

本文件实现了与 OpenAI 大语言模型(LLM)进行异步对话的服务接口,主要用于根据用户对话内容生成检索问题,并以流式方式返回模型输出。该模块是 RAG(Retrieval-Augmented Generation)系统中“问题生成”与“模型交互”环节的关键组件,负责将用户输入转化为适合知识库检索的查询文本。

主要组件与函数说明

1. OpenAI 客户端初始化

文件开头通过 AsyncOpenAI 类初始化了一个异步的 OpenAI 客户端。其参数(API Key、Base URL、模型名称)均从统一的配置对象 app_config.llm_query 中读取。这种设计方式有以下优点:

  • 配置集中管理:所有与 LLM 相关的参数都可在配置文件中统一维护,便于环境切换和安全管理。
  • 异步支持:采用异步客户端,能够高效处理高并发请求,提升系统吞吐量和响应速度。

2. chat 异步生成器

该函数是与 OpenAI 聊天模型交互的底层接口。其主要流程如下:

  • 接收一组消息(messages),调用 OpenAI 的 chat.completions.create 方法发起对话请求。
  • 设置了 top_ptemperature 参数,控制生成文本的多样性和随机性,且开启了 stream=True,以流式方式获取模型输出。
  • 通过 async for 迭代模型返回的每个 chunk,将其中的文本内容逐步 yield 出去,实现了流式输出。这对于前端实时展示、长文本生成等场景非常友好。

3. chat_for_query 问题生成接口

该函数用于将用户的对话内容转化为适合知识库检索的查询问题。其实现思路如下:

  • 构造一个 prompt,明确告知模型:“你是一个问题生成器,需要从对话中识别出用户想要查询的问题,并直接输出该文本”。
  • 将 prompt 作为 user 消息,配合一个 system 消息(设定助手角色),组装成标准的 OpenAI 消息格式。
  • 调用 chat 函数,返回一个异步生成器,流式输出模型生成的查询问题。

这种设计将“问题生成”与“模型交互”解耦,便于后续扩展和维护。

4. get_chat_for_query_result 结果聚合接口

该函数用于获取完整的模型输出结果。其主要流程为:

  • 定义一个内部异步函数 wrapper,用于消费 chat_for_query 返回的异步生成器,将所有文本片段拼接成最终字符串。
  • 通过 await wrapper() 返回完整的生成结果。

这种设计既保留了流式输出的能力,也方便在需要完整结果时一次性获取全部内容,适应了不同的业务需求。


实现原理与设计考虑

1. 异步与流式处理

全模块采用异步编程范式,极大提升了高并发场景下的性能表现。流式输出(streaming)不仅提升了用户体验(如前端可实时展示生成内容),也降低了内存压力,适合长文本生成和大模型交互。

2. 明确的 prompt 设计

chat_for_query 中,prompt 明确要求模型“只输出用户想要查询的问题”,避免了冗余内容。这种 prompt 工程的细致设计,有助于提升模型输出的准确性和可控性,是高质量 RAG 系统的关键。

3. 角色分离与接口解耦

通过将底层的 chat、上层的 chat_for_query 和最终的 get_chat_for_query_result 分层实现,代码结构清晰,便于维护和扩展。例如,未来如需支持多种模型或不同的 prompt,只需在相应层级调整即可。

4. 配置化与安全性

所有敏感参数(如 API Key)均通过配置文件管理,避免硬编码,提升了安全性和可维护性。


应用场景

该模块适用于 RAG 系统中的“问题生成”环节。典型流程为:用户输入一段对话,系统自动识别出核心查询问题,并将其用于知识库检索,进而实现更精准的知识增强问答。模块的异步和流式特性,也适合于需要高并发、低延迟的生产环境。


代码示例

import asyncio

# 假设 contents 是用户的对话内容
contents = "我想了解一下人工智能的发展历史。"

# 获取最终的查询问题
result = asyncio.run(get_chat_for_query_result(contents))
print(result)
# 输出:人工智能的发展历史

总结

query.py 通过异步、流式的 OpenAI 客户端封装,结合精心设计的 prompt 和分层接口,实现了高效、准确的问题生成服务。其设计兼顾了性能、可维护性和实际业务需求,是 RAG 系统中不可或缺的核心组件。