|
|
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
|
|
|
|