Skip to content

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


文档:server.py 代码详解

文件概述

本文件实现了基于 FastAPI 的后端服务,是 gc-qa-rag 系统的主要 API 入口。它集成了向量数据库(Qdrant)、日志、限流、跨域等多项基础设施,提供了搜索、对话、思考、研究、反馈、历史查询等多种接口,支撑了前端与后端的高效交互。整体设计兼顾了安全性、健壮性、可扩展性和高并发场景下的性能表现。


主要结构与功能说明

1. 基础设施初始化

  • 日志系统:通过 setup_logging() 初始化日志,便于后续服务监控和问题追踪。
  • FastAPI 应用:实例化 FastAPI 应用对象 app,并配置了 CORS 中间件,允许所有来源的跨域请求,方便前后端分离部署。
  • 向量数据库:通过 QdrantClient 连接向量数据库,支持高效的语义检索。
  • 限流器:通过 rate_limiter 对不同类型的请求进行限流,防止滥用和恶意攻击。

2. 数据模型定义

使用 Pydantic 定义了多种数据模型(如 SearchModel, ChatModel, FeedbackModel, SearchHistoryRequest),用于请求体的参数校验和自动文档生成。这不仅提升了代码的可读性,也增强了接口的健壮性。

3. 搜索与对话相关接口

同步接口,支持“search”、“chat”、“think”三种模式的语义检索。

  • 校验参数长度和模式合法性,防止异常输入。
  • 记录搜索历史(异步后台任务),便于后续分析和用户体验优化。
  • 调用 search_sementic_hybrid 进行混合语义检索,返回检索结果。

/chat_streaming//think_streaming//reasearch_streaming/

异步接口,支持流式对话、思考和研究模式。

  • 校验输入长度,防止超长输入导致性能问题。
  • 根据消息轮次决定处理逻辑:如果是第一轮直接取内容,如果轮次过多则提示用户重启对话,防止无限对话导致资源消耗过大。
  • 通过 StreamingResponse 实现流式输出,提升用户体验,适合大模型生成等耗时操作。
  • 分别调用不同的摘要/研究服务(如 summary_hits, summary_hits_think, research_hits),实现多样化的对话风格和功能。

4. 反馈与历史接口

/feedback/

用于收集用户对问答结果的反馈。

  • 校验问题、答案、评论、产品名等字段长度,防止恶意输入。
  • 通过后台任务异步写入数据库,提升接口响应速度。
  • 触发限流,防止刷反馈。

/getsearchhistory/

用于查询指定日期的搜索历史。

  • 通过 token 校验接口权限,防止未授权访问。
  • 调用数据库接口获取历史数据,异常时返回 500 错误。

5. 其他辅助接口

/

根路径,返回简单的 Hello World 响应,用于健康检查或测试。

getLimitText

异步函数,用于在对话轮次超限时返回提示文本,防止用户长时间占用会话资源。


设计原理与细节考量

1. 安全性与健壮性

  • 参数校验:所有接口均对输入参数长度和内容进行严格校验,防止 SQL 注入、缓冲区溢出等安全风险。
  • 权限控制:历史查询接口通过 token 进行权限校验,防止敏感数据泄露。
  • 异常处理:对数据库操作等易出错环节均有异常捕获,保证服务稳定性。

2. 性能与可扩展性

  • 异步与后台任务:对耗时操作(如写历史、写反馈)采用 FastAPI 的后台任务机制,避免阻塞主线程,提高接口响应速度。
  • 流式响应:对话和摘要接口采用流式输出,提升大模型生成等场景下的用户体验。
  • 限流机制:对不同类型的接口调用进行限流,防止单用户或恶意请求拖垮服务。

3. 代码结构与可维护性

  • 分层解耦:服务层、数据库层、配置层、限流层等各自独立,便于维护和扩展。
  • 日志与监控:全局日志初始化,关键操作均有日志记录,便于问题追踪和性能分析。
  • 类型注解与文档:Pydantic 数据模型和类型注解提升了代码可读性和自动文档生成能力。

4. 用户体验

  • 错误提示友好:所有参数校验失败均有明确的错误信息,便于前端和用户理解问题原因。
  • 对话轮次限制:防止用户长时间占用会话资源,提升系统整体可用性。
  • 多模式支持:支持搜索、对话、思考、研究等多种交互模式,满足不同用户需求。

应用场景

本服务适用于需要高效语义检索、智能对话、知识研究、用户反馈收集等场景。其流式接口和限流机制特别适合大模型推理、实时问答等高并发、高性能要求的应用环境。


代码示例

import requests

# 搜索接口示例
resp = requests.post("http://localhost:8000/search/", json={
    "keyword": "什么是RAG?",
    "mode": "search",
    "product": "forguncy"
})
print(resp.json())

# 对话流式接口示例
import sseclient
resp = requests.post("http://localhost:8000/chat_streaming/", json={
    "keyword": "你好",
    "messages": [{"role": "user", "content": "你好"}],
    "product": "forguncy"
}, stream=True)
for event in sseclient.SSEClient(resp):
    print(event.data)

总结

server.py 作为 gc-qa-rag 系统的核心后端服务,集成了多种现代化后端开发技术,兼顾了安全、性能、可维护性和用户体验。其灵活的接口设计和健壮的异常处理机制,为智能问答、知识检索等应用场景提供了坚实的基础。