Skip to main content

oai.completion

完成

class Completion(openai_Completion)

(openai<1) 一个用于 OpenAI 完成 API 的类。

它还支持:ChatCompletion、Azure OpenAI API。

set_cache

@classmethod
def set_cache(cls,
seed: Optional[int] = 41,
cache_path_root: Optional[str] = ".cache")

设置缓存路径。

参数

  • seed int, 可选 - 伪随机种子的整数标识符。 不同种子对应的结果将被缓存在不同的位置。
  • cache_path str, 可选 - 缓存的根路径。 完整的缓存路径将是 {cache_path_root}/{seed}。

clear_cache

@classmethod
def clear_cache(cls,
seed: Optional[int] = None,
cache_path_root: Optional[str] = ".cache")

清除缓存。

参数

  • seed int, 可选 - 伪随机种子的整数标识符。 如果省略,将清除 cache_path_root 下的所有缓存。
  • cache_path str, 可选 - 缓存的根路径。 完整的缓存路径将是 {cache_path_root}/{seed}。

tune

@classmethod
def tune(cls,
data: List[Dict],
metric: str,
mode: str,
eval_func: Callable,
log_file_name: Optional[str] = None,
inference_budget: Optional[float] = None,
optimization_budget: Optional[float] = None,
num_samples: Optional[int] = 1,
logging_level: Optional[int] = logging.WARNING,
**config)

调整 OpenAI API 调用的参数。

TODO: 支持使用 ray 或 spark 进行并行调整。 TODO: 支持 agg_method,就像在测试中一样。

参数

  • data list - 数据点的列表。
  • metric str - 要优化的指标。
  • mode str - 优化模式,"min" 或 "max"。
  • eval_func Callable - 响应的评估函数。 该函数应该接受一个响应列表和一个数据点作为输入, 并返回一个指标的字典。例如,
def eval_func(responses, **data):
solution = data["solution"]
success_list = []
n = len(responses)
for i in range(n):
response = responses[i]
succeed = is_equiv_chain_of_thought(response, solution)
success_list.append(succeed)
return {
"expected_success": 1 - pow(1 - sum(success_list) / n, n),
"success": any(s for s in success_list),
}
  • log_file_name str, 可选 - 日志文件。
  • inference_budget float, 可选 - 推理预算,每个实例的美元数。
  • optimization_budget float, 可选 - 优化预算,总共的美元数。
  • num_samples int, 可选 - 要评估的样本数量。 -1 表示在试验次数上没有硬限制, 实际次数由优化预算决定。默认为 1。
  • logging_level optional - 日志级别。默认为 logging.WARNING。
  • **config dict - 要更新的搜索空间,覆盖默认搜索空间。 对于提示,请提供一个字符串/可调用对象或字符串/可调用对象的列表。
    • 如果为聊天模型提供了提示,则会将其转换为角色为“用户”的消息。
    • 不要同时为聊天模型提供提示和消息,但可以提供其中之一。
    • 使用字符串模板使用 prompt.format(**data) 为每个数据实例生成提示。
    • 使用可调用模板使用 prompt(data) 为每个数据实例生成提示。 对于停止条件,请提供一个字符串、字符串列表或字符串列表的列表。 对于消息(仅适用于聊天模型),请提供一个消息列表(对于单个聊天前缀)或一个消息列表的列表(对于多个选择的聊天前缀)。 每个消息应该是一个带有“role”和“content”键的字典。"content" 的值可以是字符串/可调用模板。

返回

  • dict - 优化的超参数设置。
  • tune.ExperimentAnalysis - 调优结果。

create

@classmethod
def create(cls,
context: Optional[Dict] = None,
use_cache: Optional[bool] = True,
config_list: Optional[List[Dict]] = None,
filter_func: Optional[Callable[[Dict, Dict], bool]] = None,
raise_on_ratelimit_or_timeout: Optional[bool] = True,
allow_format_str_template: Optional[bool] = False,
**config)

为给定的上下文创建一个完成。

参数

  • context Dict, Optional - 用于实例化提示的上下文。 它需要包含模板或过滤函数使用的键。 例如,prompt="Complete the following sentence: {prefix}, context={"prefix": "Today I feel"}。 实际的提示将是: "Complete the following sentence: Today I feel"。 更多示例可以在模板化中找到。
  • use_cache bool, Optional - 是否使用缓存的响应。
  • config_list List, Optional - 完成尝试的配置列表。 将使用第一个不引发错误的配置。 只需提供与默认配置不同的部分。 例如,
response = oai.Completion.create(
config_list=[
{
"model": "gpt-4",
"api_key": os.environ.get("AZURE_OPENAI_API_KEY"),
"api_type": "azure",
"base_url": os.environ.get("AZURE_OPENAI_API_BASE"),
"api_version": "2024-02-01",
},
{
"model": "gpt-3.5-turbo",
"api_key": os.environ.get("OPENAI_API_KEY"),
"api_type": "openai",
"base_url": "https://api.openai.com/v1",
},
{
"model": "llama-7B",
"base_url": "http://127.0.0.1:8080",
"api_type": "openai",
}
],
prompt="Hi",
)
  • filter_func Callable, 可选 - 一个接受上下文和响应作为参数的函数,返回一个布尔值来指示响应是否有效。例如,
def yes_or_no_filter(context, config, response):
return context.get("yes_or_no_choice", False) is False or any(
text in ["Yes.", "No."] for text in oai.Completion.extract_text(response)
)
  • raise_on_ratelimit_or_timeout bool, 可选 - 当所有配置都失败时,是否引发 RateLimitError 或 Timeout 错误。 当设置为 False 时,所有配置失败时将返回 -1。
  • allow_format_str_template bool, 可选 - 是否允许在配置中使用格式化字符串模板。
  • **config - 用于 openai API 调用的配置。这些参数用于调用 openai API。 "prompt" 或 "messages" 参数可以包含一个模板(str 或 Callable),该模板将与上下文实例化。 除了 openai API 调用的参数之外,它还可以包含:
    • max_retry_period (int): 重试失败请求的总时间(以秒为单位)。
    • retry_wait_time (int): 在重试失败请求之前等待的时间间隔(以秒为单位)。
    • cache_seed (int) 用于缓存。在完成时实现“可控随机性”时很有用。

返回

来自 OpenAI API 的响应,附带额外字段。

  • cost: 总成本。 当提供 config_list 时,响应将包含更多字段:
  • config_id: 在 config_list 中用于生成响应的配置的索引。
  • pass_filter: 响应是否通过了过滤函数。如果未提供过滤函数,则为 None。

测试

@classmethod
def test(cls,
data,
eval_func=None,
use_cache=True,
agg_method="avg",
return_responses_and_per_instance_result=False,
logging_level=logging.WARNING,
**config)

使用配置对 OpenAI API 调用的响应进行评估。

参数

  • data list - 测试数据点的列表。
  • eval_func Callable - 每个数据实例的响应的评估函数。 该函数应接受一个响应列表和一个数据点作为输入,并返回一个指标字典。您需要提供一个有效的可调用的 eval_func; 或者不提供 eval_func(设置为 None),但在调用 tune 函数之后调用 test 函数。 在后一种情况下,我们将使用通过 tune 函数提供的 eval_func。 默认为 None。
def eval_func(responses, **data):
solution = data["solution"]
success_list = []
n = len(responses)
for i in range(n):
response = responses[i]
succeed = is_equiv_chain_of_thought(response, solution)
success_list.append(succeed)
return {
"expected_success": 1 - pow(1 - sum(success_list) / n, n),
"success": any(s for s in success_list),
}
  • use_cache bool, 可选 - 是否使用缓存的响应。默认为 True。
  • agg_method str, Callable 或者 Callable 字典 - 每个指标的结果聚合方法(跨多个实例)。默认为 'avg'。 一个字符串类型的示例 agg_method:
agg_method = 'median'

一个 Callable 类型的示例 agg_method:

agg_method = np.median

一个 Callable 字典类型的示例 agg_method:

agg_method={'median_success': np.median, 'avg_success': np.mean}
  • return_responses_and_per_instance_result bool - 是否同时返回响应和每个实例的结果,以及聚合结果。
  • logging_level 可选 - 日志级别。默认为 logging.WARNING。
  • **config dict - 传递给 openai api 调用 create() 的参数。

返回值

如果 test 或 tune 中没有提供有效的 eval_func,则返回 None; 否则,返回聚合结果的字典,如果 return_responses_and_per_instance_result 为 True,则还返回响应和每个实例的结果; 否则,返回聚合结果的字典(不返回响应和每个实例的结果)。

cost

@classmethod
def cost(cls, response: dict)

计算 API 调用的成本。

参数

  • response dict - 来自 OpenAI API 的响应。

返回值

成本(以美元为单位)。如果不支持该模型,则返回 0。

extract_text

@classmethod
def extract_text(cls, response: dict) -> List[str]

从完成或聊天响应中提取文本。

参数

  • response dict - 来自 OpenAI API 的响应。

返回值

响应中的文本列表。

extract_text_or_function_call

@classmethod
def extract_text_or_function_call(cls, response: dict) -> List[str]

从完成或聊天响应中提取文本或函数调用。

参数

  • response dict - 来自 OpenAI API 的响应。

返回值

响应中的文本或函数调用列表。

logged_history

@classmethod
@property
def logged_history(cls) -> Dict

返回记录历史的字典。

@classmethod
def print_usage_summary(cls) -> Dict

返回使用情况摘要。

start_logging

@classmethod
def start_logging(cls,
history_dict: Optional[Dict] = None,
compact: Optional[bool] = True,
reset_counter: Optional[bool] = True)

开始记录历史。

参数

  • history_dict Dict - 用于记录历史的字典。 如果未提供,则会创建一个新的字典。
  • compact bool - 是否保持记录历史字典的紧凑形式。 紧凑的历史包含每个对话的一个键,值是一个字典,例如:
{
"create_at": [0, 1],
"cost": [0.1, 0.2],
}

其中 "created_at" 是 API 调用的索引,表示所有调用的顺序, "cost" 是每个 API 调用的费用。这个例子展示了对话基于两个 API 调用。紧凑格式对于压缩对话历史非常有用。如果 compact 参数为 False,历史记录字典将包含所有的 API 调用:键是 API 调用的索引,值是一个类似于以下结构的字典:

{
"request": request_dict,
"response": response_dict,
}

其中 request_dict 是发送给 OpenAI API 的请求,response_dict 是响应。对于包含两个 API 调用的对话,非紧凑的历史记录字典将会是这样的结构:

{
0: {
"request": request_dict_0,
"response": response_dict_0,
},
1: {
"request": request_dict_1,
"response": response_dict_1,
},

第一个请求的消息加上响应等于第二个请求的消息。对于包含多个轮次的对话,非紧凑的历史记录字典的大小是二次的,而紧凑的历史记录字典的大小是线性的。

  • reset_counter bool - 是否重置 API 调用次数的计数器。

stop_logging

@classmethod
def stop_logging(cls)

结束记录。

ChatCompletion

class ChatCompletion(Completion)

(openai<1) 用于 OpenAI API ChatCompletion 的类。与 Completion 具有相同的 API。