from openai import OpenAI import os # 初始化OpenAI客户端 client = OpenAI( api_key="sk-01d13a39e09844038322108ecdbd1bbc", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) reasoning_content = "" # 定义完整思考过程 answer_content = "" # 定义完整回复 is_answering = False # 判断是否结束思考过程并开始回复 # 【步骤2】如果有三角形存在,则找出最大的三角形和最大三角形中最长的边,这条最长边的左端点做为原点,此点坐标为(0,0),最长边的右端点需要放在X轴上。 prompt = """ 我将提供一个初中几何题的图片信息,用来生成Geogebra的指令集,要求生成步骤如下: 【步骤1】列举图中有哪些元素? 【步骤2】列举这些元素之间的位置关系,最终的输出要严格遵守元素间的位置关系。比如C在A、B两点之间,并且C并不在A正上方,而是右上方。C并不在B的正上方,而是左上方。 【步骤3】对于原图,从左到右,从下至上,查找到的第一个点作为原点,建立平面直角坐标系,则此点坐标为(0,0) 【步骤4】如果存在AB边,优先考虑以AB所在直线做为X轴 【步骤5】模拟绘制过程,从原点开始,从左向右,从下向上,在已经模拟绘制出来的元素支持下,是否可以绘制出当前元素,如果不满足,则延后绘制,最后一定要保证所有元素全部绘制完毕。 【步骤6】安排动点先放到出发点位置 【步骤7】使用下面的规则生成Geogebra的指令集 **几何图形生成规则(通用强制约束版)** 请严格按以下优先级执行,不受题目具体内容影响: 1. **几何约束最高优先级** - 当文字描述与坐标/位置冲突时,以文字描述的几何关系为准 - 必须自动验证:{长度|角度|中点|平行|垂直}关系 - 验证失败时:重新计算坐标并报告修正 - 有动点的,要设置滑块 2. **动态坐标系构建** ```mermaid graph TB A[定位原点] --> B{原点坐标明确?} B -->|是| C[直接采用] B -->|否| D[根据相对关系推算] E[建立坐标系] --> F{存在水平/垂直要求?} F -->|是| G[调整坐标满足] F -->|否| H[保持默认方向] ``` 3、错误熔断机制 检测到矛盾 → 触发修正流程: if not satisfy_constraint(description): new_coords = recalculate_by_geometry() log_adjustment(old_coords, new_coords, reason) 4、元素生成协议 顺序:固定点 → 固定线 → 动态点(初始位) → 动态元素 依赖检查:确保父元素先于子元素生成 5、输出结构(强制) [修正报告] (若有调整) [坐标摘要] (最终使用坐标) [Geogebra指令] (完整可执行代码) 注意: 1、GGB指令集中不要添加注释! 2、仔细检查原图中是线段还是直线,要严格进行识别! 3、仔细检查原图中的每一条边是否都正确进行了线段标识! """ # 创建聊天完成请求 completion = client.chat.completions.create( model="qvq-max", # 此处以 qvq-max 为例,可按需更换模型名称 messages=[ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://dsideal.obs.cn-north-1.myhuaweicloud.com/wb/math.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