Skip to content

Commit b60b167

Browse files
committed
更新嵌入说明
1 parent 9dce8f5 commit b60b167

3 files changed

Lines changed: 114 additions & 13 deletions

File tree

docs/develop/practice.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,11 @@ if isinstance(response, ModelCompletions):
162162
# 如果是流式调用
163163
else:
164164
response_chunks: list[str] = []
165+
response_usage = -1
166+
response_status = True
165167
async for chunk in response:
166168
response_chunks.append(chunk.chunk)
167-
response_usage = chunk.usage or chunk.usage
169+
response_usage = chunk.usage if chunk.usage > response_usage else response_usage
168170
response_status = chunk.succeed if not chunk.succeed else response_status
169171
# 拼接流式响应
170172
response_text = "".join(response_chunks)
@@ -194,3 +196,38 @@ def process_message(message: str) -> str:
194196

195197
return result
196198
```
199+
200+
### 获取文本嵌入信息
201+
202+
```python
203+
from muicebot.config import get_embedding_model_config
204+
from muicebot.llm import load_embedding_model
205+
from async_lru import alru_cache
206+
207+
# 请注意,由于 `embedding_model_config` 对于用户而言是可选的
208+
# 当配置文件不存在/为空时,会抛出 `FileNotFoundError`
209+
embedding_model = load_embedding_model(get_embedding_model_config())
210+
211+
@alru_cache(maxsize=1024)
212+
async def _get_embedding(self, text: str) -> ndarray:
213+
"""
214+
调用 OpenAI API 兼容端口获取字符串的嵌入向量,支持离线缓存
215+
216+
:param text: 要查询的字符串
217+
"""
218+
logger.debug(f"正在查询文本嵌入向量: {text[:50]}...")
219+
220+
# 缓存未命中,调用 API
221+
start_time = perf_counter()
222+
try:
223+
response = await embedding_model.embed([text])
224+
embedding = np.array(response.embeddings[0])
225+
226+
end_time = perf_counter()
227+
logger.debug(f"已完成查询,用时: {end_time - start_time}s")
228+
return embedding
229+
230+
except Exception as e:
231+
logger.error(f"获取嵌入向量失败: {e}")
232+
raise
233+
```

docs/guide/embedding.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 嵌入模型配置📎
2+
3+
## 嵌入模型提供者信息
4+
5+
类似于模型加载器,在 Muicebot 中,每一个可用于获取字符串的嵌入向量形式的嵌入模型被称为嵌入模型加载器,这些模型加载器存放于代码目录中的 `muicebot.llm.embeddings` 文件夹下,并通常以首字母大写的形式命名以便于 SDK 区分。
6+
7+
每个嵌入模型加载器都继承于模型基类 `EmbeddingModel` 并统一使用 `EmbeddingConfig` 获取配置项,但由于 SDK 实现情况,每个嵌入模型加载器所需要的配置项和实现的功能都不尽相同。
8+
9+
**嵌入模型的配置是可选的,当且仅当你安装了需要使用嵌入模型的插件(比如 muicebot-plugin-memory)时才需要配置**
10+
11+
本页面列举了每一个嵌入模型加载器目前在 Muicebot 中实现的功能并给出了它们所支持的配置项。
12+
13+
### 实现的加载器及其支持的模型
14+
15+
我们目前实现了以下模型加载器:
16+
17+
| 模型加载器 | 介绍 | 模型列表 |
18+
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
19+
| [Azure](https://github.com/Moemu/MuiceBot/tree/main/Muice/llm/Azure.py) | 可调用 [GitHub Marketplace ](https://github.com/marketplace/models)中的在线模型 | [Github MarketPlace](https://github.com/marketplace?type=models) |
20+
| [Dashscope](https://github.com/Moemu/MuiceBot/tree/main/Muice/llm/Dashscope.py) | 可调用阿里云百炼平台的在线模型 | [官方文档](https://help.aliyun.com/zh/model-studio/getting-started/models) |
21+
| [Gemini](https://aistudio.google.com/) | 使用 Gemini Python SDK 访问 Google Gemini 服务中的模型 | [模型列表](https://ai.google.dev/gemini-api/docs/models?hl=zh-cn) |
22+
| [Ollama](https://github.com/Moemu/MuiceBot/tree/main/Muice/llm/Ollama.py) | 使用 Ollama Python SDK 访问 Ollama 接口,需要提前启动 Ollama 服务器 | [模型列表](https://ollama.com/search) |
23+
| [Openai](https://github.com/Moemu/MuiceBot/tree/main/Muice/llm/Openai.py) | 可调用 OpenAI API 格式的接口 | _any_ |
24+
25+
对于不同的加载器,可能需要额外的依赖,请根据报错提示安装。
26+
27+
## 编写配置
28+
29+
`configs` 文件夹下新建 `embeddings.yml`,用于存储嵌入模型加载器的配置。
30+
31+
**基本格式**
32+
33+
对于不同的模型加载器,所需要的配置项都大体相似。以下示例列出了所有支持的配置项。
34+
35+
```yaml
36+
default: # 配置名称。唯一,可任取,不一定和模型加载器名称有关联
37+
provider: openai # 模型加载器名称。对应的是 `muicebot/llm/providers` 下的 `.py` 文件。
38+
default: true # 是否默认
39+
model: "text-embedding-v4" # 嵌入模型名称
40+
api_key: sk-xxxxxxxxxxxxxxxxxxx # 在线服务的 api key
41+
api_secret: 0d000721Onanie # 在线服务的 api secret(对于 Openai 来说可忽略)
42+
api_host: "https://dashscope.aliyuncs.com/compatible-mode/v1" # base_url
43+
```
44+
45+
## 关于嵌入信息的统一性
46+
47+
一般来说,我们强烈推荐**有且仅有一个长久使用的嵌入模型配置**,因为对于一段文本来说,不同嵌入模型返回的结果都大不相同,如果使用不同的模型会导致最终计算的结果失准或产生异常错误。
48+
49+
不需要保证大语言模型和嵌入模型的模型加载器/模型类别是相同的。目前仅支持查询文本的向量嵌入
50+
51+
## 嵌入的缓存
52+
53+
每一次查询嵌入都会优先从本地收集缓存,目的是节省缓存查询次数和开销。缓存目录为 `get_plugin_data_dir() / embedding`
54+
55+
为了确保在切换缓存模型时,原有的缓存与新的嵌入不会产生冲突,我们同时写入了以下 `json` 内容来确保缓存安全:
56+
57+
```json
58+
{
59+
"provider": "<模型提供者类名>",
60+
"api_host": "<self.config.api_host>",
61+
"model": "<self.config.model>",
62+
"text_hash": "<文本的 sha256 内容>",
63+
}
64+
```

docs/guide/model.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 模型加载器信息
44

5-
在 Muicebot 中,每一个可用于与 LLM 进行交互的实例被称为模型加载器,这些模型加载器存放于代码目录中的 `muicebot.llm` 文件夹下,并通常以首字母大写的形式命名以便于 SDK 区分。
5+
在 Muicebot 中,每一个可用于与 LLM 进行交互的实例被称为模型加载器(也叫做模型服务提供者),这些模型加载器存放于代码目录中的 `muicebot.llm` 文件夹下,并通常以首字母大写的形式命名以便于 SDK 区分。
66

77
每个模型加载器都继承于模型基类 `BasicModel` 并统一使用 `ModelConfig` 获取配置项,但由于 SDK 实现情况,每个模型加载器所需要的配置项和实现的功能都不尽相同。
88

@@ -22,7 +22,7 @@
2222

2323
对于不同的加载器,可能需要额外的依赖,请根据报错提示安装。
2424

25-
有关各个模型加载器的配置,参见 [模型加载器配置](/model/configuration.md)
25+
有关各个模型加载器的配置,参见 [模型加载器配置](#模型加载器配置项一览)
2626

2727
### 加载器功能支持列表
2828

@@ -70,7 +70,7 @@
7070

7171
```yaml
7272
azure: # 配置名称。唯一,可任取,不一定和模型加载器名称有关联
73-
loader: Azure # 模型加载器名称。对应的是 `muicebot/llm` 下的 `.py` 文件。通常模型加载器的首字母都是大写
73+
provider: Azure # 模型加载器名称。对应的是 `muicebot/llm` 下的 `.py` 文件。通常模型加载器的首字母都是大写
7474
model_name: DeepSeek-R1 # 模型名称(可选,默认为 DeepSeek-R1)
7575
template: Muice # 人设提示词 Jinja2 模板名称(不用带文件后缀)
7676
api_key: ghp_xxxxxxxxxxxxxxxxx # GitHub Token(若配置了环境变量,此项不填)
@@ -81,13 +81,13 @@ azure: # 配置名称。唯一,可任取,不一定和模型加载器名称
8181
8282
以上给出了 Azure 模型加载器的一个示例配置,您可以在接下来的 [模型加载器配置项一览](#模型加载器配置项一览) 一节中获取这些模型加载器分别支持的配置。
8383
84-
如果你不知道这些配置中哪些是必须的,那么你可以先填写一个 `loader` 配置,模型加载器初始化时会抛出错误并提示您
84+
如果你不知道这些配置中哪些是必须的,那么你可以先填写一个 `provider` 配置,模型加载器初始化时会抛出错误并提示您
8585

8686
我们支持多个模型配置,并可在聊天中通过指令动态切换,例如:
8787

8888
```yaml
8989
dashscope:
90-
loader: Dashscope # 使用 dashscope 加载器
90+
provider: Dashscope # 使用 dashscope 加载器
9191
default: true # 默认配置文件
9292
template: Muice # 人设提示词 Jinja2 模板名称(不用带文件后缀)
9393
multimodal: true # 是否启用多模态(可选,注意:使用的模型必须是多模态的)
@@ -100,7 +100,7 @@ dashscope:
100100
repetition_penalty: 1.2
101101
102102
azure:
103-
loader: Azure # 使用 azure 加载器
103+
provider: Azure # 使用 azure 加载器
104104
model_name: DeepSeek-R1 # 模型名称(可选,默认为 DeepSeek-R1)
105105
template: Muice # 人设提示词 Jinja2 模板名称(不用带文件后缀)
106106
token: ghp_xxxxxxxxxxxxxxxxx # GitHub Token(若配置了环境变量,此项不填)
@@ -121,7 +121,7 @@ azure:
121121
下面的配置项是每一个模型加载器都共有的,并且发挥着重要的功能:
122122

123123
```yaml
124-
loader: Openai # 模型加载器名称,这些模型加载器位于插件目录下的 llm 文件夹中,并初始化同名文件的同名类,如果不存在则报错。注意,每个模型加载器因为兼容问题,开头首字母都是大写的
124+
provider: openai # 模型加载器名称,这些模型加载器位于插件目录下的 llm/providers 文件夹中,并初始化同名文件的同名类,如果不存在则报错。
125125
multimodal: true # 多模态支持。设置为 true 将处理多模态事件。如果调用的模型不是多模态模型忽略这些多模态消息
126126
127127
template: Muice # 人设提示词 Jinja2 模板,模板文件需要存放在 `./templates` 文件夹下。Muice为内嵌模板。默认值为空或全局默认值
@@ -139,7 +139,7 @@ template_mode: system # 模板嵌入模式: `system` 为嵌入到系统提示; `
139139
### Azure (Github Models)
140140
141141
```yaml
142-
loader: Azure # 使用 Azure 加载器(必填)
142+
provider: Azure # 使用 Azure 加载器(必填)
143143
model_name: DeepSeek-R1 # 模型名称(必填)
144144
api_key: <your-github-token-goes-here> # GitHub Token 或 Azure Key(必填)
145145
template: Muice # 使用的模板名称(可选,无默认值)
@@ -156,7 +156,7 @@ function_call: false # 是否启用工具调用(可选。需要编写 function
156156
### Dashscope (阿里百炼大模型平台)
157157
158158
```yaml
159-
loader: Dashscope # 使用 Dashscope 加载器(必须)
159+
provider: Dashscope # 使用 Dashscope 加载器(必须)
160160
model_name: qwen-max # 模型名称(必须)
161161
template: Muice # 使用的模板名称(可选,无默认值)
162162
multimodal: false # 是否启用多模态(可选。注意:使用的模型必须是多模态的)
@@ -174,7 +174,7 @@ content_security: false # 内容安全(可选。需要开通内容审核服务
174174
### Gemini (Google)
175175
176176
```yaml
177-
loader: Gemini # 使用 Dashscope 加载器(必须)
177+
provider: Gemini # 使用 Dashscope 加载器(必须)
178178
model_name: gemini-2.0-flash # 模型名称(必须)
179179
template: Muice # 使用的模板名称(可选,无默认值)
180180
multimodal: false # 是否启用多模态(可选。注意:使用的模型必须是多模态的)
@@ -195,7 +195,7 @@ content_security: false # 内容安全(可选。默认为中级及以上)
195195
### Ollama
196196
197197
```yaml
198-
loader: Ollama # 使用 Ollama 加载器(必填)
198+
provider: Ollama # 使用 Ollama 加载器(必填)
199199
model_name: deepseek-r1 # ollama 模型名称(必填)
200200
template: Muice # 使用的模板名称(可选,无默认值)
201201
api_host: http://localhost:11434 # ollama 客户端端口(可选)
@@ -213,7 +213,7 @@ function_call: false # 是否启用工具调用(可选。需要编写 function
213213
### Openai (支持 DeepSeek 官方 API 调用)
214214
215215
```yaml
216-
loader: Openai # 使用 openai 加载器(必填)
216+
provider: Openai # 使用 openai 加载器(必填)
217217
model_name: text-davinci-003 # 模型名称(必填)
218218
template: Muice # 使用的模板名称(可选,无默认值)
219219
api_key: xxxxxx # API 密钥(必须)

0 commit comments

Comments
 (0)