134 lines
4.8 KiB
Python
134 lines
4.8 KiB
Python
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指令集保存成功!")
|