162 lines
12 KiB
Markdown
162 lines
12 KiB
Markdown
## 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"的对话模板,其中包含了初始化的系统消息、空的消息列表、定义的角色和消息分隔符。
|
||
***
|