ahserver/aidocs/llmProcessor.md
2025-10-05 12:07:12 +08:00

231 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LLM 处理器模块技术文档
```markdown
# LLM 处理器模块(`llm_processor.py`
本模块实现了基于 `BaseProcessor` 的三种不同模式的 LLM大语言模型请求处理器支持流式、同步和异步调用方式。通过模板引擎动态生成请求配置并结合 `LlmProxy` 系列代理类实现与 LLM 服务的交互。
---
## 模块依赖
```python
import aiohttp
from aiohttp import web, BasicAuth
from aiohttp import client
from appPublic.dictObject import DictObject
from .llm_client import StreamLlmProxy, AsyncLlmProxy, SyncLlmProxy
from .baseProcessor import *
```
### 依赖说明:
- **`aiohttp`**:用于构建异步 Web 服务及发起 HTTP 客户端请求。
- **`web` / `BasicAuth` / `client`**AIOHTTP 的核心组件,分别用于 Web 路由、认证和客户端操作。
- **`DictObject`**:来自 `appPublic.dictObject` 的字典封装类,将字典转换为可属性访问的对象。
- **`StreamLlmProxy`, `AsyncLlmProxy`, `SyncLlmProxy`**LLM 请求代理类,分别处理流式、异步和同步响应。
- **`BaseProcessor`**:所有处理器继承的基础类,提供通用运行环境设置和资源管理能力。
---
## 核心类概述
| 类名 | 功能描述 |
|-------------------|--------|
| `LlmProcessor` | 流式 LLM 请求处理器,适用于需要实时返回生成内容的场景(如聊天流)。 |
| `LlmSProcessor` | 同步式 LLM 请求处理器,等待完整响应后一次性返回结果。 |
| `LlmAProcessor` | 异步非阻塞式 LLM 请求处理器,适用于后台任务或延迟响应场景。 |
---
## 公共方法详解
### `@classmethod isMe(self, name)`
判断当前处理器是否匹配指定名称。
#### 参数:
- `name` (str): 请求路径中标识处理器类型的名称。
#### 返回值:
- `bool`: 若 `name` 匹配该处理器类型则返回 `True`
> 所有子类均通过此方法注册自身处理器类型(`llm`, `llms`, `llma`)。
---
### `async path_call(self, request, params={})`
从模板 URL 加载并渲染配置数据,解析为结构化对象。
#### 参数:
- `request` (`aiohttp.web.Request`):当前 HTTP 请求对象。
- `params` (dict, optional):额外传入的参数,用于模板渲染上下文。
#### 流程:
1. 设置运行环境(`set_run_env`
2. 构造完整请求路径 URL
3. 获取运行命名空间 `run_ns`
4. 更新命名空间中的参数
5. 使用模板引擎(`tmpl_engine`)渲染远程模板内容
6. 解析 JSON 字符串为 `DictObject`
#### 返回值:
- `DictObject`:包含 LLM 配置信息的对象,如模型地址、参数、提示词等。
#### 示例输出结构(假设模板返回):
```json
{
"model": "gpt-4",
"prompt": "你好,请介绍一下你自己。",
"temperature": 0.7,
"max_tokens": 1024
}
```
---
### `setheaders(self)`
占位方法,用于后续扩展自定义响应头设置。
> 当前为空实现(`pass`),可根据需求重写以添加 CORS、Content-Type 或其他头部字段。
---
## 各处理器类详细说明
### 1. `LlmProcessor` —— 流式处理器
#### 处理器标识:
```python
@classmethod
def isMe(cls, name):
return name == 'llm'
```
#### 方法:`async datahandle(request)`
执行流式 LLM 请求处理:
##### 步骤:
1. 调用 `path_call()` 获取配置对象 `d`
2. 创建 `StreamLlmProxy(self, d)` 实例
3. 发起流式请求:`await llm(request, self.run_ns.params_kw)`
4. 结果存入 `self.retResponse`(通常是一个 `StreamingResponse` 对象)
##### 特点:
- 支持逐块传输chunked transfer适合前端实时显示文本生成过程。
- 响应体不会被完全缓存,内存占用低。
---
### 2. `LlmSProcessor` —— 同步处理器
#### 处理器标识:
```python
@classmethod
def isMe(cls, name):
return name == 'llms'
```
#### 方法:`async datahandle(request)`
执行同步式 LLM 请求处理:
##### 步骤:
1. 调用 `path_call()` 获取配置对象 `d`
2. 创建 `SyncLlmProxy(self, d)` 实例
3. 发起同步请求并等待完整响应:`await llm(...)`
4. 结果存入 `self.content`(字符串或字典形式的结果)
##### 特点:
- 必须等待整个响应完成才返回。
- 适合对延迟不敏感但需获取完整结果的接口(如摘要生成、问答等)。
---
### 3. `LlmAProcessor` —— 异步处理器
#### 处理器标识:
```python
@classmethod
def isMe(cls, name):
return name == 'llma'
```
#### 方法:`async datahandle(request)`
执行异步非阻塞式 LLM 请求处理:
##### 步骤:
1. 调用 `path_call()` 获取配置对象 `d`
2. 创建 `AsyncLlmProxy(self, d)` 实例
3. 发起异步请求并获取响应:`await llm(...)`
4. 结果存入 `self.retResponse`
##### 特点:
- 可配合回调机制或消息队列使用。
- 不立即返回结果,常用于任务提交型 API。
---
## 设计模式与架构思想
### 分层设计
- **路由识别层**:通过 `isMe()` 判断处理器类型。
- **配置加载层**:统一使用 `path_call()` 渲染模板获取 LLM 配置。
- **执行代理层**:解耦具体调用逻辑至 `LlmProxy` 系列类。
- **响应处理层**:根据模式决定如何构造最终响应。
### 模板驱动配置
所有 LLM 请求参数均由外部模板文件控制,支持动态变量注入(如用户输入、会话状态等),提升灵活性与安全性。
### 异步 I/O 支持
全栈异步设计,充分利用 `aiohttp``async/await` 特性,支持高并发场景下的高效处理。
---
## 使用示例
假设存在以下模板 URL`/templates/llm/chat.json.tmpl`
```jinja2
{
"model": "qwen",
"prompt": "用户: {{ query }}\\n助手:",
"temperature": 0.8,
"max_tokens": 512
}
```
当访问 `/llm/chat` 时:
- `LlmProcessor` 将启动流式对话;
- `LlmSProcessor` 将返回完整回答;
- `LlmAProcessor` 将异步提交任务并可能返回任务 ID。
---
## 注意事项
1. **模板安全**:确保模板引擎对恶意输入进行过滤,防止 SSTI服务器端模板注入攻击。
2. **错误处理**:建议在 `datahandle` 中增加异常捕获逻辑,避免服务崩溃。
3. **性能调优**`chunk_size = 40960` 可根据网络状况调整。
4. **认证支持**:可通过重写 `setheaders` 或扩展 `BaseProcessor` 添加身份验证逻辑。
---
## 待优化建议
- 增加日志记录功能(如请求 ID、耗时统计
- 提供默认 `setheaders` 实现(如设置 `Content-Type: application/json`)。
- 支持更多 LLM 协议OpenAI、Anthropic、Ollama 等)。
- 添加中间件支持(限流、缓存、审计等)。
---
```
> 📝 **文档版本**v1.0
> 💡 **维护团队**:应用平台组
> 🕒 **最后更新**2025年4月5日