12 KiB
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方法可能的返回值示例:
{
"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'的消息,因为这些消息通常是系统级别的指令或信息,不适合发送给模型处理。
输出示例: 假设输入的消息列表为:
[
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好,有什么可以帮助你的?"}
]
函数的返回值可能会是:
{
"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 参数值。这个过程可以帮助开发者理解函数如何接收和处理参数,以及如何在控制台中输出信息。
此函数的实现较为简单,主要包括以下两个步骤:
- 打印出 "embedding" 字符串,表示开始进行嵌入信息的处理。
- 打印出传入的
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",则函数的返回值可能如下所示:
Conversation(
name="ExampleModel",
system_message="You are a helpful, respectful and honest assistant.",
messages=[],
roles=["user", "assistant"],
sep="\n### ",
stop_str="###",
)
这表示创建了一个名为"ExampleModel"的对话模板,其中包含了初始化的系统消息、空的消息列表、定义的角色和消息分隔符。