Spaces:
Sleeping
Sleeping
| import base64 | |
| import numpy as np | |
| import random | |
| import logging | |
| import os | |
| import json | |
| import openai | |
| from openai import OpenAIError | |
| from time import sleep | |
| def _throttled_openai_chat_completion_create( | |
| client, | |
| model: str, | |
| messages, | |
| temperature: float, | |
| max_tokens: int, | |
| top_p: float, | |
| json_format: bool = False, | |
| n: int = 1, | |
| ): | |
| """同步的OpenAI聊天补全函数,支持限流与重试""" | |
| for _ in range(10): # 进行10次尝试 | |
| try: | |
| if json_format: | |
| return client.chat.completions.create( | |
| model=model, | |
| messages=messages, | |
| temperature=temperature, | |
| max_tokens=max_tokens, | |
| top_p=top_p, | |
| n=n, | |
| response_format={"type": "json_object"}, | |
| ) | |
| else: | |
| return client.chat.completions.create( | |
| model=model, | |
| messages=messages, | |
| temperature=temperature, | |
| max_tokens=max_tokens, | |
| top_p=top_p, | |
| n=n, | |
| ) | |
| except openai.RateLimitError as e: | |
| print("Rate limit exceeded, retrying...") | |
| sleep(random.randint(10, 20)) # 增加重试等待时间 | |
| except openai.BadRequestError as e: | |
| print(e) | |
| return None | |
| except OpenAIError as e: | |
| print(e) | |
| sleep(random.randint(5, 10)) | |
| return None | |
| def generate_from_openai_chat_completion( | |
| client, | |
| messages, | |
| engine_name: str, | |
| temperature: float = 1.0, | |
| max_tokens: int = 512, | |
| top_p: float = 1.0, | |
| requests_per_minute: int = 100, | |
| json_format: bool = False, | |
| n: int = 1, | |
| ): | |
| """同步生成OpenAI聊天补全""" | |
| # delay = 60.0 / requests_per_minute | |
| # sleep(delay) # 简单的限流处理 | |
| responses = [ | |
| _throttled_openai_chat_completion_create( | |
| client, | |
| model=engine_name, | |
| messages=message, | |
| temperature=temperature, | |
| max_tokens=max_tokens, | |
| top_p=top_p, | |
| json_format=json_format, | |
| n=n, | |
| ) | |
| for message in messages | |
| ] | |
| empty_dict = { | |
| "question": "", | |
| "options": { | |
| "A": "", | |
| "B": "", | |
| "C": "", | |
| "D": "", | |
| }, | |
| "distractors": { | |
| "E": "", | |
| "F": "", | |
| "G": "", | |
| }, | |
| "correct_answer": "" | |
| } | |
| empty_str = "" | |
| outputs = [] | |
| for response in responses: | |
| if n == 1: | |
| if json_format: | |
| if response and response.choices[0] and response.choices[0].message and response.choices[0].message.content: | |
| outputs.append(json.loads(response.choices[0].message.content)) | |
| else: | |
| outputs.append(empty_dict) | |
| else: | |
| if response and response.choices[0] and response.choices[0].message and response.choices[0].message.content: | |
| outputs.append(response.choices[0].message.content) | |
| else: | |
| outputs.append(empty_str) | |
| else: | |
| if json_format: | |
| outputs.append([ | |
| json.loads(response.choices[i].message.content) if response and response.choices[i].message.content else empty_dict | |
| for i in range(n) | |
| ]) | |
| else: | |
| outputs.append([ | |
| response.choices[i].message.content if response and response.choices[i].message.content else empty_str | |
| for i in range(n) | |
| ]) | |
| return outputs | |