import os
|
from openai import OpenAI
|
from pathlib import Path
|
import re
|
import json
|
|
API_KEY = 'sk-15ecf7e273ad4b729c7f7f42b542749e'
|
|
msg = """
|
你是一名经验丰富的通信协议分析师。你拥有成熟的协议文档阅读能力和协议文档分析能力。 1.你需要运用自己的阅读能力理解上面这些文档,这些文档都属于型号为XA-5D的无人机系统; 2.文档中描述的协议整体结构划分为:型号下包含设备,设备下包含数据流,数据流下包含探测帧,探测帧包含数据包,数据包下面包含具体的参数结构; 3.所有信息来源请依据文档进行分析,不要使用网络内容和自主生成; 4.使用树形结构的JSON将你理解的结构进行输出,多条信息使用数组包含对象的格式,子信息包含在key为child的数组中,子层结构与父层相同; 5.不要输出其他文字,直接输出对应的json;请输出文档中描述的探测帧结构;
|
"""
|
|
|
class LangFlow:
|
files = []
|
file_objects = []
|
|
def __init__(self, doc_files):
|
self.client = OpenAI(
|
api_key=API_KEY,
|
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
|
)
|
if doc_files:
|
self.files = doc_files
|
self.load_file_objs()
|
self.delete_all_files()
|
self.upload_files()
|
|
def load_file_objs(self):
|
file_stk = self.client.files.list()
|
self.file_objects = file_stk.data
|
|
def delete_all_files(self):
|
for file_object in self.file_objects:
|
self.client.files.delete(file_object.id)
|
|
def upload_file(self, file_path):
|
file_object = self.client.files.create(file=Path(file_path), purpose="file-extract")
|
return file_object
|
|
def upload_files(self):
|
self.file_objects = []
|
for file_path in self.files:
|
file_object = self.upload_file(file_path)
|
self.file_objects.append(file_object)
|
|
def run(self):
|
result = self.tm_frame_gen()
|
result += self.tm_pkts_gen()
|
return result
|
|
def _gen(self, msgs, msg):
|
messages = [] if msgs is None else msgs
|
if len(messages) == 0:
|
# 如果是第一次提问加入文档
|
for file_object in self.file_objects:
|
messages.append({'role': 'system', 'content': 'fileid://' + file_object.id})
|
messages.append({'role': 'user', 'content': msg})
|
completion = self.client.chat.completions.create(
|
model="qwen-long",
|
messages=messages,
|
stream=False,
|
temperature=0.0,
|
top_p=0,
|
# stream_options={"include_usage": True}
|
)
|
return completion
|
|
def tm_frame_gen(self):
|
result = ""
|
messages = []
|
_msg = """
|
你是一名经验丰富的通信协议分析师。你拥有成熟的协议文档阅读能力和协议文档分析能力。
|
1.你需要运用自己的阅读能力理解上面这些文档,这些文档都属于型号为XA-5D的无人机系统;
|
2.文档中描述的协议整体结构划分为:型号下包含设备,设备下包含数据流,数据流下包含探测帧,探测帧包含数据包,数据包下面包含具体的参数结构;
|
3.所有信息来源请依据文档进行分析,不要使用网络内容和自主生成;
|
4.使用树形结构的JSON将你理解的结构进行输出,多条信息使用数组包含对象的格式,子信息包含在key为child的数组中,子层结构与父层相同;
|
5.不要输出其他文字,直接输出对应的json;
|
请输出文档中描述的探测帧结构
|
"""
|
completion = self._gen(messages, _msg)
|
full_content = self.remove_markdown(completion.choices[0].message.content)
|
print(full_content)
|
messages.append({'role': 'assistant', 'content': full_content})
|
_msg2 = """
|
请阅读文档,给上面json加入以下字段:
|
1.type,例如设备层type为device,
|
2.length,例如8bit,
|
仅仅输出json
|
"""
|
completion = self._gen(messages, _msg2)
|
messages.append({'role': 'user', 'content': _msg2})
|
full_content = self.remove_markdown(completion.choices[0].message.content)
|
print('探测帧结构:'+full_content)
|
result += '探测帧结构:'
|
result += full_content
|
return result
|
|
def tm_pkts_gen(self):
|
result = ""
|
messages = []
|
_msg = """
|
你是一名经验丰富的通信协议分析师。你拥有成熟的协议文档阅读能力和协议文档分析能力。
|
1.你需要运用自己的阅读能力理解上面这些文档,这些文档都属于型号为XA-5D的无人机系统;
|
2.所有信息来源请依据文档进行分析,不要使用网络内容和自主生成;
|
3.不要输出其他文字,直接输出对应的json;
|
4.请输出探测帧下探测参数源包列表,仅输出包名称数组。
|
"""
|
completion = self._gen(messages, _msg)
|
full_content = completion.choices[0].message.content
|
full_content = self.remove_markdown(full_content)
|
print(f'所有探测帧参数源包:')
|
print(full_content)
|
result += '所有探测帧参数源包:'
|
result += full_content
|
# 解析json
|
pkts = json.loads(full_content)
|
for pkt in pkts:
|
pkt_json = self.tm_pkt_gen(pkt)
|
print(f'数据包:{pkt}')
|
print(pkt_json)
|
result += f'数据包:{pkt}\n'
|
result += pkt_json
|
return result
|
|
def tm_pkt_gen(self, pkt_name):
|
messages = []
|
_msg = f"""
|
你是一名经验丰富的通信协议分析师。你拥有成熟的协议文档阅读能力和协议文档分析能力。
|
1.你需要运用自己的阅读能力理解上面这些文档,这些文档都属于型号为XA-5D的无人机系统;
|
2.所有信息来源请依据文档进行分析,不要使用网络内容和自主生成;
|
3.使用树形结构的JSON将你理解的结构进行输出,多条信息使用数组包含对象的格式,子信息包含在key为child的数组中,子层结构与父层相同;
|
4.不要输出其他文字,直接输出对应的json;
|
请输出文档中描述的{pkt_name}的结构的各个层级
|
"""
|
completion = self._gen(messages, _msg)
|
return self.remove_markdown(completion.choices[0].message.content)
|
|
def remove_markdown(self, text):
|
# 去掉开头的```json
|
text = re.sub(r'^```json', '', text)
|
# 去掉结尾的```json
|
text = re.sub(r'```$', '', text)
|
return text
|
# if __name__ == '__main__':
|
# text = ChatFlow().run()
|
# print(text)
|