476 lines
41 KiB
Markdown
476 lines
41 KiB
Markdown
|
|
## ClassDef ApiConfigParams
|
|||
|
|
**ApiConfigParams**: ApiConfigParams类的功能是定义在线API配置参数,允许从默认配置自动填充未提供的值。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `api_base_url`: 可选字符串,API的基础URL。
|
|||
|
|
- `api_proxy`: 可选字符串,用于API请求的代理。
|
|||
|
|
- `api_key`: 可选字符串,API的访问密钥。
|
|||
|
|
- `secret_key`: 可选字符串,API的秘密密钥。
|
|||
|
|
- `group_id`: 可选字符串,用于minimax的组ID。
|
|||
|
|
- `is_pro`: 布尔值,标记是否为minimax的专业版。
|
|||
|
|
- `APPID`: 可选字符串,用于xinghuo的应用ID。
|
|||
|
|
- `APISecret`: 可选字符串,用于xinghuo的API密钥。
|
|||
|
|
- `is_v2`: 布尔值,标记是否为xinghuo的v2版本。
|
|||
|
|
- `worker_name`: 可选字符串,工作器名称。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
ApiConfigParams类继承自BaseModel,用于封装和管理API配置参数。该类提供了灵活的配置方式,允许通过代码直接设置参数,也支持从外部配置文件自动加载未提供的参数值。通过`root_validator`装饰器,该类在实例化时会自动检查并填充那些未明确提供但在外部配置中存在的参数值。此外,`load_config`方法允许在实例化后动态加载或更新配置,进一步增加了灵活性。`Config`子类中的`extra = "allow"`设置允许该模型接受并包含在输入数据中但未在模型声明中明确指定的额外字段,这为扩展性提供了便利。
|
|||
|
|
|
|||
|
|
从项目结构来看,ApiConfigParams类被ApiModelParams类和ApiEmbeddingsParams类继承,这表明ApiConfigParams提供了一组基础配置参数,而其子类则根据不同的应用场景扩展了额外的配置项。例如,ApiModelParams类添加了与模型版本和部署相关的参数,而ApiEmbeddingsParams类则专注于嵌入式模型的配置。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiConfigParams类时,应确保相关的外部配置正确设置,以便能够自动填充未提供的参数值。
|
|||
|
|
- 对于特定的API(如minimax和xinghuo),需要注意其特定参数(如`group_id`、`APPID`等)的正确设置。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
由于ApiConfigParams类主要用于配置管理,其输出示例依赖于具体的配置数据。例如,如果配置了`api_base_url`为`"https://api.example.com"`且`is_pro`为`True`,则ApiConfigParams实例的相关属性将分别反映这些值。
|
|||
|
|
### ClassDef Config
|
|||
|
|
**Config**: Config 类的功能是定义配置参数的额外处理方式。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- extra: 定义了对额外字段的处理策略。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
Config 类是一个简单的配置类,其主要目的是指定如何处理额外的配置参数。在这个类中,只定义了一个属性 `extra`。`extra` 属性的值设置为 `"allow"`,这意味着在处理配置参数时,如果遇到额外的、未明确声明在配置类中的参数,将会允许这些额外的参数存在,而不会引发错误或警告。这种处理方式在某些情况下非常有用,特别是当你希望你的配置能够灵活地接受一些不是事先定义好的参数时。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 使用 Config 类时,需要注意 `extra` 属性的值将直接影响配置参数的处理方式。在默认情况下,`extra` 被设置为 `"allow"`,但根据实际需求,开发者可以修改这个值以适应不同的处理策略,例如拒绝额外的参数或仅接受特定的额外参数。
|
|||
|
|
- 在实际应用中,Config 类可以根据需要扩展,添加更多的属性和方法来满足更复杂的配置需求。但是,开发者在扩展时应保持对配置处理逻辑的清晰和一致性,以避免引入潜在的错误。
|
|||
|
|
***
|
|||
|
|
### FunctionDef validate_config(cls, v)
|
|||
|
|
**validate_config**: 此函数的功能是验证并更新API配置参数。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- cls: 类方法的第一个参数,指代当前类。
|
|||
|
|
- v: 字典类型,包含API配置参数。
|
|||
|
|
|
|||
|
|
**代码描述**: `validate_config` 函数首先尝试通过调用`get_model_worker_config`函数,根据传入的配置字典`v`中的`"worker_name"`键值获取模型工作配置。如果成功获取到配置,则遍历当前类(`cls`)的字段(`__fields__`),检查这些字段是否存在于获取到的模型工作配置中。如果存在,将这些字段的值更新为模型工作配置中对应的值。最后,返回更新后的配置字典`v`。
|
|||
|
|
|
|||
|
|
此函数与`get_model_worker_config`函数紧密相关,后者负责加载指定模型工作配置项,包括从默认配置、在线模型配置和特定模型配置中合并配置项。`validate_config`函数利用这一特性,确保传入的配置参数中包含了所有必要的、最新的配置信息,特别是当某些配置项可能在类定义中未明确指定默认值时。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 确保在调用此函数之前,已经正确设置了相关模型的配置信息,包括默认配置、在线模型配置和特定模型配置。
|
|||
|
|
- 此函数主要用于内部配置验证和更新,通常在模型初始化或配置更新时被调用。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设存在一个模型工作配置,其中`"worker_name"`对应的值为`"example_worker"`,并且`get_model_worker_config`返回的配置字典包含`{"example_field": "example_value"}`。如果`cls.__fields__`包含`"example_field"`,则调用`validate_config`后返回的字典将包含`{"worker_name": "example_worker", "example_field": "example_value"}`。
|
|||
|
|
***
|
|||
|
|
### FunctionDef load_config(self, worker_name)
|
|||
|
|
**load_config**: 此函数的功能是为特定工作器加载配置。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- worker_name: 字符串类型,指定要加载配置的工作器名称。
|
|||
|
|
|
|||
|
|
**代码描述**: `load_config` 函数首先将传入的`worker_name`保存到实例变量中。接着,它调用`get_model_worker_config`函数,尝试根据`worker_name`获取模型工作器的配置。如果配置获取成功,函数将遍历实例的所有字段(由`self.__fields__`提供),并且如果字段名称存在于配置中,则使用`setattr`函数更新实例的相应字段值为配置中的值。最后,函数返回配置好的实例自身。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 确保在调用此函数之前,`worker_name`对应的配置已经在配置文件或数据库中正确设置。
|
|||
|
|
- 此函数依赖于`get_model_worker_config`函数来获取具体的配置信息,该函数负责从配置源(如文件、数据库等)中加载配置。
|
|||
|
|
- `self.__fields__`应包含所有可能需要从配置中加载的字段名称,确保这些字段在类定义中已经声明。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设存在一个工作器名称为"example_worker",并且其配置信息如下:
|
|||
|
|
```python
|
|||
|
|
{
|
|||
|
|
"worker_name": "example_worker",
|
|||
|
|
"max_tokens": 1024,
|
|||
|
|
"temperature": 0.7
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
调用`load_config("example_worker")`后,实例的`worker_name`将被设置为"example_worker",`max_tokens`和`temperature`字段也将根据配置信息被相应更新。返回的实例将包含这些更新后的字段值。
|
|||
|
|
***
|
|||
|
|
## ClassDef ApiModelParams
|
|||
|
|
**ApiModelParams**: ApiModelParams类的功能是扩展ApiConfigParams类,用于定义与模型相关的配置参数。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `version`: 可选字符串,定义模型的版本。
|
|||
|
|
- `version_url`: 可选字符串,定义模型版本的URL。
|
|||
|
|
- `api_version`: 可选字符串,专为Azure服务定义的API版本。
|
|||
|
|
- `deployment_name`: 可选字符串,专为Azure服务定义的部署名称。
|
|||
|
|
- `resource_name`: 可选字符串,专为Azure服务定义的资源名称。
|
|||
|
|
- `temperature`: 浮点数,定义生成文本的温度参数。
|
|||
|
|
- `max_tokens`: 可选整数,定义生成文本的最大令牌数。
|
|||
|
|
- `top_p`: 可选浮点数,默认为1.0,定义生成文本时的top-p采样参数。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
ApiModelParams类继承自ApiConfigParams类,专门用于配置与模型相关的参数。该类通过添加模型版本、部署名称、资源名称等属性,为特定的模型部署场景(如Azure服务)提供了配置支持。此外,它还包括了控制模型生成文本行为的参数,如`temperature`、`max_tokens`和`top_p`,这些参数对于调整模型输出的质量和长度至关重要。ApiModelParams类通过提供这些额外的配置项,使得开发者能够更灵活地控制模型的行为和性能。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiModelParams类时,应根据实际的部署环境(如是否部署在Azure上)和模型需求,正确设置相关参数。例如,如果模型部署在Azure上,那么`api_version`、`deployment_name`和`resource_name`等参数就需要被正确配置。
|
|||
|
|
- 对于`temperature`、`max_tokens`和`top_p`等参数,开发者应根据模型的特性和预期的输出效果进行调整,以达到最佳的性能和输出质量。
|
|||
|
|
|
|||
|
|
ApiModelParams类在项目中的应用场景包括但不限于ApiChatParams和ApiCompletionParams类,这两个类分别用于配置聊天请求参数和完成请求参数,它们通过继承ApiModelParams类,不仅继承了与模型相关的基础配置,还可以根据需要添加特定于聊天或完成请求的额外配置。这种设计使得模型配置在不同类型的请求之间具有很好的复用性和扩展性。
|
|||
|
|
## ClassDef ApiChatParams
|
|||
|
|
**ApiChatParams**: 用于定义聊天请求参数的类。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `messages`: 消息列表,每个消息是一个包含字符串键值对的字典。
|
|||
|
|
- `system_message`: 可选字符串,用于minimax算法中的系统消息。
|
|||
|
|
- `role_meta`: 字典类型,默认为空,用于minimax算法中的角色元数据。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
ApiChatParams类继承自ApiModelParams类,专门用于配置聊天请求的参数。该类通过`messages`属性接收一个消息列表,每个消息是一个字典,包含角色和内容等信息。此外,它还提供了`system_message`和`role_meta`属性,这些属性主要用于minimax算法中,以支持更复杂的聊天场景。通过继承ApiModelParams类,ApiChatParams不仅包含了与模型相关的基础配置,如模型版本、API版本等,还增加了特定于聊天请求的参数,使得开发者能够灵活地控制聊天模型的行为。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiChatParams类时,开发者需要根据具体的聊天场景和模型要求,正确填充`messages`列表。每个消息都应该是一个字典,至少包含角色和内容信息。
|
|||
|
|
- 对于使用minimax算法的场景,`system_message`和`role_meta`属性可能需要被设置。这些属性对于控制算法的行为和输出有重要作用,因此在使用时应当仔细阅读相关文档,确保正确使用。
|
|||
|
|
- 由于ApiChatParams类继承自ApiModelParams类,因此在配置聊天请求参数时,也可以设置与模型行为相关的参数,如`temperature`、`max_tokens`等,以调整模型生成文本的特性。开发者应根据模型的特点和需求,合理配置这些参数,以获得最佳的聊天体验。
|
|||
|
|
## ClassDef ApiCompletionParams
|
|||
|
|
**ApiCompletionParams**: ApiCompletionParams类的功能是定义完成请求的参数。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `prompt`: 字符串,用于定义模型生成文本的输入提示。
|
|||
|
|
|
|||
|
|
**代码描述**: ApiCompletionParams类继承自ApiModelParams类,专门用于配置完成请求的参数。该类通过添加`prompt`属性,允许开发者指定模型生成文本时的输入提示。这是与模型交互时非常关键的参数,因为它直接影响到模型的输出内容和质量。继承自ApiModelParams类意味着ApiCompletionParams不仅包含了`prompt`属性,还继承了ApiModelParams类中定义的所有模型相关的配置参数,如模型版本、温度参数、最大令牌数等。这样的设计使得ApiCompletionParams类在配置完成请求时既具有高度的灵活性,也保持了与其他模型请求参数类似的配置能力。
|
|||
|
|
|
|||
|
|
通过继承ApiModelParams类,ApiCompletionParams类能够利用已有的模型配置参数,如`temperature`、`max_tokens`和`top_p`等,这些参数对于控制模型生成文本的行为至关重要。此外,ApiCompletionParams类的设计也考虑到了实际应用场景的需要,比如在聊天机器人或自动文本生成系统中,`prompt`参数是实现定制化输出的关键。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiCompletionParams类时,开发者应确保`prompt`参数被正确设置,因为它直接影响模型的输出结果。
|
|||
|
|
- 继承自ApiModelParams类意味着开发者还需要关注其他继承的参数,如`temperature`、`max_tokens`等,这些参数需要根据模型的特性和预期的输出效果进行适当调整。
|
|||
|
|
- 此类的使用应结合实际的模型部署环境和需求,合理配置所有相关参数,以达到最佳的性能和输出质量。
|
|||
|
|
## ClassDef ApiEmbeddingsParams
|
|||
|
|
**ApiEmbeddingsParams**: ApiEmbeddingsParams类的功能是定义用于嵌入式模型API请求的参数。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `texts`: 字符串列表,表示需要进行嵌入处理的文本。
|
|||
|
|
- `embed_model`: 可选字符串,默认为None,指定使用的嵌入模型。
|
|||
|
|
- `to_query`: 布尔值,默认为False,用于指示是否将文本作为查询进行最小化处理。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
ApiEmbeddingsParams类继承自ApiConfigParams类,专门用于配置和管理嵌入式模型API请求所需的参数。该类通过继承ApiConfigParams获得了基础的API配置能力,如API的基础URL、代理、访问密钥等,并在此基础上添加了特定于嵌入式模型请求的参数,如文本列表、嵌入模型标识以及是否作为查询处理的标志。这样的设计使得ApiEmbeddingsParams类能够灵活地应用于不同的嵌入式模型请求场景中。
|
|||
|
|
|
|||
|
|
通过设置`texts`属性,用户可以指定一系列需要进行向量化处理的文本。`embed_model`属性允许用户指定使用的嵌入模型,这对于系统支持多个嵌入模型的情况尤其有用。`to_query`属性则用于特定的场景,比如在使用最小化处理时,标识文本是否应作为查询处理,这影响了嵌入向量的生成方式。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiEmbeddingsParams进行API请求时,应确保`texts`属性被正确设置,因为这是进行文本嵌入处理的必要条件。
|
|||
|
|
- 根据使用的嵌入模型和具体的应用场景,`embed_model`和`to_query`属性的设置可能会影响请求的结果,因此在使用前应仔细考虑这些属性的设置。
|
|||
|
|
- 由于ApiEmbeddingsParams继承自ApiConfigParams,因此在使用前也应确保相关的API配置(如API基础URL、访问密钥等)已经正确设置。
|
|||
|
|
|
|||
|
|
ApiEmbeddingsParams类在项目中主要用于处理文本的向量化请求,通过与不同的模型工作器(如MiniMaxWorker、QianFanWorker等)配合使用,支持多种嵌入模型和API的灵活应用。通过正确配置和使用ApiEmbeddingsParams,开发者可以轻松地将文本数据转换为嵌入向量,进而用于各种文本分析和处理任务。
|
|||
|
|
## ClassDef ApiModelWorker
|
|||
|
|
**ApiModelWorker**: ApiModelWorker类是用于处理API模型工作流程的基础类。
|
|||
|
|
|
|||
|
|
**属性**:
|
|||
|
|
- `DEFAULT_EMBED_MODEL`: 默认的嵌入模型,若为None,则表示不支持嵌入功能。
|
|||
|
|
- `context_len`: 上下文长度,默认为2048。
|
|||
|
|
- `semaphore`: 用于限制工作并发数的信号量。
|
|||
|
|
- `version`: 模型版本,初始化时为None,可在子类中进行指定。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
ApiModelWorker类继承自BaseModelWorker,提供了一系列方法用于处理与API模型相关的工作流程。它允许用户通过构造函数传入模型名称、控制器地址、工作器地址、上下文长度、是否注册等参数,并在初始化过程中设置了一些默认参数值。此外,该类还引入了异步事件循环,以支持异步操作。
|
|||
|
|
|
|||
|
|
该类定义了几个关键方法,包括`count_token`用于计算令牌数量、`generate_stream_gate`和`generate_gate`用于生成响应流、以及`do_chat`、`do_embeddings`和`get_embeddings`等方法,这些方法在子类中需要被重写以实现具体的功能。例如,`do_chat`方法用于执行聊天功能,`do_embeddings`用于执行嵌入功能。
|
|||
|
|
|
|||
|
|
在项目中,ApiModelWorker类被多个子类继承,如AzureWorker、BaiChuanWorker、FangZhouWorker等,这些子类根据不同的API提供商实现了ApiModelWorker类的方法,以适应不同的API接口和需求。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用ApiModelWorker类及其子类时,需要注意异步编程模式,确保异步任务的正确管理和调度。
|
|||
|
|
- 子类需要根据具体的API提供商的接口文档,实现`do_chat`、`do_embeddings`等方法,以完成具体的业务逻辑。
|
|||
|
|
- `DEFAULT_EMBED_MODEL`属性在子类中可以被覆盖,以支持特定的嵌入模型。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
由于ApiModelWorker类主要作为基类,其具体的输出依赖于子类的实现。以下是一个模拟的`do_chat`方法的可能输出示例(假设在某个子类中实现):
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error_code": 0,
|
|||
|
|
"text": "这是由模型生成的回复文本。"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
此输出示例展示了一个成功的API调用结果,其中`error_code`为0表示成功,`text`字段包含了模型生成的回复文本。
|
|||
|
|
### FunctionDef __init__(self, model_names, controller_addr, worker_addr, context_len, no_register)
|
|||
|
|
**__init__**: 该函数用于初始化ApiModelWorker对象。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `model_names`: 一个字符串列表,包含要加载的模型名称。
|
|||
|
|
- `controller_addr`: 控制器地址,默认为None。
|
|||
|
|
- `worker_addr`: 工作器地址,默认为None。
|
|||
|
|
- `context_len`: 上下文长度,默认为2048。
|
|||
|
|
- `no_register`: 一个布尔值,指示是否注册,默认为False。
|
|||
|
|
- `**kwargs`: 接受额外的关键字参数,用于进一步自定义。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
此函数首先通过`kwargs`设置默认的`worker_id`、`model_path`和`limit_worker_concurrency`。`worker_id`默认为一个随机生成的8位十六进制字符串,`model_path`默认为空字符串,`limit_worker_concurrency`默认为5,限制并发工作器的数量。
|
|||
|
|
|
|||
|
|
接着,调用父类的`__init__`方法,传入`model_names`、`controller_addr`、`worker_addr`和`**kwargs`参数。
|
|||
|
|
|
|||
|
|
然后,导入`fastchat.serve.base_model_worker`模块,并从中获取`logger`对象用于日志记录。此外,还将`sys.stdout`和`sys.stderr`恢复为标准输出和错误输出,以解决被`fastchat`覆盖的问题。
|
|||
|
|
|
|||
|
|
创建一个新的事件循环,并将其设置为当前线程的事件循环,以支持异步操作。
|
|||
|
|
|
|||
|
|
初始化`context_len`属性和一个信号量`semaphore`,后者用于控制并发的数量,其最大值由`limit_worker_concurrency`决定。
|
|||
|
|
|
|||
|
|
`version`属性被初始化为None,预留以供后续使用。
|
|||
|
|
|
|||
|
|
最后,如果`no_register`为False且`controller_addr`不为空,则调用`init_heart_beat`方法,以初始化心跳机制,保持与控制器的通信。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用此函数时,确保传入的`model_names`列表中包含的模型名称是有效的,因为这些模型将被加载并用于后续操作。
|
|||
|
|
- `controller_addr`和`worker_addr`应为有效的地址字符串,如果提供,将用于网络通信。
|
|||
|
|
- `context_len`、`no_register`和`limit_worker_concurrency`等参数允许调整性能和行为,应根据具体需求进行配置。
|
|||
|
|
- 通过`**kwargs`传入的额外参数可以用于进一步自定义行为,但需注意这些参数的默认值可能已经被预设。
|
|||
|
|
***
|
|||
|
|
### FunctionDef count_token(self, params)
|
|||
|
|
**count_token**: 此函数的功能是计算并返回给定提示信息的字符数。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `params`: 一个字典,包含需要处理的提示信息。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`count_token`函数接收一个参数`params`,这是一个字典,其中应包含一个键`"prompt"`。该函数首先从`params`字典中提取`"prompt"`键对应的值,然后将这个值转换为字符串(确保即使输入的不是字符串类型也能正确处理),并计算其长度。最后,函数返回一个新的字典,包含两个键值对:`"count"`,它的值是`prompt`字符串的长度;和`"error_code"`,其值为0,表示操作成功完成,没有错误。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 确保传入的`params`字典中包含`"prompt"`键,否则代码将抛出`KeyError`。
|
|||
|
|
- 函数返回的`"error_code"`始终为0,表示没有错误。在实际应用中,可能需要根据实际情况调整错误处理逻辑。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
假设传入的`params`字典为`{"prompt": "Hello, world!"}`,则函数的返回值将是:
|
|||
|
|
```python
|
|||
|
|
{"count": 13, "error_code": 0}
|
|||
|
|
```
|
|||
|
|
这表示给定的提示信息`"Hello, world!"`包含13个字符,且操作成功完成。
|
|||
|
|
***
|
|||
|
|
### FunctionDef generate_stream_gate(self, params)
|
|||
|
|
**generate_stream_gate**: 此函数的功能是生成流式聊天门控。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `params`: 字典类型,包含聊天请求所需的参数。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`generate_stream_gate` 函数是 `ApiModelWorker` 类的一个方法,用于处理聊天请求并生成响应流。该函数首先将调用次数自增,然后尝试解析传入的 `params` 参数。根据 `params` 中的 `prompt` 值,判断该请求是否为聊天模式。如果是聊天模式,则通过 `prompt_to_messages` 方法将 `prompt` 字符串转换为消息列表,随后通过 `validate_messages` 方法对消息进行验证。如果不是聊天模式,则构造一个包含单条消息的列表,消息内容为提示用户继续写作的文本。
|
|||
|
|
|
|||
|
|
接下来,使用 `ApiChatParams` 类构造聊天请求参数 `p`,包括消息列表、温度参数(`temperature`)、顶部概率(`top_p`)、最大生成令牌数(`max_tokens`)以及模型版本。然后,调用 `do_chat` 方法执行聊天操作,并对每个响应使用 `_jsonify` 方法进行格式化,最后以生成器的形式返回格式化后的响应流。
|
|||
|
|
|
|||
|
|
如果在处理过程中发生异常,将捕获异常并返回包含错误信息的响应。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在调用此函数之前,确保传入的 `params` 参数字典中包含正确的 `prompt` 和其他可选聊天参数。
|
|||
|
|
- 此函数利用生成器返回响应流,允许实时处理和传输大量聊天数据,适用于需要流式处理的场景。
|
|||
|
|
- 异常处理机制确保了即使在发生错误的情况下,也能返回错误信息,避免程序崩溃。
|
|||
|
|
- 该函数的实现依赖于 `ApiChatParams` 类和 `do_chat` 方法,确保这些依赖项已正确实现并可用。
|
|||
|
|
***
|
|||
|
|
### FunctionDef generate_gate(self, params)
|
|||
|
|
**generate_gate**: 此函数的功能是处理聊天请求并返回处理结果。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `params`: 字典类型,包含处理聊天请求所需的参数。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`generate_gate` 函数是 `ApiModelWorker` 类的一个方法,主要负责处理聊天请求并返回处理结果。该函数首先通过调用 `generate_stream_gate` 方法生成流式聊天门控,该方法返回一个生成器,用于逐步产生聊天响应流。在 `generate_gate` 函数中,通过遍历 `generate_stream_gate` 方法返回的生成器,可以逐个处理聊天响应。最终,函数尝试将最后一个聊天响应的字节流(去除最后一个字节后)解码并加载为JSON格式的数据,然后返回该数据作为聊天处理的结果。
|
|||
|
|
|
|||
|
|
如果在处理过程中遇到任何异常,`generate_gate` 函数会捕获这些异常,并返回一个包含错误代码(500)和错误信息的字典,以便调用者可以了解到处理过程中发生的错误。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在调用 `generate_gate` 函数之前,确保传入的 `params` 参数字典已经正确设置,包括但不限于聊天模式的提示信息(`prompt`)等。
|
|||
|
|
- 该函数利用了异常处理机制来确保即使在处理过程中遇到错误,也能够给调用者返回一个明确的错误信息,避免程序崩溃。
|
|||
|
|
- `generate_gate` 函数的实现依赖于 `generate_stream_gate` 方法,后者负责生成流式聊天门控并处理聊天请求,因此确保 `generate_stream_gate` 方法已经正确实现并可用是非常重要的。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
假设聊天处理成功,返回的示例可能如下:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"response": "这是聊天的回复内容。"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
如果处理过程中发生异常,返回的示例可能如下:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error_code": 500,
|
|||
|
|
"text": "处理聊天请求时发生错误:错误详情。"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
***
|
|||
|
|
### FunctionDef do_chat(self, params)
|
|||
|
|
**do_chat**: 此函数的功能是执行聊天操作。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `params`: 类型为`ApiChatParams`,用于定义聊天请求的参数。
|
|||
|
|
|
|||
|
|
**代码描述**: `do_chat`函数是`ApiModelWorker`类的一个方法,旨在执行聊天功能。该方法接收一个`ApiChatParams`类型的参数`params`,该参数包含了执行聊天所需的所有信息,如消息列表、系统消息以及角色元数据等。函数的默认实现返回一个字典,包含`error_code`和`text`两个键。`error_code`为500,表示服务端错误;`text`键对应的值为一个字符串,提示当前模型的第一个名称未实现聊天功能。这表明`do_chat`方法需要在子类中被重写以实现具体的聊天逻辑。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- `do_chat`方法的默认实现仅为一个占位符,提示开发者需要在继承`ApiModelWorker`类的子类中实现具体的聊天逻辑。
|
|||
|
|
- 在调用`do_chat`方法时,必须确保传入的`params`参数是`ApiChatParams`类型的实例,且已正确填充了所有必要的聊天请求信息。
|
|||
|
|
- 返回的字典中的`error_code`为500时,表示聊天功能未实现或执行中出现了错误,开发者应检查是否在子类中正确重写了`do_chat`方法。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
```python
|
|||
|
|
{
|
|||
|
|
"error_code": 500,
|
|||
|
|
"text": "模型名称未实现chat功能"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
此输出示例展示了当聊天功能未被实现时,`do_chat`方法的默认返回值。其中`模型名称`会根据实际调用时`self.model_names[0]`的值动态替换。
|
|||
|
|
***
|
|||
|
|
### FunctionDef do_embeddings(self, params)
|
|||
|
|
**do_embeddings**: 此函数的功能是执行文本嵌入处理。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `params`: ApiEmbeddingsParams类型,定义了嵌入式模型API请求的参数。
|
|||
|
|
|
|||
|
|
**代码描述**: `do_embeddings`函数是`ApiModelWorker`类的一个方法,旨在执行文本的嵌入处理。默认情况下,此函数使用模块内的`embed_documents`函数(尽管在此代码段中未直接展示该调用)。函数接受一个`ApiEmbeddingsParams`类型的参数`params`,该参数包含了执行嵌入处理所需的所有信息,如需要处理的文本列表、指定的嵌入模型以及是否将文本作为查询进行最小化处理等。
|
|||
|
|
|
|||
|
|
在当前的实现中,如果模型未实现嵌入功能,函数将返回一个包含错误代码和消息的字典。这个消息包含了模型名称(通过`self.model_names[0]`获取),指示该模型未实现嵌入功能。这是一种错误处理机制,确保当模型未实现嵌入功能时,用户能够接收到明确的反馈。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在调用`do_embeddings`函数之前,确保传入的`params`参数已经正确初始化,包括必要的文本列表等信息。
|
|||
|
|
- 此函数的实现依赖于模型是否支持嵌入功能。如果模型未实现此功能,将返回错误代码和相应的提示信息。
|
|||
|
|
- 由于`do_embeddings`函数返回的是一个字典,调用者应当准备好处理这个字典,特别是错误处理部分。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
如果模型未实现嵌入功能,函数可能返回如下的字典:
|
|||
|
|
```python
|
|||
|
|
{
|
|||
|
|
"code": 500,
|
|||
|
|
"msg": "模型名称未实现embeddings功能"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
其中`模型名称`将根据实际使用的模型名称进行替换。这个返回值提供了错误代码和相应的错误消息,帮助开发者理解问题所在。
|
|||
|
|
***
|
|||
|
|
### FunctionDef get_embeddings(self, params)
|
|||
|
|
**get_embeddings**: 此函数的功能是获取嵌入表示。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- **params**: 此参数用于传递获取嵌入表示所需的参数。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`get_embeddings`函数是`ApiModelWorker`类的一个方法,用于获取文本或数据的嵌入表示。在函数实现中,首先打印了字符串"get_embedding",随后打印了传入的`params`参数,这些参数预计包含了获取嵌入表示所需的具体信息。根据代码注释,可以了解到该函数设计是为了与fastchat和LLM(大型语言模型)配合使用,但似乎存在限制,只能使用openai提供的接口。注释还提到,如果尝试通过前端直接使用OpenAIEmbeddings发起请求,会直接出错,这表明在实际使用中需要注意请求的发起方式和参数配置。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 该函数目前只包含打印操作,实际的嵌入表示获取逻辑尚未实现。开发者在使用时需要根据实际需求完成嵌入表示的获取逻辑。
|
|||
|
|
- 注释中提到的限制和错误提示,暗示在实际部署和使用该函数时,需要特别注意与OpenAI接口的兼容性问题,以及请求的正确发起方式。
|
|||
|
|
- 由于代码中存在中文注释,建议在实际项目中使用英文进行注释,以保证代码的国际化和更广泛的可读性。
|
|||
|
|
***
|
|||
|
|
### FunctionDef make_conv_template(self, conv_template, model_path)
|
|||
|
|
**make_conv_template**: 此函数的功能是创建一个对话模板。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- **conv_template**: 字符串类型,指定对话模板的内容。默认值为None。
|
|||
|
|
- **model_path**: 字符串类型,指定模型路径。默认值为None。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`make_conv_template`函数是`ApiModelWorker`类的一个方法,旨在创建一个对话模板。此函数接受两个参数:`conv_template`和`model_path`。`conv_template`参数用于指定对话模板的具体内容,而`model_path`参数用于指定模型的存储路径。这两个参数都是可选的,如果调用时未提供,它们的默认值将分别为None。
|
|||
|
|
|
|||
|
|
函数体内部仅包含一行代码,即`raise NotImplementedError`。这表明`make_conv_template`函数是一个抽象方法,需要在`ApiModelWorker`类的子类中被具体实现。换句话说,当前的函数定义仅提供了一个接口框架,而没有实现具体的功能逻辑。在实际使用中,开发者需要根据具体需求,在继承了`ApiModelWorker`类的子类中重写`make_conv_template`方法,以实现创建对话模板的具体逻辑。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 由于`make_conv_template`函数是一个抽象方法,直接调用它将会引发`NotImplementedError`异常。因此,在使用此函数之前,确保你正在操作的是一个正确实现了该方法的`ApiModelWorker`子类实例。
|
|||
|
|
- 在设计子类时,重写`make_conv_template`方法时应确保正确处理`conv_template`和`model_path`两个参数,以满足创建对话模板的需求。
|
|||
|
|
- 考虑到`make_conv_template`方法的抽象性,开发者在实现时应充分考虑对话模板的格式和模型路径的有效性,确保方法的实现能够在实际应用中正确工作。
|
|||
|
|
***
|
|||
|
|
### FunctionDef validate_messages(self, messages)
|
|||
|
|
**validate_messages**: 此函数的功能是验证并可能修改传入的消息列表。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- messages: 一个字典列表,每个字典代表一条消息。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`validate_messages` 函数接收一个消息列表作为参数,这个列表是由字典组成的,每个字典代表一条消息。这个函数的主要目的是允许对传入的消息进行验证或者格式上的调整。在默认的实现中,这个函数直接返回传入的消息列表,没有进行任何修改。但是,开发者可以根据需要重写这个函数,以实现特定的消息验证或格式调整逻辑。
|
|||
|
|
|
|||
|
|
在项目中,`validate_messages` 函数被`generate_stream_gate`方法调用。在`generate_stream_gate`方法中,根据输入参数`params`中的`prompt`值,决定是直接使用`prompt_to_messages`方法生成的消息列表,还是构造一个特定格式的消息列表。之后,无论是哪种情况,都会调用`validate_messages`函数来对这些消息进行进一步的验证或调整。这样的设计使得消息的生成和验证两个步骤分离,提高了代码的可维护性和可扩展性。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 开发者可以根据API的特殊需求,重写`validate_messages`函数来替换默认的消息验证逻辑。
|
|||
|
|
- 由于`validate_messages`函数的默认实现是直接返回传入的消息列表,如果不需要对消息进行特殊处理,可以不重写这个函数。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
假设传入的消息列表为:
|
|||
|
|
```python
|
|||
|
|
[{"role": "user", "content": "Hello, how are you?"}]
|
|||
|
|
```
|
|||
|
|
在默认实现下,`validate_messages`函数将直接返回这个列表。如果开发者重写了这个函数,输出则取决于重写后的逻辑。
|
|||
|
|
***
|
|||
|
|
### FunctionDef user_role(self)
|
|||
|
|
**user_role**: 此函数的功能是获取当前用户的角色。
|
|||
|
|
|
|||
|
|
**参数**: 此函数没有参数。
|
|||
|
|
|
|||
|
|
**代码描述**: `user_role` 函数是 `ApiModelWorker` 类的一个方法,它返回当前会话 (`conv`) 中用户角色列表的第一个元素。在这个项目中,每个会话对象 (`conv`) 都有一个 `roles` 属性,该属性是一个列表,包含了会话中所有角色的标识。由于这个函数返回列表的第一个元素,我们可以推断在这个上下文中,第一个角色被视为“用户角色”。这个方法在多个地方被调用,主要用于确定消息的发送者角色,以及在生成流式门控(stream gate)和处理聊天消息时,区分用户和AI或其他角色的消息。
|
|||
|
|
|
|||
|
|
在 `generate_stream_gate` 方法中,`user_role` 被用来构造一个消息,当不支持历史消息时,提示用户继续写作。这表明,`user_role` 在决定消息来源方面起着关键作用。
|
|||
|
|
|
|||
|
|
在 `_is_chat` 方法中,通过检查提示信息 (`prompt`) 中是否包含由 `user_role` 定义的角色标识,来判断该提示信息是否由聊天消息拼接而成。这说明 `user_role` 在解析聊天对话时非常重要。
|
|||
|
|
|
|||
|
|
在 `prompt_to_messages` 方法中,`user_role` 用于将提示信息拆分成多个消息,每个消息都标记了发送者的角色。这进一步强调了用户角色在消息处理流程中的重要性。
|
|||
|
|
|
|||
|
|
在 `validate_messages` 方法中,虽然直接调用的是 `MiniMaxWorker` 类的实例,但该方法通过将消息中的角色映射到特定的发送者类型,间接体现了 `user_role` 在确保消息有效性中的作用。
|
|||
|
|
|
|||
|
|
**注意**: 在使用此函数时,需要确保 `conv.roles` 列表已经正确初始化,并且至少包含一个元素,否则会引发索引错误。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设当前用户角色标识为 "USER",则调用 `user_role` 函数将返回 `"USER"`。
|
|||
|
|
***
|
|||
|
|
### FunctionDef ai_role(self)
|
|||
|
|
**ai_role**: 此函数的功能是获取AI角色名称。
|
|||
|
|
|
|||
|
|
**参数**: 此函数没有参数。
|
|||
|
|
|
|||
|
|
**代码描述**: `ai_role`函数是`ApiModelWorker`类的一个方法,它的主要作用是从`conv.roles`列表中返回第二个元素,即AI的角色名称。在这个项目中,`conv.roles`被假设为一个包含用户角色和AI角色名称的列表,其中第一个元素是用户角色,第二个元素是AI角色。因此,通过`self.conv.roles[1]`可以获取到AI的角色名称。
|
|||
|
|
|
|||
|
|
在项目中,`ai_role`函数被`prompt_to_messages`和`validate_messages`两个方法调用。在`prompt_to_messages`方法中,它用于解析用户输入的提示(prompt),将其拆分成多个消息,并根据消息的开始部分判断是用户角色还是AI角色发出的消息,从而构造出一个包含角色和内容的字典列表。在`validate_messages`方法中,`ai_role`用于构建一个角色映射字典,该字典将消息中的角色名称映射到相应的发送者类型,以便进一步处理消息。
|
|||
|
|
|
|||
|
|
**注意**: 在使用`ai_role`函数时,需要确保`conv.roles`列表已经正确初始化,并且包含至少两个元素,否则会引发索引错误。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设`conv.roles`列表为`["USER", "assistant"]`,则调用`ai_role`函数将返回`"assistant"`。
|
|||
|
|
***
|
|||
|
|
### FunctionDef _jsonify(self, data)
|
|||
|
|
**_jsonify**: 该函数的功能是将数据字典转换为JSON格式字符串,并在末尾添加空字符。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `data`: 需要被转换成JSON格式的字典(Dict)。
|
|||
|
|
|
|||
|
|
**代码描述**:
|
|||
|
|
`_jsonify`函数接受一个字典类型的参数`data`,使用`json.dumps`方法将这个字典转换为JSON格式的字符串。在转换过程中,`ensure_ascii=False`参数确保了非ASCII字符可以正确地被转换和表示,而不是被转义。转换完成后,通过`.encode()`方法将字符串转换为字节串,并在其末尾添加一个空字符(`\0`),以满足特定的通信协议或数据格式要求。
|
|||
|
|
|
|||
|
|
在项目中,`_jsonify`函数被`generate_stream_gate`方法调用,用于处理和格式化`do_chat`方法产生的响应数据,以及异常情况下的错误信息。这样的设计使得数据在内部处理后可以直接用于网络传输或存储,同时保持了数据格式的一致性和可读性。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 确保传入的`data`参数是字典类型,因为`json.dumps`方法只能处理字典或类似字典的对象。
|
|||
|
|
- 考虑到输出是字节串,调用此函数的上下文应该能够处理或适配字节串类型的数据。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
如果传入`data`为`{"key": "value"}`,则函数的输出可能为:`'{"key": "value"}\0'`的字节串形式。
|
|||
|
|
***
|
|||
|
|
### FunctionDef _is_chat(self, prompt)
|
|||
|
|
**_is_chat**: 此函数的功能是检查传入的提示信息是否由聊天消息拼接而成。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- prompt: 一个字符串,代表需要检查的提示信息。
|
|||
|
|
|
|||
|
|
**代码描述**: `_is_chat` 函数通过检查传入的提示信息(`prompt`)中是否包含特定的关键字来判断该信息是否由聊天消息构成。这个关键字是由会话分隔符(`self.conv.sep`)和当前用户角色标识(`self.user_role`)拼接而成,形式为`"{分隔符}{用户角色标识}:"`。如果这个关键字存在于提示信息中,则认为该提示信息是由聊天消息拼接而成的,函数返回`True`;否则返回`False`。这个方法在处理聊天对话时非常重要,它帮助系统区分用户直接输入的提示信息和由系统生成的、基于之前聊天历史的提示信息。
|
|||
|
|
|
|||
|
|
**注意**: 使用此函数时,需要确保会话分隔符(`self.conv.sep`)和用户角色标识(`self.user_role`)已经正确初始化。此外,由于此方法基于特定格式的关键字来判断信息是否由聊天消息构成,如果提示信息的格式有所变化(例如,分隔符或角色标识的变化),这可能会影响判断的准确性。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设会话分隔符为`"||"`,当前用户角色标识为`"USER"`,如果传入的提示信息为`"||USER:你好||AI:你好呀"`,则函数返回`True`。如果传入的提示信息为`"请继续写作"`,则函数返回`False`。
|
|||
|
|
***
|
|||
|
|
### FunctionDef prompt_to_messages(self, prompt)
|
|||
|
|
**prompt_to_messages**: 此函数的功能是将prompt字符串拆分成多个消息字典。
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- prompt: 需要被拆分的字符串,类型为str。
|
|||
|
|
|
|||
|
|
**代码描述**: `prompt_to_messages` 方法用于解析由用户和AI角色交互构成的对话字符串,将其拆分为包含角色和内容的消息字典列表。该方法首先通过`self.user_role`和`self.ai_role`获取用户和AI的角色名称,然后根据这些角色名称识别并解析prompt字符串中的每条消息。对话字符串被假定为使用特定分隔符(`self.conv.sep`)分隔的消息序列,其中每条消息以角色名称开头,后跟消息内容。方法遍历这些消息,根据消息的开头确定是用户还是AI发送的消息,并将消息内容去除角色标识和前后空格后,存储在结果列表中。如果遇到既不属于用户也不属于AI的角色标识,方法将抛出运行时错误。
|
|||
|
|
|
|||
|
|
**注意**:
|
|||
|
|
- 在使用此函数之前,需要确保`self.conv.roles`已经被正确初始化,并且包含了至少两个元素(用户角色和AI角色)。
|
|||
|
|
- 此方法假定prompt字符串的格式正确,并且每条消息都遵循“角色: 消息内容”的格式。
|
|||
|
|
- 如果prompt字符串中包含未知的角色标识,此方法将抛出运行时错误。
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
假设`prompt`字符串为`"USER: 你好吗?AI: 我很好,谢谢。"`,`self.conv.sep`为默认的分隔符,`self.user_role`返回`"USER"`,`self.ai_role`返回`"AI"`,则调用`prompt_to_messages(prompt)`将返回如下列表:
|
|||
|
|
```python
|
|||
|
|
[
|
|||
|
|
{"role": "USER", "content": "你好吗?"},
|
|||
|
|
{"role": "AI", "content": "我很好,谢谢。"}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
***
|
|||
|
|
### FunctionDef can_embedding(cls)
|
|||
|
|
**can_embedding**: 此函数用于判断是否可以进行嵌入模型操作。
|
|||
|
|
|
|||
|
|
**参数**: 此函数不接受任何外部参数。
|
|||
|
|
|
|||
|
|
**函数描述**: `can_embedding` 是一个类方法,用于判断当前类是否可以进行嵌入模型操作。它通过检查类属性 `DEFAULT_EMBED_MODEL` 是否为 `None` 来实现这一功能。如果 `DEFAULT_EMBED_MODEL` 不为 `None`,则表示该类有默认的嵌入模型可以使用,函数返回 `True`;反之,如果为 `None`,则表示没有可用的嵌入模型,函数返回 `False`。这个方法主要用于在进行模型嵌入操作前,检查是否满足进行嵌入的基本条件。
|
|||
|
|
|
|||
|
|
**注意**: 使用此函数前,确保类属性 `DEFAULT_EMBED_MODEL` 已经被正确地设置。如果类设计中没有提供默认嵌入模型的路径或者模型对象,那么这个方法将始终返回 `False`,意味着不能进行嵌入操作。
|
|||
|
|
|
|||
|
|
**输出示例**: 假设某个类的 `DEFAULT_EMBED_MODEL` 被设置为了一个有效的模型路径或对象,那么调用 `can_embedding()` 方法将返回 `True`。如果 `DEFAULT_EMBED_MODEL` 为 `None` 或未被设置,那么调用此方法将返回 `False`。
|
|||
|
|
***
|