lyg
2025-03-04 58486e5e6e9c423a999d495a6446021aa808f32f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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)