kvcache-ai-ktransformers/doc/zh/api/server/server.md
2024-07-27 16:06:58 +08:00

41 lines
3.9 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.

# 后端服务Server
Server 将 ktransformers 的快速异构推理能力通过 API 提供给外界调用。
<img src="server-arch.png" height="600" alt="Server架构">
## API
Server 通过 RESTful API 对外提供模型推理服务,提供 ChatCompletion 和 Assistant 两种调用方式。
- ChatCompletion 接口要求用户一次提供所有的历史对话然后返回模型的回复。AI 服务提供商(例如[OpenAI](https://platform.openai.com/docs/api-reference/chat/create) )和本地推理框架(例如[Ollama](https://github.com/ollama/ollama/blob/main/docs/api.md) )都提供 ChatCompletion 接口。为了兼容 OpenAI 和 OllamaServer 分别提供和它们一致的 API 接口。因此,当前使用 OpenAI 和 Ollama 的应用可以无缝切换到我们的 Server。例如 [如何使用 Tabby 和 ktransformers 在本地利用 236B 的大模型做代码补全?](tabby.md)。
- Assistant 适用于应用需要复用一系列资源并调用模型的场景。例如,在教育应用场景中,应用开发者可以创建一个名为二年级数学老师的 Assistant并设置初始prompt“你是一个有经验的的二年级数学老师...”),上传相关的资料(二年级数学教材)。创建 Assistant 后,应用需要创建一个 Thread 来存储用户和模型的对话消息Message。调用模型时应用需要创建一个 Run 来获得 Assistant 的回复。相对于 ChatCompletion实现了 Assistant 的 Server 代替应用实现了对话背景复用和多轮对话,使得复杂场景下的模型的调用更加方便。 [OpenAI Assistant API](https://platform.openai.com/docs/api-reference/assistants/createAssistant) 提出了这样的 Assistant 接口,而 Server 也提供和它一致的 API 。
这些 API 定义在`server/api`中,它们的具体使用请见[这里](api.md)。
## 对接模型推理框架
Server 通过 ktransformers 调用模型并进行推理。Server 也支持其他的推理框架,例如已经支持的 [transformers](https://huggingface.co/docs/transformers/index) ,并计划支持 [exllamav2](https://github.com/turboderp/exllamav2)。这些功能在`server/backend` 中实现。
Server 将模型推理框架的推理功能抽象成一个基类`BackendInterfaceBase`。这个基类包含一个函数inference。它的输入是是历史的对话信息 messages输出是模型返回的文字结果。inference 函数采用 async generator 的设计,这使得 Server 可以流式地返回模型的回复。
```python
class BackendInterfaceBase:
async def inference(self, messages, **kwargs)->AsyncIterator[str]:
...
```
这个 inference 函数,因为它的输入和输出分别是历史对话和模型回复,所以它自然地实现了 ChatCompletion 的功能。因此 ChatCompletion API 可以直接调用inference 函数完成模型推理。
而 Assistant 则比 ChatCompletion 复杂许多,需要 Server 存储 Assistant 的相关状态,并以合适的方式调用 inference 函数。Server 在数据库中维护了一套 Assistant 逻辑,存储应用创建的 AssistantThread 和 Message。在内存中Server 为每个 Thread 维护一个 `ThreadContext`集合每个Thread 相关的 Assistant 等信息。当用户发出新的 Message 时Server 调用 ThreadContext 的get_local_messages函数获得 messages并调用 inference 函数获得推理结果。
```python
class MyThreadContext(ThreadContext):
def get_local_messages(self):
...
```
由于不同的模型推理框架有着不同的历史对话输入格式,所以 `ThreadContext``BackendInterface` 需要成对地使用。Server 除了自己的 ktransformers 之外,还支持 transformers。如果要对接其他的模型推理框架可以参考在 [transformers.py](https://github.com/kvcache-ai/ktransformers-dev/blob/main/ktransformers/server/backend/interfaces/transformers.py) 中`TransformersInterface``TransformersThreadContext`的实现。