Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
import gradio as gr | |
import os | |
import re | |
import json | |
import subprocess | |
from openai import OpenAI | |
from retry import retry | |
from random import choices | |
from datetime import datetime | |
os.environ["OPENAI_BASE_URL"] = "http://117.50.185.39:50080/v1" | |
os.environ["OPENAI_API_KEY"] = "0" | |
client = OpenAI() | |
execution_desc = ["运行以上代码,输出会是: ", | |
"现在将上面的代码复制到Python环境中运行,运行结果为:", | |
"执行上述Python代码,运行结果将是:", | |
"上面的Python代码执行结果为:", | |
"运行上述代码,我们可以得到题目要求的答案。输出结果将是:"] | |
def question_answer(query): | |
g = open("collect.json", "a", encoding="utf-8") | |
messages = [{"role": "system", "content": "你是一个数学解题大师,请解决以下数学题,务必详细说明解题思路,并在必要时提供Python代码来支持你的推理。答案中的数值应使用\\boxed{}包围,最后的答案以“因此”开头并直接给出结论,不要添加任何多余的内容。"}] | |
messages.append({"role": "user", "content": f"题目:{query}"}) | |
result = client.chat.completions.create(messages=messages, | |
model="gpt-3.5-turbo", | |
temperature=0.2, | |
stream=True) | |
reply_message = "" | |
for chunk in result: | |
if hasattr(chunk, "choices") and chunk.choices[0].delta.content: | |
reply_message += chunk.choices[0].delta.content | |
# find python code and execute the code | |
if '```python' in reply_message: | |
reply_message = '```'.join(reply_message.split('```')[:-1]).replace('```python', '\n```python') + '```' | |
messages.append({"role": "assistant", "content": reply_message}) | |
python_code_string = re.findall(r'```python\n(.*?)\n```', reply_message, re.S)[0] | |
python_file_path = 'temp.py' | |
with open(python_file_path, 'w') as f: | |
f.write(python_code_string) | |
python_code_run = subprocess.run(['python3', python_file_path], stdout=subprocess.PIPE, timeout=10) | |
if python_code_run.returncode: | |
print("生成的Python代码无法运行!") | |
raise RuntimeError("生成的Python代码无法运行!") | |
python_code_execution = python_code_run.stdout.decode('utf-8') | |
os.remove(python_file_path) | |
if "``````" in python_code_execution: | |
raise ValueError("执行Python代码结果为空!") | |
code_reply_str = choices(execution_desc, k=1)[0] | |
code_reply = f"\n{code_reply_str}```{python_code_execution.strip()}```\n" | |
reply_message += code_reply | |
# yield reply_message | |
messages.append({"role": "user", "content": code_reply}) | |
result = client.chat.completions.create(messages=messages, | |
model="gpt-3.5-turbo", | |
temperature=0.2, | |
stream=True) | |
for chunk in result: | |
if hasattr(chunk, "choices") and chunk.choices[0].delta.content: | |
reply_message += chunk.choices[0].delta.content | |
# yield reply_message | |
print(reply_message) | |
g.write(json.dumps({"query": query, | |
"answer": reply_message, | |
"time": datetime.now().strftime('%Y-%m-%d %H:%M:%S %f') | |
}, ensure_ascii=False)+"\n") | |
g.close() | |
return reply_message | |
demo = gr.Interface( | |
fn=question_answer, | |
inputs=gr.Textbox(lines=3, placeholder="题目", label="数学题目"), | |
outputs=gr.Markdown(), | |
) | |
demo.launch() |