大模型驱动的智能无人机应用开发4:大模型提示词工程入门

网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂

(可直接在网易云课堂搜索:大模型驱动的智能无人机应用开发)

1. 无人机sdk封装

  1. 像人一样操作无人机

    使用大模型控制无人机,类似和飞手操作无人机一样,如何让操作更简单,是应用大模型的关键。

  2. 原始API过于复杂

    目前airsim如起飞就要调用多个api函数,主要是从系统稳定性,易用性等方面考虑设计的,但对一个大模型或者飞手而言,可能更需要的是“起飞”这一个操作就行


根据一些研究和实践,一般需要对无人机或者类似的无人装备的sdk进行二次封装,更方便大模型调用,常见的规则如下:

  1. 接口语义化封装 将底层坐标系转换(如AirSim的z轴负方向)封装在接口内部,对外暴露自然语义(如fly_to([x,y,正数高度])),类似代码中fly_to()对z值的处理逻辑。

  2. 功能原子化 每个方法对应独立操作单元(如takeoff/land单独封装),避免复合操作,方便大模型按需调用(类似set_yaw()fly_to的分离)

  3. 参数标准化 统一使用基础数据类型(list/dict)作为输入输出,如位置统一返回[x,y,z]列表,降低大模型处理复杂度(参见get_drone_position()返回值设计)

  4. 异常静默处理 内置重试机制和默认值返回,如get_position()中的while循环规避空值,避免调用链路中断

  5. 物理单位统一 内部统一转换量纲(如弧度转角度),对外始终使用直观单位(如get_yaw()返回角度值)

  6. 上下文保持 维持client连接状态(__init__中初始化连接),通过类属性保存会话上下文,确保多指令调用的连续性

  7. 语义别名映射 建立对象字典(objects_dict)实现自然语言到引擎对象的转换,提升提示词相容性

  8. 异步转同步 通过.join()将异步操作转为同步(如takeoffAsync().join()),避免大模型处理异步回调的复杂性

  9. 传感器抽象 对原始传感器数据(如Lidar点云)进行预处理,返回可直接使用的指标数据(get_distance()返回最小距离值)

  10. 安全边界设置 在关键操作(如reset)中保持API控制权,通过enableApiControl等机制防止失控

建议补充规则:增加方法调用前的前置条件校验(如起飞前检查解锁状态)、返回结构标准化(统一包含success标志位)、增加调试模式开关等,可进一步提升大模型调用可靠性。

一些典型的封装方式如下:

def takeoff(self):
    """
    takeoff the drone
    """
    self.client.takeoffAsync().join()

def land(self):
    """
    land the drone
    """
    self.client.landAsync().join()

    
def get_yaw(self):
    """
    get the yaw angle of the drone
    :return: yaw_degree, the yaw angle of the drone in degree
    """
    orientation_quat = self.client.simGetVehiclePose().orientation
    yaw = airsim.to_eularian_angles(orientation_quat)[2] # get the yaw angle
    yaw_degree = math.degrees(yaw)
    return yaw_degree # return the yaw angle in degree

具体可以参考airsim_wrapper.py代码

后面如果使用专门的框架,则对函数封装形式会有更明确的要求,如:

@tool
def suggest_menu(occasion: str) -> str:
    """
    Suggests a menu based on the occasion.
    Args:
        occasion: The type of occasion for the party.
    """
    if occasion == "casual":
        return "Pizza, snacks, and drinks."
    elif occasion == "formal":
        return "3-course dinner with wine and dessert."
    elif occasion == "superhero":
        return "Buffet with high-energy and healthy food."
    else:
        return "Custom menu for the butler."

@tool
def get_position(object_name:str)->[float, float, float]:
    """
    get the position of a specific object
    :param object_name: the name of the object
    :return: position, the position of the object
    """
    query_string = objects_dict[object_name] + ".*"
    object_names_ue = []
    while len(object_names_ue) == 0:
        object_names_ue = self.client.simListSceneObjects(query_string)
    pose = self.client.simGetObjectPose(object_names_ue[0])
    return [pose.position.x_val, pose.position.y_val, pose.position.z_val]

2. OpenAI等SDK调用

一、OpenAI Chat SDK 核心特性

OpenAI 提供了多种语言的官方及社区维护的 SDK,支持快速集成 ChatGPT 功能到应用程序中,核心特性包括:

  1. 多语言支持:覆盖 Python、Java、.NET 等主流开发语言
  2. 功能完备性:支持聊天补全、函数调用、流式响应等核心 API 功能
  3. 开发友好性:提供同步/异步接口、预构建请求对象、自动错误重试等机制

OpenAI 标准 Python SDK 的核心功能与参数设置,兼容主流大模型调用场景(如 ChatGPT、GPT-4 等),且参数逻辑可扩展至其他兼容 OpenAI API 的国产大模型:


一、SDK 核心功能与兼容性设计

  1. 统一接口规范
    OpenAI SDK 通过标准化的 ChatCompletion.create() 方法提供模型调用,兼容所有遵循 OpenAI 接口规范的服务(如百度文心、智谱清言等国产大模型)。

    from openai import OpenAI
    client = OpenAI(api_key="YOUR_KEY", base_url="https://国产模型API地址")  # 兼容性关键参数
  2. 跨模型参数映射
    核心参数(如 temperaturemax_tokens)在不同模型中语义一致,仅需调整数值范围即可适配不同模型特性。


二、关键参数设置指南

参数作用推荐值域应用场景
model指定模型版本(如 gpt-3.5-turbo模型支持列表控制模型能力与成本
temperature输出随机性:低值更确定,高值更创意0.2-1.0事实问答(0.2)、创作(0.8)
max_tokens生成文本最大长度(含输入+输出)50-4096控制响应篇幅与 API 成本
top_p核采样阈值:仅从累计概率达标的候选词中采样0.7-0.95平衡多样性与相关性
stream启用流式响应(逐字输出)True/False提升交互体验
presence_penalty抑制重复内容(正值抑制,负值允许)-2.0-2.0避免冗余回答
示例:多模型兼容调用
# 调用 GPT-3.5(官方模型)
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "解释量子纠缠"}],
    temperature=0.5,
    max_tokens=500
)

# 调用通义千问(国产模型)
response = client.chat.completions.create(
    model="qwen-max", 
    messages=[{"role": "user", "content": "写一首七言绝句"}],
    temperature=0.7,
    top_p=0.9
)

三、最佳实践与注意事项

  1. 参数调优策略
    • 组合使用 temperature+top_p 实现精确控制(如 temperature=0.8 + top_p=0.9 平衡创意与逻辑) • 通过 max_tokens 限制输出长度,避免超出模型上下文限制(如 GPT-3.5 的 4096 tokens)

  2. 异常处理机制

    try:
        response = client.chat.completions.create(...)
    except openai.APIError as e:
        print(f"API 错误: {e}")
    except openai.RateLimitError:
        print("请求频率超限,请稍后重试")

这里我们以火山方舟的sdk申请为例,其他的都类似: 账号登录-火山引擎

 安装openai

!pip install --upgrade "openai>=1.0"
ARK_API_KEY=""
import os
from openai import OpenAI

# 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
# 初始化Openai客户端
client = OpenAI(
    # 此为默认路径,您可根据业务所在地域进行配置
    base_url="https://ark.cn-beijing.volces.com/api/v3",
    api_key=ARK_API_KEY,
)

# Non-streaming:
completion = client.chat.completions.create(
    model="doubao-1-5-pro-32k-250115",
    messages=[
        {"role": "user", "content": "常见的无人机模拟仿真系统都有哪些?"},
    ],
    temperature=0.1,
)
print(completion.choices[0].message.content)

大模型给出的回答:

常见的无人机模拟仿真系统可以分为开源和商业两类,以下是一些典型代表:

### 开源模拟仿真系统
- **Gazebo**
    - **简介**:一款功能强大的机器人和无人机仿真软件,它能够提供高保真的物理模拟和丰富的传感器模型。可以模拟不同的环境,如室内、室外、山地等,支持多种机器人平台,包括各种类型的无人机。
    - **应用场景**:常用于学术研究和开发,例如无人机的路径规划算法测试、传感器融合算法验证等。研究人员可以在Gazebo中创建虚拟环境,对无人机的各种行为进行模拟和分析。
 - **FlightGear**
    - **简介**:是一个开源的飞行模拟器,它具有高度可定制性和广泛的飞行器模型库。可以模拟各种飞行条件和环境,包括不同的气象条件、地形地貌等。
    - **应用场景**:既可以用于无人机飞行控制算法的开发和测试,也可以用于飞行培训。开发者可以利用FlightGear的API接口,将自己的控制算法集成到仿真系统中,对无人机的飞行性能进行评估。
 - **JSBSim**
    - **简介**:是一个开源的飞行器动力学建模和仿真工具,它提供了详细的飞行器动力学模型,能够准确模拟无人机的飞行力学特性。
    - **应用场景**:主要用于无人机飞行控制系统的设计和验证。通过JSBSim,可以对无人机的飞行性能进行精确分析,评估不同控制策略的效果。

### 商业模拟仿真系统
- **MATLAB/Simulink**
    - **简介**:MATLAB是一种广泛应用于科学计算和工程领域的软件,Simulink是其可视化建模和仿真工具。它提供了丰富的模块库,包括无人机动力学模型、控制器设计模块等。
    - **应用场景**:在无人机控制系统设计、算法开发和性能分析方面具有广泛的应用。工程师可以使用Simulink搭建无人机的仿真模型,对控制算法进行快速验证和优化。
 - **X-Plane**
    - **简介**:是一款专业的飞行模拟软件,具有高度真实的飞行物理模型和丰富的地形数据。它支持多种类型的飞行器,包括无人机。
    - **应用场景**:常用于飞行培训、航空研究和无人机系统的评估。其真实的飞行模拟环境可以让用户体验到接近真实飞行的感觉,对于无人机的飞行性能测试和飞行员培训具有重要价值。
 - **AirSim**
    - **简介**:是微软开发的一款开源跨平台无人机和汽车仿真器,基于虚幻引擎和Unity引擎构建,提供了逼真的视觉效果和物理模拟。它支持多种传感器模拟,如摄像头、激光雷达等。
    - **应用场景**:主要用于无人机的计算机视觉和机器学习算法的开发和测试。开发者可以利用AirSim的丰富传感器数据,训练和验证无人机的自主飞行算法。 

role的使用

是OpenAI SDK中消息角色(Role)的对比表格如下,展示了不同角色的核心功能、典型用途及示例:

角色 (Role)核心功能典型用途示例引用
system设定AI的行为模式、响应规则及操作限制- 定义AI身份(如命令行专家)
- 控制输出格式(JSON/自然语言)
- 设置安全权限
{"role": "system", "content": "你需以用户视角判断应执行的命令,当前系统是linux"}
user传递用户的实际请求或对话输入- 单轮直接提问(如“查看文件”)
- 多轮追问(如“具体步骤是什么?”)
{"role": "user", "content": "帮我看下当前目录下有没有main.go文件?"}
assistant存储AI的历史回复内容,用于上下文连贯性维护- 多轮对话中提供连贯回答
- 开发者可修改历史回复以修正错误
{"role": "assistant", "content": "执行命令:ls main.go"}

补充说明:

  1. 角色交互规则
    • 消息顺序:最后一条必须为user角色以触发响应,且每次请求需包含完整上下文。 • 动态调整:通过插入新的system消息可切换AI身份(如从翻译助手变为数据分析师)。

  2. 性能优化
    • system内容建议简洁(200 tokens内),避免冗余影响模型处理效率。

  3. 扩展应用
    • 结合function calling功能,可通过system设定函数调用规则,user触发请求,assistant返回结构化参数以执行外部操作(如调用API)。

 3. 大模型提示词工程入门

 

大模型时代的编程==提示词撰写

提示词工程(Prompt Engineering)是一种系统性优化人工智能交互的关键技术,通过设计、调试和优化提示词(Prompt)来精准引导大语言模型(LLM)输出符合预期的结果。目前大部分应用都是通过提示词完成的。以下是其核心要点:


一、定义与核心目标

  1. 定义
    让大模型听懂人话。提示词工程将模糊的用户需求转化为结构化指令,通过控制输入内容来调节模型行为,减少输出的随机性并激发模型潜在能力。其本质是构建“人机协同”的标准化交互流程,而非简单的提问技巧。

  2. 核心目标

• 对齐意图:将人类需求转化为模型可理解的表达(例如通过角色扮演框架“你是一名资深律师”)。

• 控制输出:通过明确指令(如格式、长度)减少不确定性(例如要求生成Markdown表格);
• 激发能力:解锁模型的推理、创作等高级能力(如用思维链CoT技术引导复杂问题解决);


二、关键技术要素

  1. 结构化设计
    • 模块化构建:将提示拆解为角色、任务、约束等模块(例如“角色+背景+输出要求”框架);
    • 参数调节:显式控制模型参数(如temperature调整输出随机性);
    • 多模型协同:复杂任务中调用多模型接力处理(如先用GPT生成文案,再用Stable Diffusion生成配图)。

  2. 优化方法
    • 迭代测试:通过多轮调试优化提示词,类似代码测试流程;
    • 领域知识嵌入:在专业场景中注入术语和规范(如法律文件需引用《民法典》条款);
    • 上下文管理:动态截断或保留历史对话以平衡Token消耗。


三、应用场景

  1. 内容创作:生成营销文案、学术报告等结构化内容(如电商直播话术设计需包含价格锚点和互动机制);
  2. 专业提效:辅助法律合规审查、金融数据分析等需高准确度的任务;
  3. 跨模态生成:在图像生成中描述风格参数(如“赛博朋克风格,霓虹灯光”)。

适用于函数调用的提示词

大模型控制无人机飞行,其实就是用大模型生成代码,控制无人机飞行,完成各类任务,最简单的方法就是通过提示词完成无人机相关的sdk函数调用。

角色使用

  • system角色定义:如数据科学家(仅能调用分析类API)
  • user角色权限:提交原始数据请求,调用函数等

函数描述模板

模板1:简单描述
aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。
aw.get_drone_position() - 以与 X,Y,Z 坐标相对应的 3 个浮点数的列表形式返回无人机的当前位置。

特点
• 简单易懂
• 适用于简单的函数调用

模板2:带参数描述
函数名: validate_user_registration  
功能: 验证用户注册信息合法性  
输入参数:  
- username: 字符串(长度4-20字符,仅允许字母数字)  
- password: 字符串(至少包含大写字母、数字和特殊符号)  
- email: 符合RFC 5322标准的邮箱地址  
返回值:  
- {"status": "success/error", "message": "详细描述"}

特点
• 参数添加表达式约束
• 返回值结构预定义

大模型函数调用的发展

提示词方式(Prompt)函数调用方式(Function Call) 和 模型控制协议(MCP) 对比


特性提示词方式(Prompt)函数调用方式(Function Call)模型控制协议(MCP)
核心原理通过自然语言描述任务,引导模型生成输出。模型生成 JSON 格式的调用请求,外部工具执行具体操作并返回结果。标准化协议,支持多模型协同、动态任务分配和实时监控。
适用场景简单任务(如文本生成、问答、翻译)。复杂任务(如数据库查询、API 调用、计算任务)。多模型协同任务(如文本生成 + 图像生成 + 数据分析)。
灵活性高:可通过自然语言自由描述任务。中:任务范围受限于预定义函数。高:支持动态任务分配和多模型协同。
可控性低:输出结果可能偏离预期,需多次调试提示词。高:通过结构化参数约束输出,减少模型幻觉。高:通过配置文件定义模型行为和交互规则。
开发成本低:无需额外工具,直接通过自然语言交互。高:需预先定义函数并实现逻辑。高:需掌握协议规范并配置工具链。
效率低:复杂任务需多次交互,Token 消耗大。高:复杂任务可通过外部工具快速完成。中:多模型协同需更多计算资源。
标准化程度低:提示词设计依赖开发者经验。中:需遵循函数调用规范。高:统一接口和配置文件,降低集成难度。
示例你是一名翻译,请将以下英文翻译为中文:"Hello, world!"{"function": "get_weather", "parameters": {"location": "Beijing"}}models: [{name: gpt-4, role: text_generator}, {name: sd, role: image_generator}]
优点灵活性强,开发成本低。可控性强,效率高。扩展性强,标准化程度高。
缺点可控性差,效率低。开发成本高,灵活性低。复杂度高,资源消耗大。
未来优化方向结合强化学习自动生成高效提示词。支持动态函数注册和实时更新。更多厂商和开发者加入协议生态。

无人机控制system角色

提示词描述如下:

你是一个帮助我使用AirSim无人机模拟器的助手。  
当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。  
你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。  
你可以使用简单的Python库函数,例如`math`和`numpy`。

回复均按照如下格式:
```python
aw.land()

此代码功能为无人起飞

函数描述

以下是您可以用来命令无人机的一些功能。
aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。
ARK_API_KEY=""
import os
from openai import OpenAI

# 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
# 初始化Openai客户端
client = OpenAI(
    # 此为默认路径,您可根据业务所在地域进行配置
    base_url="https://ark.cn-beijing.volces.com/api/v3",
    api_key=ARK_API_KEY,
)
chat_history = []
def chat(prompt, chat_history):
    chat_history.append(
            {
                "role": "user",
                "content": prompt,
            }
    )
    completion = client.chat.completions.create(
        model="doubao-1-5-pro-32k-250115",
        messages=chat_history, #chat_history[-10:0]
        temperature=0.1,
    )

    content = completion.choices[0].message.content

    # 加入机器人回复,相当于保存全部的历史记录,多轮对话
    chat_history.append(
            {
                "role": "assistant",
                "content": content,
            }
        )

    return content
SYS_MSG="""
你是一个帮助我使用AirSim无人机模拟器的助手。  
当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。  
你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。  
你可以使用简单的Python库函数,例如`math`和`numpy`。
"""
chat_history.append(
    {
        "role": "system",
        "content": SYS_MSG,
    }
)
knowledge_prompt="""
以下是您可以用来命令无人机的一些功能。

aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。

回复均按照如下格式:
```python
i=1#这里输出python代码
```
此代码功能为赋值

你无需考虑aw的import问题,在环境中已经声明

"""

ret = chat(knowledge_prompt, chat_history)
ret

结果返回:

'### 起飞无人机\n```python\naw.takeoff()\n```\n此代码功能为调用`aw`对象的`takeoff`方法,使无人机起飞。\n\n### 无人机着陆\n```python\naw.land()\n```\n此代码功能为调用`aw`对象的`land`方法,使无人机着陆。'
chat_history
[{'role': 'system',
  'content': '\n你是一个帮助我使用AirSim无人机模拟器的助手。  \n当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。  \n你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。  \n你可以使用简单的Python库函数,例如`math`和`numpy`。\n'},
 {'role': 'user',
  'content': '\n以下是您可以用来命令无人机的一些功能。\n\naw.takeoff() - 起飞无人机。\naw.land() - 无人机着陆。\n\n回复均按照如下格式:\n```python\ni=1#这里输出python代码\n```\n此代码功能为赋值\n\n你无需考虑aw的import问题,在环境中已经声明\n\n'},
 {'role': 'assistant',
  'content': '### 起飞无人机\n```python\naw.takeoff()\n```\n此代码功能为调用`aw`对象的`takeoff`方法,使无人机起飞。\n\n### 无人机着陆\n```python\naw.land()\n```\n此代码功能为调用`aw`对象的`land`方法,使无人机着陆。'}]

4. 课程资源

项目github:GitHub - maris205/airsim_agent

项目huggingface:dnagpt/airsim_agent · Hugging Face

网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂

 (直接在网易云课堂搜索:大模型驱动的智能无人机应用开发,即可获取所有项目资源和专属答疑,实时更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值