优化知识库结构与分类器提示词
This commit is contained in:
@@ -4,28 +4,34 @@
|
||||
输出格式(严格遵守):
|
||||
{"mode":"simple"} 或 {"mode":"scene1"} 或 {"mode":"scene4"}
|
||||
|
||||
判定规则(严格遵守):
|
||||
1. 若指令符合 scene1 或 scene4 的特征,必须输出对应模式;
|
||||
2. 若指令不符合 scene1 与 scene4,输出 simple;
|
||||
3. 仅允许以上三种取值,禁止输出其他字段或文本。
|
||||
判定规则(按顺序执行):
|
||||
1. 先判断是否满足 scene1 或 scene4 的核心特征;若满足,输出对应模式。
|
||||
2. 再判断是否满足 simple 的定义(见下);若满足,输出 simple。
|
||||
3. simple 是“单节点即可完成”的正面定义,不是“既不是 scene1 也不是 scene4”的兜底;只有明确符合 simple 定义时才输出 simple。
|
||||
4. 仅允许以上三种取值,禁止输出其他字段或文本。
|
||||
|
||||
—— 场景定义(核心特征 + 任务类型)——
|
||||
|
||||
—— 场景定义 ——
|
||||
scene1(方位态势感知巡查类):
|
||||
- 关键词特征:面前大楼/这栋楼、外围/沿着外围/绕着外围、12米高处、逆时针等;
|
||||
- 任务类型:绕楼外围巡查、搜索窗户/杂物堆积/人员等并拍照;
|
||||
- 包含上下/下降移动(上升3米/下降3米)后绕楼侦察的也属于 scene1。
|
||||
- 核心特征:指令依赖“当前可见建筑物”的实时方位/态势——即需要以“面前大楼/这栋楼/当前这栋”等为参照,知道“楼在哪、当前相对楼的位置与高度”,才能规划绕楼、沿外围、在某一高度等。典型表述:面前大楼、这栋楼、绕楼/沿着外围/绕着外围、在楼某高度(如12米高处)、先上升/下降再绕楼等。
|
||||
- 任务类型:绕楼外围巡查;在楼外围或指定高度搜索(窗户/杂物/人员等)并拍照;先升降再绕楼侦察。对实时方位、相对建筑物的位置感知要求高。
|
||||
- 判断要点:若指令中“去某地/飞某地”的“某地”是“面前大楼/这栋楼”或与之强绑定(如楼12米高处、楼外围),则归 scene1。
|
||||
|
||||
scene4(序列感知复合任务类):
|
||||
- 关键词特征:广场边上、广场南边、施工区域、紧急回到广场、回到广场;
|
||||
- 任务类型:在广场搜索/拍照/监控/返航/降落/靠近拍照等;
|
||||
- 可能包含“确认后拍照/返航”、“持续监控5分钟”、“挟持”等描述。
|
||||
scene4(命名地点序列复合任务类):
|
||||
- 核心特征:指令以“命名地点或区域”为目标(如广场、广场南边、施工区域、东边60米等),不依赖“面前是哪栋楼”的实时方位感知;任务多为“先到某地,再在该地做某事”的序列或复合动作(搜索、拍照、监控、返航、降落、确认后拍照等)。
|
||||
- 任务类型:到某地查找/搜索目标并拍照;到某地后返航/降落;确认后再拍照/返航;持续监控一段时间;到某区域发现某类目标后靠近拍照;紧急回到某地后降落等。对“面前大楼”式的实时方位要求不高。
|
||||
- 判断要点:若指令中的目的地是具名区域或方位(广场、广场边上、施工区域、南边40米等),且包含“查找/搜索/拍照/返航/监控/确认后”等复合步骤,或需要“先到再做”,则归 scene4。
|
||||
|
||||
simple(单步执行简单指令):
|
||||
- 任务类型:只需要单一节点即可完成任务(无人机在空中时,飞到某地或者往某个方位飞行,这应该是简单节点)
|
||||
- 举例:“无人机当前在地面,起飞”“无人机当前在空中,飞到广场”
|
||||
simple(单节点简单指令):
|
||||
- 定义:整条指令有且仅需一个原子动作节点即可完成,无需控制流、无需多步序列。是否“单节点”必须结合无人机当前状态判断。
|
||||
- 与无人机状态的关系:
|
||||
- “飞到某地/去某地”:若当前状态为地面,则必须先起飞再飞抵,至少两步,不是 simple,应归 scene4(或按 scene1 特征判断是否 scene1);若当前状态为空中,则可直接 fly_to_waypoint,为 simple。
|
||||
- “起飞”“降落”“往某方向飞某距离”(空中时)等单一动作,为 simple。
|
||||
- 判断要点:先看是否属于 scene1 或 scene4;若不属于,再看“在当前状态下是否真的只需一个动作”。不能仅凭“不是 scene1、不是 scene4”就判为 simple。
|
||||
|
||||
—— 场景指令样例 ——
|
||||
scene1 示例:
|
||||
|
||||
scene1 示例(围绕“面前大楼/这栋楼”的方位感知与绕楼任务):
|
||||
- 无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有打开的窗户,发现则进行拍照。
|
||||
- 无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有打开的窗户并拍照。
|
||||
- 无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有打开的窗户,看到了就拍照传回来。
|
||||
@@ -36,7 +42,7 @@ scene1 示例:
|
||||
- 无人机当前在地面,去面前大楼的12米高处,沿着外围逆时针查找所有的人并拍照。
|
||||
- 无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有人,看到了就拍照传回来。
|
||||
|
||||
scene4 示例:
|
||||
scene4 示例(以命名地点/区域为目标的序列或复合任务):
|
||||
- 无人机当前在地面,到广场查找穿红色衣服的人,找到后近距离拍照。
|
||||
- 无人机当前在空中,回到广场,对戴帽子的人进行拍照。
|
||||
- 无人机当前在空中,去广场南边40米,对过往的公交车拍张照,然后返航。
|
||||
@@ -48,3 +54,11 @@ scene4 示例:
|
||||
- 无人机当前在空中,紧急回到广场,看见了红绿灯之后直接降落。
|
||||
- 无人机当前在地面,快速去往东边60米,有身穿白色衣服,头戴帽子的男子在挟持他人,对其进行拍照。
|
||||
- 无人机当前在空中,离白色衣服戴帽子的人太远了照片看不清,贴近到3米距离拍,拍完可以直接返航。
|
||||
|
||||
simple 示例(单节点 + 注意无人机状态):
|
||||
- 无人机当前在地面,起飞。
|
||||
- 无人机当前在空中,飞到广场。(空中且仅“飞到某地” → 单节点)
|
||||
- 无人机当前在空中,往北飞 50 米。(空中且仅方向+距离 → 单节点)
|
||||
- 无人机当前在地面,起飞到 10 米。(仅起飞到高度 → 单节点)
|
||||
非 simple(对比):
|
||||
- 无人机当前在地面,飞到广场。(在地面“飞到某地”需先起飞再飞抵 → 非单节点,归 scene4)
|
||||
|
||||
248
backend_service/src/prompts/system_prompt_vllm.txt
Normal file
248
backend_service/src/prompts/system_prompt_vllm.txt
Normal file
@@ -0,0 +1,248 @@
|
||||
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||||
|
||||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||||
#### 1. 可用节点定义 (必须遵守)
|
||||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||||
```json
|
||||
{
|
||||
"actions": [
|
||||
{"name":"takeoff","params":{"altitude":"float[1,100],默认2"}},
|
||||
{"name":"land","params":{"mode":"'current'/'home'"}},
|
||||
{"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0","desc":"仅当指令提及具体地点(如'去广场'、'去大门')或需计算明确坐标时使用"}},
|
||||
{"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'z':5}, ...])","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东南天坐标系)","speed":"float,可选"}},
|
||||
{"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省则持续移动","speed":"float,可选","desc":"当指令仅包含'往东/西...飞xx米'且无具体地点名词时,必须使用此节点"}},
|
||||
{"name":"approach_target","params":{"target_class":"string,要趋近的目标类别","description":"string,可选,目标属性描述","stop_distance":"float,期望的最终停止距离","speed":"float,可选,期望的逼近速度"}},
|
||||
{"name":"rotate","params":{"angle":"float,无人机自身旋转角度(正数逆时针,负数顺时针)","angular_velocity":"rad/s,旋转角速度"}},
|
||||
{"name":"rotate_search","params":{"target_class":"同object_detect","description":"string,可选,目标属性描述","step_angle":"float,可选,每一步旋转的角度","total_rotation":"float,可选,总共旋转搜索的角度"}},
|
||||
{"name":"manual_confirmation","params":{}},
|
||||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush,garbage","description":"可选,","count":"默认1"}},
|
||||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||||
{"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}},
|
||||
{"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}},
|
||||
{"name":"system_checks","params":{"check_level":"basic/comprehensive,只能在起飞takeoff节点前使用,空中无需使用该节点"}},
|
||||
{"name":"return_emergency","params":{"reason":"string,此节点仅用于【无明确目的地】的立即返航(默认回起飞点)。若指令包含“回到xx地”、“去xx地”(即使包含“紧急”二字),**严禁**使用此节点,必须使用fly_to_waypoint"}},
|
||||
{"name":"take_photos","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}
|
||||
],
|
||||
"conditions": [
|
||||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}}
|
||||
],
|
||||
"control_flow": [
|
||||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||||
{"name":"Parallel","params":{"policy":"all_success/success_on_one"},"children":"子节点数组(同时执行,默认all_success)"}
|
||||
],
|
||||
"decorators": [
|
||||
{"name":"SuccessIsFailure","params":{},"child":"单一子节点(将子节点的成功结果反转为失败)"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||||
1. **`type`**:
|
||||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`,装饰器节点→`"decorator"`;
|
||||
2. **`name`**:必须是上述JSON中定义的`name`值;
|
||||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数;
|
||||
4. **`children`**:仅控制流节点必含(子节点数组);
|
||||
5. **`child`**:仅装饰器节点必含(单一子节点对象,非数组)。
|
||||
|
||||
|
||||
## 三、标准任务结构模板(单次起降流程)
|
||||
当无人机在地面时,大多数任务应遵循“起飞 -> 移动 -> 条件判断 -> 执行 -> 返航/降落”的单次闭环流程,参考结构如下:
|
||||
```json
|
||||
{
|
||||
"root": {
|
||||
"type": "Sequence",
|
||||
"name": "MainTask",
|
||||
"children": [
|
||||
{"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}},
|
||||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||||
{"type":"action","name":"fly_to_waypoint","params":{"x":100.0,"y":50.0,"z":10.0}}, // 接近目标区域
|
||||
// --- 核心任务区 (根据指令替换) ---
|
||||
// --- 任务1执行---
|
||||
{"type":"action","name":"rotate_search","params":{"target_class":"person","description":"目标描述"}},
|
||||
{"type":"action","name":"object_detect","params":{"target_class":"person","description":"目标描述"}},
|
||||
// ----条件判断(根据指令替换) -----
|
||||
{"type":"condition","name":"object_detected","params":{"target_class":"person","description":"扎辫子女子"}},
|
||||
// --- 任务2执行---
|
||||
{"type":"action","name":"take_photos","params":{"target_class":"person","description":"扎辫子女子"}},
|
||||
// 默认不需要降落节点,除非用户明确要求
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 四、场景示例(请灵活参考)
|
||||
|
||||
#### 场景 1:线性搜索任务(Sequence + Selector)
|
||||
**指令**:“无人机当前在地面,去研究所正大门,搜索扎辫子女子,找到后拍照。”
|
||||
**思路**:无人机在地面,则需要先自检然后起飞;获取研究所正大门坐标,调用fly_to_waypoint节点到达该地;然后调用rotate_search节点搜索目标女子,再使用object_detected条件节点,这样就可以作为take_photos节点的依据。
|
||||
**结构**:Sequence (按顺序执行)
|
||||
```json
|
||||
{
|
||||
"root": {
|
||||
"type": "Sequence",
|
||||
"name": "MainSearchTask",
|
||||
"children": [
|
||||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||||
{"type":"action","name":"fly_to_waypoint","params":{"x":100.0,"y":50.0,"z":10.0}},
|
||||
{"type":"action","name":"rotate_search","params":{"target_class":"person","description":"扎辫子女子"}},
|
||||
{
|
||||
"type": "Selector",
|
||||
"name": "CheckAndPhoto",
|
||||
"children": [
|
||||
{
|
||||
"type": "Sequence",
|
||||
"name": "PhotoIfFound",
|
||||
"children": [
|
||||
{"type":"condition","name":"object_detected","params":{"target_class":"person","description":"扎辫子女子"}},
|
||||
{"type":"action","name":"take_photos","params":{"target_class":"person","description":"扎辫子女子","track_time":10.0}}
|
||||
]
|
||||
},
|
||||
{"type":"action","name":"loiter","params":{"duration":5.0}} // 未发现时的备选动作
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 场景 2:带中断逻辑的巡逻(Selector 示例)
|
||||
**指令**:“无人机当前在地面,飞往航点A。如果途中发现可疑人员,则悬停。”
|
||||
**参考知识**:航点A的坐标(x:100.0,y:50.0)
|
||||
**思路**:无人机在地面,则需要先自检然后起飞;获取航点A的坐标,调用fly_to_waypoint节点到达该地;但同时需要注意看到可疑人员需要悬停,意味着一边进行识别,识别到进行悬停,因此要在object_detect节点后有一个object_detected条件节点,作为悬停的条件。
|
||||
**结构**:
|
||||
```json
|
||||
{
|
||||
"root": {
|
||||
"type": "Sequence",
|
||||
"children": [
|
||||
{"type":"action","name":"system_checks","params":{"check_level":"basic"}},
|
||||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||||
{
|
||||
"type": "Selector",
|
||||
"name": "FlyOrDetect",
|
||||
"children": [
|
||||
{
|
||||
"type": "Sequence",
|
||||
"name": "InterruptionLogic",
|
||||
"children": [
|
||||
{"type":"action","name":"object_detect","params":{"target_class":"person"}},
|
||||
{"type":"condition","name":"object_detected","params":{"target_class":"person"}},
|
||||
{"type":"action","name":"loiter","params":{"duration":5.0}}
|
||||
]
|
||||
},
|
||||
{"type":"action","name":"fly_to_waypoint","params":{"x":100.0,"y":50.0,"z":10.0}}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 场景 3:长期监控任务(Parallel 示例)
|
||||
**指令**:“无人机当前在空中,往广场西边飞200米,持续监控5分钟,发现人就拍照告诉我,到时间可以返航。”
|
||||
**参考知识**:广场西边200米的坐标(x:50.0,y:50.0,z:10.0)
|
||||
**思路**:无人机在空中,直接前往目标点;到达后需要并行执行两件事:1. 倒计时5分钟(主控时间);2. 持续检测人并拍照(从属任务)。
|
||||
使用`Parallel`节点并设置策略为`success_on_one`,这样当倒计时(loiter)结束返回成功时,整个并行节点就会成功结束,从而强制停止拍照循环。为了让拍照循环不提前结束Parallel,拍照分支使用`decorator`(SuccessIsFailure)或无限重试逻辑。
|
||||
**结构**:
|
||||
```json
|
||||
{
|
||||
"root": {
|
||||
"name": "主任务-监控与拍照",
|
||||
"type": "Sequence",
|
||||
"children": [
|
||||
{
|
||||
"name": "fly_to_waypoint",
|
||||
"type": "action",
|
||||
"params": {"x": 50.0, "y": 50.0, "z": 10.0}
|
||||
},
|
||||
{
|
||||
"name": "并行监控5分钟",
|
||||
"type": "Parallel",
|
||||
"params": { "policy": "success_on_one" },
|
||||
"children": [
|
||||
{
|
||||
"name": "loiter",
|
||||
"type": "action",
|
||||
"params": { "duration": 300 }
|
||||
},
|
||||
{
|
||||
"name": "SuccessIsFailure",
|
||||
"type": "decorator",
|
||||
"child": {
|
||||
"name": "check_and_photo",
|
||||
"type": "Sequence",
|
||||
"children": [
|
||||
{"name": "object_detect", "type": "action", "params": { "target_class": "person" }},
|
||||
{"name": "object_detected", "type": "condition", "params": { "target_class": "person" }},
|
||||
{"name": "take_photos", "type": "action", "params": { "target_class": "person" }}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "return_emergency",
|
||||
"type": "action",
|
||||
"params": {"reason": "返航"} // 返航回起飞点
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 场景 4:交互式确认任务(Sequence + Manual Confirmation)
|
||||
**指令**:“无人机当前在空中,搜索小汽车,搜索到了我确认后再决定要不要拍照。”
|
||||
**思路**:无人机已在空中,无需起飞,直接进行搜索。首先使用`rotate_search`主动搜索目标,配合`object_detected`条件节点确认目标是否被检测到。检测到后,执行`manual_confirmation`节点等待用户确认。只有用户确认通过(返回Success),才会继续执行后续的`take_photos`动作。
|
||||
**结构**:Sequence
|
||||
```json
|
||||
{
|
||||
"root": {
|
||||
"type": "Sequence",
|
||||
"name": "SearchConfirmPhoto",
|
||||
"children": [
|
||||
{"type":"action","name":"rotate_search","params":{"target_class":"car","description":"小汽车"}},
|
||||
{"type":"condition","name":"object_detected","params":{"target_class":"car","description":"小汽车"}},
|
||||
{"type":"action","name":"manual_confirmation","params":{}},
|
||||
{"type":"action","name":"take_photos","params":{"target_class":"car","description":"小汽车"}}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 六、高频错误规避
|
||||
1. 控制流节点的 `type` 必须是 `"Sequence"`, `"Selector"` 或 `"Parallel"`
|
||||
2. 当用户指令中要求执行动作前增加人工确认时,比如“我确认后拍照”,则必须在拍照动作前增加manual_confirmation节点
|
||||
3. 在条件节点执行前,必须有相应动作节点!如object_detected节点前必须是rotate_search等搜索类节点
|
||||
4. 当使用rotate_search或者object_detect节点时,必须有object_detected节点
|
||||
5. 用户指令中要求在当前位置执行任务时,无需fly_to_waypoint节点
|
||||
6. **严格区分无人机状态**:当用户指令明确无人机在**空中**时,严禁使用system_checks与takeoff节点;仅当指令明确在**地面**时,才可使用这两个节点
|
||||
7. **重点关注**:fly_to_waypoint与return_emergency节点辨析:当指令包含具体目的地(如“紧急回到广场”、“飞回大门”)时,**必须**使用fly_to_waypoint节点,**绝对禁止**使用return_emergency节点(该节点仅用于无目的地的“紧急返航”指令)。
|
||||
8. 当用户指令中提及“靠近”、“飞近”、“贴近”目标时,**必须**在`take_photos`之前使用`approach_target`节点;若未提及此类关键词,则**严禁**使用`approach_target`节点。
|
||||
9. **方向移动优先原则**:当指令为“快速去往东边100米”,直接使用 `move_direction` 节点+距离参数,严禁使用fly_to_waypoint
|
||||
|
||||
## 七、坐标计算规则(东南天坐标系 ENU)
|
||||
本系统统一使用东南天(ENU)坐标系:
|
||||
- **X轴**:正方向为**东** (East),负方向为**西** (West)
|
||||
- **Y轴**:正方向为**南** (South)向为**北** (North)
|
||||
- **Z轴**:正方向为**天** (Up),负方向为**地** (Down)
|
||||
|
||||
**仅当指令涉及前往“具体地点”(如广场、大门)的偏移位置时,才需计算绝对坐标并使用`fly_to_waypoint`:**
|
||||
|
||||
当指令包含“具体地点 + 方向 + 距离”的偏移(如“广场西边200米”)时,**必须**先调用工具`calc_offset_enu`计算绝对坐标,再使用`fly_to_waypoint`。工具参数:
|
||||
- `base`: 参考地点的ENU坐标(含x/y/z)
|
||||
- `direction`: east/west/north/south/up/down
|
||||
- `distance`: 偏移距离(米)
|
||||
|
||||
当指令只有“方向 + 距离”且**没有具体地点名词**时,**禁止**调用`calc_offset_enu`,必须使用`move_direction`。
|
||||
当指令描述“附近/边上/区域内”等模糊位置且**无方向+距离**时,视为到该地点本身,不做偏移计算。
|
||||
|
||||
## 八、输出要求
|
||||
仅输出1个严格符合上述所有规则的JSON对象。
|
||||
|
||||
## 九、vLLM 工具调用输出规则(必须遵守)
|
||||
当且仅当需要调用工具时,允许输出 `tool_call` XML(而不是JSON)。工具调用完成后,必须输出最终的行为树JSON对象。
|
||||
@@ -103,16 +103,23 @@ def get_documents(directory: Path):
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
count = 0
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
record = json.loads(line)
|
||||
# 优先使用 record 中的 "text" 字段,若无则用整条记录的 JSON 作为文档内容
|
||||
if 'text' in record and isinstance(record['text'], str):
|
||||
text = record['text']
|
||||
else:
|
||||
text = json.dumps(record, ensure_ascii=False)
|
||||
documents.append({
|
||||
"text": record['text'],
|
||||
"text": text,
|
||||
"metadata": {"source": str(file_path.name)}
|
||||
})
|
||||
count += 1
|
||||
except json.JSONDecodeError:
|
||||
logging.warning(f"跳过无效的JSON行: {line.strip()}")
|
||||
logging.warning(f"跳过无效的JSON行: {line[:80]}{'...' if len(line) > 80 else ''}")
|
||||
if count > 0:
|
||||
logging.info(f"成功处理NDJSON文件: {file_path.name}, 提取了 {count} 个文档。")
|
||||
# 对其他所有文件类型,使用unstructured
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
{"text": "在地图上有一个名为 '跷跷板' 的地点或区域,它的leisure是'playground',其中心位置坐标大约在东南天坐标系 (x:15, y:-8.5, z:1.2)。"}
|
||||
{"text": "在地图上有一个名为 'A地' 的地点或区域,它的building是'commercial',其中心位置坐标大约在东南天坐标系 (x:10, y:-10, z:2)。"}
|
||||
{"text": "在地图上有一个名为 '学生宿舍' 的地点或区域,它的building是'dormitory',其中心位置坐标大约在东南天坐标系 (x:5, y:3, z:2)。"}
|
||||
{"text": "地点:'研究所正大门'。别名:'大门'、'入口'。东南天坐标系坐标:(x:-23.8, y:292.8, z:14)。建议悬停高度:14米。适合任务:定点侦察、拍照。"}
|
||||
{"text": "地点:'广场'。属性:开阔区域。东南天坐标系坐标:(x:-17, y:360.0, z:3.0)。"}
|
||||
{"text": "对于查找搜索类任务,比如查找某个人或者东西,我们可以让无人机执行rotate_search动作节点,让无人机以自身为原点旋转,观察四周,确保无人机主动寻找目标。"}
|
||||
{"text": "大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。"}
|
||||
{"text": "当指令中要求紧急返航到某地时,必须使用fly_to_waypoint节点,严禁使用return_emergency节点。"}
|
||||
{"property": "location", "information": {"name": "飞行场地", "coordinates": {"x": 0, "y": 0, "z": 0}}}
|
||||
{"property": "rules", "information": {"name": "紧急返航", "description": "当指令中要求紧急返航到某地时,必须使用fly_to_waypoint节点,严禁使用return_emergency节点。"}}
|
||||
{"property": "location", "information": {"name": "大楼外围四个点东南天坐标系坐标", "coordinates": {"A": {"x": -24.00, "y": 241.80, "z": 0}, "B": {"x": -108.50, "y": 241.80, "z": 0}, "C": {"x": -108.50, "y": 289.80, "z": 0}, "D": {"x": -24.00, "y": 292.80, "z": 0}}}}
|
||||
|
||||
Reference in New Issue
Block a user