99 lines
3.6 KiB
Python
99 lines
3.6 KiB
Python
|
from openai import OpenAI
|
|||
|
|
|||
|
# 初始化OpenAI客户端
|
|||
|
client = OpenAI(
|
|||
|
api_key="sk-f6da0c787eff4b0389e4ad03a35a911f",
|
|||
|
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|||
|
)
|
|||
|
|
|||
|
reasoning_content = "" # 定义完整思考过程
|
|||
|
answer_content = "" # 定义完整回复
|
|||
|
is_answering = False # 判断是否结束思考过程并开始回复
|
|||
|
|
|||
|
prompt = """
|
|||
|
你是“初中几何题-图像结构提取器”,专为初中生设计。任务只有一项:
|
|||
|
看到几何题图片后,用中文输出“完整的题干原文 + 图形客观结构描述”,绝口不提解题思路或答案。
|
|||
|
目标:
|
|||
|
让后续 GeoGebra 生成器仅凭你的输出即可复刻原图,同时让初中生一眼看懂图形。
|
|||
|
输出格式(固定四段)
|
|||
|
题干原文(OCR 结果,逐字照录)
|
|||
|
基本元素表(点、线、圆、角、标注长度/角度,按出现顺序编号)
|
|||
|
关系表(平行、垂直、相切、全等、相似、共线、共点等)
|
|||
|
给出各元素大概位置或坐标
|
|||
|
写作规范:
|
|||
|
一律用中文,术语用课本标准词。
|
|||
|
描述顺序:先整体外形(如“梯形 ABCD”),再局部细节(如“AB∥CD”)。
|
|||
|
长度、角度直接写数值并带单位;若图中仅给符号,则照抄符号。
|
|||
|
位置关系用“//、⊥、≅、∼、∈”等符号,后接括号说明。
|
|||
|
注意几何图形的形状和线段的长度
|
|||
|
不使用“可能、大约”等模糊词。
|
|||
|
不解释题意,不提示解法。
|
|||
|
示例模板:
|
|||
|
【题干原文】
|
|||
|
如图,梯形 ABCD 中,AB∥CD …(以下略)
|
|||
|
【基本元素表】
|
|||
|
点:A、B、C、D、E(对角线交点)
|
|||
|
线段:AB=6 cm,CD=10 cm,AD=4 cm,BC=4 cm,AC,BD
|
|||
|
角:∠DAB=60°,∠ABC=120°
|
|||
|
圆:无
|
|||
|
【关系表】
|
|||
|
AB // CD
|
|||
|
AD = BC
|
|||
|
AC 与 BD 交于 E
|
|||
|
∠DAB 与 ∠ABC 互补
|
|||
|
【元素位置】
|
|||
|
A点在左上,B点在右上,C点在A点和B点的下方
|
|||
|
——请严格按以上格式输出,不要省略任何字段。
|
|||
|
"""
|
|||
|
|
|||
|
# 创建聊天完成请求
|
|||
|
completion = client.chat.completions.create(
|
|||
|
model="qvq-max-latest", # 此处以 qvq-max 为例,可按需更换模型名称
|
|||
|
messages=[
|
|||
|
{
|
|||
|
"role": "user",
|
|||
|
"content": [
|
|||
|
{
|
|||
|
"type": "image_url",
|
|||
|
"image_url": {
|
|||
|
"url": "https://dsideal.obs.cn-north-1.myhuaweicloud.com/wb/img10.jpg"
|
|||
|
},
|
|||
|
},
|
|||
|
{"type": "text",
|
|||
|
"text": prompt},
|
|||
|
],
|
|||
|
},
|
|||
|
],
|
|||
|
stream=True,
|
|||
|
)
|
|||
|
|
|||
|
print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")
|
|||
|
|
|||
|
for chunk in completion:
|
|||
|
# 如果chunk.choices为空,则打印usage
|
|||
|
if not chunk.choices:
|
|||
|
print("\nUsage:")
|
|||
|
print(chunk.usage)
|
|||
|
else:
|
|||
|
delta = chunk.choices[0].delta
|
|||
|
# 打印思考过程
|
|||
|
if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
|
|||
|
print(delta.reasoning_content, end='', flush=True)
|
|||
|
reasoning_content += delta.reasoning_content
|
|||
|
else:
|
|||
|
# 开始回复
|
|||
|
if delta.content != "" and is_answering is False:
|
|||
|
print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
|
|||
|
is_answering = True
|
|||
|
# 打印回复过程
|
|||
|
print(delta.content, end='', flush=True)
|
|||
|
answer_content += delta.content
|
|||
|
|
|||
|
# print("=" * 20 + "完整思考过程" + "=" * 20 + "\n")
|
|||
|
# print(reasoning_content)
|
|||
|
# print("=" * 20 + "完整回复" + "=" * 20 + "\n")
|
|||
|
# 保存成QvqResult.txt
|
|||
|
with open("QvqResult.txt", "w", encoding='utf-8') as f:
|
|||
|
f.write(answer_content)
|
|||
|
print("试题解析文本保存成功!")
|