You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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