Langchain-Chatchat/markdown_docs/server/model_workers/gemini.md

162 lines
12 KiB
Markdown
Raw Normal View History

2024-12-20 16:04:03 +08:00
## ClassDef GeminiWorker
**GeminiWorker**: GeminiWorker类是用于处理与Gemini API交互的工作流程。
**属性**:
- `controller_addr`: 控制器地址,用于与控制器进行通信。
- `worker_addr`: 工作器地址,用于标识工作器的位置。
- `model_names`: 模型名称列表,默认为["gemini-api"],用于指定要交互的模型。
- `context_len`: 上下文长度默认为4096用于指定处理的文本长度上限。
**代码描述**:
GeminiWorker类继承自ApiModelWorker类专门用于处理与Gemini API的交互。它通过重写父类的方法实现了与Gemini API特定的交互逻辑。
- `__init__`方法用于初始化GeminiWorker对象接收控制器地址、工作器地址、模型名称等参数并设置了默认的上下文长度为4096。
- `create_gemini_messages`方法用于将消息列表转换为Gemini API所需的格式。该方法检查消息历史中是否包含助手的角色以决定消息转换的方式。
- `do_chat`方法实现了与Gemini API进行聊天的功能。它首先加载配置然后创建符合Gemini API要求的消息格式并发送请求到Gemini API处理响应并返回生成的文本。
- `get_embeddings`方法打印了嵌入信息,但未实现具体的嵌入逻辑。
- `make_conv_template`方法用于创建对话模板,但具体实现依赖于子类。
**注意**:
- 使用GeminiWorker时需要确保提供的控制器地址和工作器地址有效以及模型名称正确对应于Gemini API提供的模型。
- `do_chat`方法中使用了HTTPX库进行网络请求需要注意网络环境和API密钥的配置。
- 该类中的`create_gemini_messages`和`do_chat`方法是与Gemini API交互的核心需要根据Gemini API的更新维护这些方法。
**输出示例**:
调用`do_chat`方法可能的返回值示例:
```json
{
"error_code": 0,
"text": "这是由Gemini模型生成的回复文本。"
}
```
此示例展示了成功调用Gemini API并获取到模型生成的回复文本其中`error_code`为0表示成功。
### FunctionDef __init__(self)
**__init__**: __init__函数的作用是初始化GeminiWorker对象。
**参数**:
- **controller_addr**: 字符串类型默认为None表示控制器的地址。
- **worker_addr**: 字符串类型默认为None表示工作节点的地址。
- **model_names**: 字符串列表类型,默认为["gemini-api"],表示模型的名称列表。
- **kwargs**: 关键字参数,可以接受额外的参数,用于扩展或自定义初始化过程。
**代码描述**:
此__init__函数是GeminiWorker类的构造函数用于初始化一个GeminiWorker对象。在初始化过程中它接受几个参数包括控制器地址controller_addr、工作节点地址worker_addr和模型名称列表model_names。这些参数允许用户在创建GeminiWorker对象时指定这些重要的配置信息。
函数首先将`model_names`、`controller_addr`和`worker_addr`参数通过`kwargs.update()`方法更新到`kwargs`字典中。这样做的目的是将这些参数统一处理,便于后续操作。
接着,通过`kwargs.setdefault("context_len", 4096)`设置`context_len`参数的默认值为4096如果在`kwargs`中已经存在`context_len`,则保持原值不变。这一步骤确保了即使用户没有明确提供`context_len`参数GeminiWorker对象也有一个默认的上下文长度。
最后,通过`super().__init__(**kwargs)`调用基类的构造函数完成GeminiWorker对象的初始化。这一步骤允许GeminiWorker继承并使用基类提供的方法和属性同时也确保了任何额外的关键字参数通过`kwargs`传递)都被正确处理。
**注意**:
- 在使用GeminiWorker对象时确保提供正确的`controller_addr`和`worker_addr`这对于确保GeminiWorker能够正确连接到控制器和工作节点至关重要。
- `model_names`参数允许用户指定一个或多个模型名称这些模型将在GeminiWorker中被加载和使用。默认情况下它包含"gemini-api"作为模型名称,但用户可以根据需要修改此列表。
- 通过`kwargs`参数,用户可以提供额外的配置选项,这提供了高度的灵活性和可扩展性。务必注意,任何通过`kwargs`传递的额外参数都应该是GeminiWorker或其基类能够识别和处理的。
***
### FunctionDef create_gemini_messages(self, messages)
**create_gemini_messages**: 此函数的功能是将输入的消息列表转换为适用于Gemini模型的格式。
**参数**:
- messages: 需要被转换格式的消息列表,每个消息是一个包含'role'和'content'键的字典。
**代码描述**:
`create_gemini_messages`函数接收一个消息列表作为输入,这个列表中的每个消息都是一个字典,包含'role'(角色)和'content'(内容)。函数首先检查消息列表中是否存在角色为'assistant'的消息,以确定是否有历史对话记录。接着,函数遍历消息列表,根据角色和是否有历史记录的情况,转换每条消息的格式。如果消息的角色是'system',则跳过不处理。如果有历史记录并且消息角色是'assistant',则将角色改为'model',并将消息内容放入'parts'列表中。如果没有历史记录但消息角色是'user',则直接将消息内容放入'parts'列表中。最后,函数将转换后的消息列表封装成一个字典返回。
在项目中,`create_gemini_messages`函数被`do_chat`方法调用。`do_chat`方法使用此函数将用户和系统的交互消息转换为Gemini模型能够处理的格式然后将这些消息连同生成配置一起发送到Gemini模型的API以获取模型的响应。这说明`create_gemini_messages`函数在处理用户输入和系统生成的消息,以及准备这些消息以供模型处理方面起着关键作用。
**注意**:
- 确保输入的消息列表中的每个消息字典都包含'role'和'content'键。
- 此函数不处理角色为'system'的消息,因为这些消息通常是系统级别的指令或信息,不适合发送给模型处理。
**输出示例**:
假设输入的消息列表为:
```json
[
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好,有什么可以帮助你的?"}
]
```
函数的返回值可能会是:
```json
{
"contents": [
{"role": "model", "parts": [{"text": "你好,有什么可以帮助你的?"}]},
{"parts": [{"text": "你好"}]}
]
}
```
这个返回值中包含了转换后的消息列表适用于发送给Gemini模型进行处理。
***
### FunctionDef do_chat(self, params)
**do_chat**: 此函数的功能是执行聊天操作通过调用Gemini模型的API生成聊天内容。
**参数**:
- `params`: `ApiChatParams`类型,包含聊天请求所需的参数。
**代码描述**:
`do_chat`函数首先通过`params.load_config`方法加载模型配置,这一步骤确保了聊天操作使用正确的模型参数。接着,函数调用`create_gemini_messages`方法将用户输入的消息转换为Gemini模型能够理解的格式。之后函数构建了一个字典`generationConfig`,包含了生成聊天内容所需的配置,如温度(`temperature`)、最大输出令牌数(`maxOutputTokens`)等。
函数将生成配置添加到`data`字典中并构造了一个请求URL该URL指向Gemini模型的API并附加了API密钥。随后设置了HTTP请求的头部信息并通过`get_httpx_client`函数获取一个httpx客户端实例用于发送POST请求到模型的API。
在发送请求并接收响应的过程中函数通过迭代响应的每一行来构建完整的JSON字符串。如果在响应中检测到了候选回复`candidates`),函数将遍历这些候选回复,并从中提取文本内容,最终通过`yield`语句返回包含错误码和文本内容的字典。
**注意**:
- 在使用`do_chat`函数时,需要确保传入的`params`参数是`ApiChatParams`类型的实例,且已正确填充了所有必要的字段。
- 函数依赖于`create_gemini_messages`方法来转换消息格式确保消息能被Gemini模型正确理解。
- 函数通过`get_httpx_client`获取httpx客户端实例来发送请求这一步骤涉及网络通信因此可能受到网络环境的影响。
- 函数使用了`json.loads`来解析JSON字符串如果响应格式不正确可能会抛出`json.JSONDecodeError`异常。
- 由于函数使用了`yield`语句,它实际上是一个生成器函数,调用此函数时需要注意迭代接收返回值。
***
### FunctionDef get_embeddings(self, params)
**get_embeddings**: 此函数的功能是打印嵌入信息和参数。
**参数**:
- `params`: 此参数用于接收传入的参数信息。
**代码描述**:
`get_embeddings` 函数是 `GeminiWorker` 类的一个方法,主要用于展示如何处理和打印传入的参数信息。当调用此函数时,它首先打印出字符串 "embedding",随后打印出传入的 `params` 参数值。这个过程可以帮助开发者理解函数如何接收和处理参数,以及如何在控制台中输出信息。
此函数的实现较为简单,主要包括以下两个步骤:
1. 打印出 "embedding" 字符串,表示开始进行嵌入信息的处理。
2. 打印出传入的 `params` 参数,这可以是任何形式的数据,函数将直接将其输出到控制台。
**注意**:
- 在实际应用中,`get_embeddings` 函数可能需要根据实际需求进行扩展和修改,以处理更复杂的数据结构或执行更复杂的嵌入计算。
- 此函数目前仅用于演示和教学目的,实际使用时可能需要根据具体的业务逻辑进行相应的调整。
- 参数 `params` 应根据实际情况传入相应的数据,以确保函数能够正确处理和输出期望的信息。
***
### FunctionDef make_conv_template(self, conv_template, model_path)
**make_conv_template函数的功能**: 创建一个对话模板实例。
**参数**:
- **conv_template**: 字符串类型,指定对话模板的具体内容。此参数在当前实现中未直接使用,但保留以便未来扩展。
- **model_path**: 字符串类型,指定模型路径。此参数在当前实现中未直接使用,但保留以便未来扩展。
**代码描述**:
`make_conv_template`函数负责创建一个`Conversation`类的实例。这个实例包含了一系列初始化的属性,用于定义一个对话模板。这些属性包括:
- `name`: 对话的名称,这里使用`self.model_names[0]`,即模型名称列表中的第一个名称。
- `system_message`: 系统消息,这里固定为"You are a helpful, respectful and honest assistant.",表示助手的行为准则。
- `messages`: 对话消息列表,初始化为空列表,表示对话开始时没有任何消息。
- `roles`: 对话中的角色列表,包含"user"和"assistant",分别表示用户和助手。
- `sep`: 消息分隔符,这里设为"\n### ",用于分隔对话中的不同消息。
- `stop_str`: 对话终止字符串,这里设为"###",用于标识对话的结束。
**注意**:
- 虽然`conv_template`和`model_path`参数在当前函数实现中未被直接使用,但它们的存在为函数提供了扩展性。在未来的版本中,这些参数可能会被用来定制对话模板或指定模型路径。
- 创建的`Conversation`实例是基于预定义的属性值。如果需要不同的对话设置,需要修改这些属性值。
**输出示例**:
假设`self.model_names[0]`的值为"ExampleModel",则函数的返回值可能如下所示:
```python
Conversation(
name="ExampleModel",
system_message="You are a helpful, respectful and honest assistant.",
messages=[],
roles=["user", "assistant"],
sep="\n### ",
stop_str="###",
)
```
这表示创建了一个名为"ExampleModel"的对话模板,其中包含了初始化的系统消息、空的消息列表、定义的角色和消息分隔符。
***