MindMap/others_deletable/ai-content-analyzer/json_openai.py

156 lines
6.5 KiB
Python
Raw Normal View History

import re
import traceback
from openai import OpenAI
# "model": "glm-4.5",
# "base_url": "https://open.bigmodel.cn/api/paas/v4/",
# "api_key": "ce39bdd4fcf34ec0aec75072bc9ff988.hAp7HZTVUwy7vImn"
EXTRACT_OUNTLINE_SYSTEM_PROMPT = """
## 角色
你是一位专业的内容结构分析专家你的核心任务是精确解析用户提供的文章内容并将其转换为标准的Markdown格式
## 任务
根据用户提供的文章内容执行以下分析步骤
1. **提取主标题** 精确识别并提取文章最顶层的**主标题**通常为文章题目或书名
2. **构建标题大纲**
* 从文章中**第一个具体的内容标题**即忽略文章主标题之后出现的第一个具有层级意义的标题开始提取
* 提取所有层级的**内容标题**Level 1 Level 4Level 1 为最高级
* **精确保留**原文中的标题文字不得进行任何修改概括或润色
* 判断标题层级的依据
* **视觉与结构特征** 是否独立成行/位置如行首格式如加粗字体大小编号 `1.`, `1.1`, `(1)`, `-`
* **语义逻辑** 标题之间的包含并列关系
3. **分析每个标题对应的正文内容区块** 对于大纲中的每个标题项分析其**直接管辖**的正文内容区块即从该标题后开始直到下一个**同级或更高级别**标题出现之前的所有文本内容
* 保留原文的核心内容
* 可以适当概括和整理但保持原意
* 对于列表项使用Markdown列表格式
## 输出格式
* 结果**必须****纯无序列表格式**输出
* 使用标准的Markdown无序列表语法
* 所有内容都使用 `- 内容` 格式
* 不同层级通过缩进表示2个空格一个层级
* 第一层主标题/主题
* 第二层主要章节/分类
* 第三层子章节/子分类
* 第四层具体内容/要点
* 第五层详细说明/子要点
* 特殊内容处理
* 对于数字代码公式等特殊内容保持原格式
* 对于引用内容使用简洁的描述
* 对于表格数据转换为要点列表形式
* SSE流式输出优化
* 确保每个列表项都是完整的语义单元
* 避免在列表项中间断句
* 保持层级结构的逻辑性
* 错误处理指导
* 如果原文结构不清晰优先保证逻辑性
* 如果遇到无法分类的内容归类到最相关的上级节点
* 保持输出格式的一致性
* 示例格式
```markdown
- 人工智能的发展历程
- 早期发展
- 人工智能的概念最早可以追溯到1950年代
- 图灵测试的提出标志着AI研究的开始
- 图灵测试
- 图灵测试是判断机器是否具有智能的重要标准
- 通过对话测试来评估机器智能
- 现代发展
- 近年来深度学习技术的突破推动了AI的快速发展
- 深度学习
- 深度学习通过神经网络模拟人脑的工作方式
- 在图像识别自然语言处理等领域取得重大突破
- 主要技术
- 卷积神经网络CNN
- 循环神经网络RNN
- Transformer架构
- 技术文档示例
- 安装指南
- 系统要求
- Windows 10或更高版本
- 至少4GB内存
- 支持OpenGL 3.3的显卡
- 安装步骤
- 下载安装包
- 运行安装程序
- 配置环境变量
- 使用说明
- 基本操作
- 启动应用程序
- 创建新项目
- 保存文件
- 高级功能
- 自定义设置
- 插件管理
- 数据导出
```
"""
def llm_format_text(model, base_url, api_key, messages, max_tokens):
all_content = ""
all_reasoning_content = ""
client = OpenAI(api_key=api_key, base_url=base_url)
try:
try:
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0.99,
top_p=0.5,
max_tokens=max_tokens,
stream=True,
extra_body={
"thinking": {
# "type": "enabled",
"type": "disabled"
},
}
)
except Exception as e:
print(f"--llm_format_text------异常报错e={e}-----启用新的llm方式-----")
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0.99,
top_p=0.5,
max_tokens=max_tokens,
stream=True
)
# 获取内容
for chunk in response:
content = ""
reasoning_content = ""
try:
# 判断是 思维链 还是 最终回答
if (hasattr(chunk.choices[0].delta, "reasoning_content") and chunk.choices[0].delta.reasoning_content and (0 < len(chunk.choices[0].delta.reasoning_content))):
reasoning_content = (chunk.choices[0].delta.reasoning_content if chunk.choices[0].delta.reasoning_content else "")
print(reasoning_content)
all_reasoning_content = all_reasoning_content + reasoning_content
else:
content = (chunk.choices[0].delta.content if chunk.choices[0].delta.content else "")
print(content)
all_content = all_content + content
except Exception as e:
print(f"--llm_format_text---1---异常报错e={e}----------")
traceback.print_exc()
print(f'------------------------------------------------')
print(chunk)
print(f'------------------------------------------------')
except Exception as e:
print(f"--llm_format_text--2----异常报错e={e}----------")
traceback.print_exc()
print(f'------------------------------------------------')
# 整个 stream 调用就结束了
# 尝试提取 Markdown 内容
markdown_match = re.search(r"```(?:[^\n]*)\n(.*?)```", all_content, re.DOTALL)
if markdown_match:
all_content = markdown_match.group(1)
# 返回
return all_content