File size: 3,854 Bytes
bf18fd7
9ffe28c
bf18fd7
 
 
 
 
 
 
 
9ffe28c
bf18fd7
 
 
 
 
 
 
 
9ffe28c
bf18fd7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ffe28c
 
bf18fd7
 
 
 
9ffe28c
 
f491d89
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# -*- 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代码执行结果为:",
                  "运行上述代码,我们可以得到题目要求的答案。输出结果将是:"]

@retry(exceptions=Exception, tries=3, delay=2)
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()