Skip to content

Commit 9d37d79

Browse files
committed
fix search issue and make complete works
1 parent 2441d6b commit 9d37d79

File tree

10 files changed

+535
-156
lines changed

10 files changed

+535
-156
lines changed

docs/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# DeepChat 文档
2+
3+
本目录包含DeepChat的设计文档与使用指南。
4+
5+
## 设计文档
6+
7+
- [事件系统设计](./event-system-design.md) - 应用事件系统的设计与实现
8+
- [数据同步功能](./data-sync-feature.md) - 数据同步功能的设计与实现
9+
- [LLM Provider接口设计](./llm-provider-interface.md) - LLM Provider接口的设计,包括completions和streamCompletions的区别
10+
11+
## 构建指南
12+
13+
- [Linux构建指南](./linux-build-guide.md) - Linux系统下构建DeepChat的步骤

docs/llm-provider-interface.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# LLM Provider 接口设计文档
2+
3+
本文档详细介绍了DeepChat中LLM Provider的接口设计,特别是`completions``streamCompletions`方法的区别及使用场景。
4+
5+
## 基础架构设计
6+
7+
DeepChat采用了基于抽象类`BaseLLMProvider`的设计模式,所有特定的LLM提供商(如OpenAI、Anthropic、Gemini、Ollama等)都继承自这个基类并实现其抽象方法。
8+
9+
### BaseLLMProvider的主要职责
10+
11+
1. 定义所有LLM提供商必须实现的通用接口
12+
2. 提供模型管理功能(获取、添加、删除、更新模型)
13+
3. 提供工具调用相关的公共实用方法
14+
4. 处理提供商初始化、验证和代理配置
15+
16+
## completions与streamCompletions的区别
17+
18+
### completions方法
19+
20+
`completions`方法提供了同步(一次性)返回完整响应的能力:
21+
22+
```typescript
23+
abstract completions(
24+
messages: ChatMessage[],
25+
modelId: string,
26+
temperature?: number,
27+
maxTokens?: number
28+
): Promise<LLMResponse>
29+
```
30+
31+
**特点**
32+
- 一次性返回完整的响应结果
33+
- 包含完整的token使用统计
34+
- 解析并处理`<think>`标签,提取reasoning_content
35+
- 不进行工具调用(工具调用仅在stream版本中处理)
36+
- 适合需要等待完整结果的场景,如离线总结、标题生成等
37+
38+
**返回数据**
39+
- content:生成的主要内容
40+
- reasoning_content:思考过程(如果有)
41+
- totalUsage:token使用统计
42+
43+
### streamCompletions方法
44+
45+
`streamCompletions`方法提供了流式响应的能力:
46+
47+
```typescript
48+
abstract streamCompletions(
49+
messages: ChatMessage[],
50+
modelId: string,
51+
temperature?: number,
52+
maxTokens?: number
53+
): AsyncGenerator<LLMResponseStream>
54+
```
55+
56+
**特点**
57+
- 实时流式返回部分响应
58+
- 支持工具调用(通过function calling)
59+
- 支持思考过程的实时展示
60+
- 支持多轮工具调用的连续对话
61+
- 适合需要即时反馈的交互场景
62+
63+
**流式返回数据**
64+
- content:当前生成的内容片段
65+
- reasoning_content:当前生成的思考内容片段
66+
- tool_call相关信息:工具调用的各种状态和数据
67+
- totalUsage:最终的token使用统计(仅在流结束时)
68+
69+
## 实现细节
70+
71+
每个LLM提供商实现这两个方法的方式各不相同,但遵循相同的接口规范:
72+
73+
1. **OpenAICompatibleProvider**:使用OpenAI官方SDK实现,支持原生function calling
74+
2. **AnthropicProvider**:使用Anthropic官方SDK实现,支持Claude的tool use功能
75+
3. **GeminiProvider**:使用Google AI SDK实现,通过额外处理实现工具调用
76+
4. **OllamaProvider**:使用Ollama API实现,通过特殊提示词实现工具调用
77+
78+
## 常见处理流程
79+
80+
### completions处理流程
81+
82+
1. 格式化消息(用户、系统、助手消息)
83+
2. 配置请求参数(温度、最大token等)
84+
3. 发送请求获取完整响应
85+
4. 提取token使用统计
86+
5. 处理`<think>`标签,分离普通内容和思考内容
87+
6. 返回结构化响应
88+
89+
### streamCompletions处理流程
90+
91+
1. 格式化消息
92+
2. 配置工具定义(如果有)
93+
3. 创建流式请求
94+
4. 处理流式响应片段:
95+
- 普通内容片段
96+
- 思考内容片段
97+
- 工具调用识别和处理
98+
5. 如果有工具调用,处理工具调用并继续对话
99+
6. 最终返回token统计
100+
101+
## 设计考虑
102+
103+
1. **一致性**:所有提供商实现相同的接口,确保上层应用可以无缝切换
104+
2. **可扩展性**:新的LLM提供商只需继承BaseLLMProvider并实现其抽象方法
105+
3. **错误处理**:统一的错误处理机制,确保应用稳定性
106+
4. **代理支持**:内置代理配置支持,适应不同网络环境
107+
5. **自定义模型**:支持添加和管理自定义模型
108+
109+
## 使用最佳实践
110+
111+
- 对于需要即时反馈的对话场景,使用`streamCompletions`
112+
- 对于后台处理任务,如生成摘要或标题,使用`completions`
113+
- 对于需要工具调用的场景,使用`streamCompletions`
114+
- 使用`<think>`标签可以让模型展示思考过程
115+
116+
## 内部机制
117+
118+
### Token计数处理
119+
120+
不同提供商提供的token计数机制不同:
121+
- OpenAI提供准确的token计数
122+
- Anthropic在响应中包含input_tokens和output_tokens
123+
- Gemini需要估算token数量
124+
- Ollama通过prompt_eval_count和eval_count提供估计
125+
126+
### 思考内容处理
127+
128+
通过`<think>`标签识别模型的思考过程:
129+
- 识别`<think>``</think>`标签
130+
- 提取标签之间的内容作为reasoning_content
131+
- 将标签外的内容作为普通content返回

0 commit comments

Comments
 (0)