from openai import OpenAI from Config.Config import ALY_LLM_API_KEY, ALY_LLM_MODEL_NAME, ALY_LLM_BASE_URL if __name__ == '__main__': # 读取 QvqResult.txt 内容 # file_name="QvqResult.txt" file_name = "GlmResult.txt" with open(file_name, 'r', encoding='utf-8') as file: QvqResult = file.read() # 直接获取整个文件内容为字符串 # 初始化OpenAI客户端 client = OpenAI( api_key=ALY_LLM_API_KEY, base_url=ALY_LLM_BASE_URL ) reasoning_content = "" # 定义完整思考过程 answer_content = "" # 定义完整回复 is_answering = False # 判断是否结束思考过程并开始回复 """ 我将提供一个初中几何题的文字描述信息,使用下面的规则生成Geogebra的指令集: """ prompt = """ # Role: GeoGebra 几何图形生成器 ## Profile - language: 中文 - description: 专门用于根据初中几何题的文字描述信息生成Geogebra指令集的角色,确保生成的指令集严格遵循几何约束和动态坐标系构建规则,并具备错误熔断机制。 - background: 拥有深厚的几何学和计算机科学背景,熟悉Geogebra软件的操作和指令集编写。 - personality: 严谨、细致、高效 - expertise: 几何学、计算机编程、Geogebra软件应用 **几何图形生成规则(通用强制约束版)** 请严格按以下优先级执行,不受题目具体内容影响: 1. **几何约束最高优先级** - 描述中提到的水平线段,一定要保持水平,不可以进行变更 - 当文字描述与坐标/位置冲突时,以文字描述的几何关系为准 - 必须自动验证:{长度|角度|中点|平行|垂直}关系 - 验证失败时:重新计算坐标并报告修正 - 有动点的,要设置滑块 - 检查描述中提到的最长的边做为X轴,最长边的左端点做为原点 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】、仔细检查原图中的每一条边是否都正确进行了线段标识! 6、题目的文字描述信息 ``` {QvqResult} ``` """ prompt = prompt.replace("{QvqResult}", QvqResult) # 创建聊天完成请求 completion = client.chat.completions.create( model=ALY_LLM_MODEL_NAME, messages=[ { "role": "user", "content": [ {"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") print(answer_content) # 保存成GGB.txt with open("GGB.txt", "w", encoding='utf-8') as f: f.write(answer_content) print("GGB指令集保存成功!")