手把手教你捏一个自己的Agent

01

前言

Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。

AgentFabric围绕可插拔和可定制的LLM构建,并增强了指令执行、额外知识检索和利用外部工具的能力。AgentFabric提供的交互界面包括:

  • 智能体构建器: 一个自动指令和工具提供者,通过与用户聊天来定制用户的智能体

  • 用户智能体: 一个为用户的实际应用定制的智能体,提供构建智能体或用户输入的指令、额外知识和工具

  • 配置设置工具: 支持用户定制用户智能体的配置,并实时预览用户智能体的性能

🔗 目前AgentFabric围绕DashScope提供的 Qwen2.0 LLM API(通义千问API如何使用_模型服务灵积(DashScope)-阿里云帮助中心 (aliyun.com)) 在AgentFabric上构建不同的智能体应用。

在使用DashScope提供的qwen api构建应用与定制交互的过程中,我们发现选取千亿级别参数的qwen-max或开源的qwen-72b等大规模参数模型能获得较好的工具调用和角色扮演效果。大规模参数模型效果好,但难以在消费级机器上进行本地部署调用;同时小模型如qwen-7b-chat对工具调用的能力较弱。因此本篇旨在针对AgentFabric的工具调用场景,提供可用的数据集和微调方法,使稍小的模型如qwen-7b-chat也具有能在AgentFabric中完成工具调用的能力。

02

环境安装

环境准备(基于modelscope镜像)

参考:swift/docs/source/LLM/Agent微调最佳实践.md at main · modelscope/swift · GitHub
在这里插入图片描述

03

数据准备

为训练Agent能力,魔搭官方提供了两个开源数据集:

  • 魔搭通用问答知识数据集 该数据集包含了38万条通用知识多轮对话数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_bench/summary
  • 魔搭通用Agent训练数据集 该数据集包含了3万条Agent格式的API调用数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_agent/summary

相关使用方式参考:swift/docs/source/LLM/Agent微调最佳实践.md at main · modelscope/swift · GitHub

为了让qwen-7b-chat能够在AgentFabric上有比较好的效果,我们尝试使用通用Agent训练数据集ms_agent对qwen-7b-chat进行微调。微调后模型确实能够在ms_agent格式的prompt下获得工具调用能力。但在AgentFabric上对工具的调用表现欠佳,出现了不调用工具、调用工具时配置的参数错误、对工具调用结果的总结错误等,10次访问能成功正确调用1次。

  • 不调用工具;总结时胡编乱造

在这里插入图片描述

  • 调用时不按要求填写参数

图片

考虑到AgentFabric是基于大规模文本模型调配的prompt,侧重角色扮演和应用,与ms_agent的prompt格式有区别。finetuned稍小模型的通用泛化性稍弱,换格式调用确实可能存在效果欠佳的情况。

原ms_agent prompt示例

Answer the following questions as best you can. You have access to the following APIs:
1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{"name": "image", "description": "The input image to recognize fire", "required": "True"}]

Use the following format:

Thought: you should always think about what to doAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/
Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!

输入图片是/tmp/2.jpg,协助判断图片中是否存在着火点
# 工具

AgentFabric prompt示例

# 工具

## 你拥有如下工具:

amap_weather: amap_weather API。获取对应城市的天气数据 输入参数: {"type": "object", "properties": {"location": {"type": "string", "description": "城市/区具体名称,如`北京市海淀区`请描述为`海淀区`"}}, "required": ["location"]} Format the arguments as a JSON object.

## 当你需要调用工具时,请在你的回复中穿插如下的工具调用命令,可以根据需求调用零次或多次:

工具调用
Action: 工具的名称,必须是[amap_weather]之一
Action Input: 工具的输入
Observation: <result>工具返回的结果</result>
Answer: 根据Observation总结本次工具调用返回的结果,如果结果中出现url,请使用如下格式展示出来:![图片](url)


# 指令

你扮演一个天气预报助手,你需要查询相应地区的天气,并调用给你的画图工具绘制一张城市的图。

请注意:你具有图像和视频的展示能力,也具有运行代码的能力,不要在回复中说你做不到。

(。你可以使用工具:[amap_weather])朝阳区天气怎样?


ms_agent_for_agentfabric数据集

ms_agent 更新数据

为解决上述的prompt格式不匹配问题,我们首先将ms_agent转换成AgentFabric的prompt组织格式。从ms_agent到AgentFabric的转换过程可以通过如下脚本实现:

import json
import re

sys_prefix = "\n# 工具\n\n## 你拥有如下工具:\n\n"

def _process_system(text): 
    apis_info = []    
    api_pattern = r"(?<=\n\d\.)(.*?})(?=])"    
    apis = re.findall(api_pattern,text,re.DOTALL)    
    sys_prompt = sys_prefix    
    func_names = []    
    for api in apis:     
        func_name = re.search(r'(.*?):', api).group(1).strip()        
        func_names.append(func_name)        
        api_name = re.search(r'(\S+)\sAPI', api).group(1)        
        api_desc = re.search(r"useful for\?\s(.*?)\.",api).group(1)        
        sys_prompt += f"{func_name}: {api_name} API。{api_desc}" + "输入参数: {\"type\": \"object\", \"properties\": {"        
        paras = re.findall(r"Parameters: \[({.*})",api,re.DOTALL)        
        required_paras = []        
        for para in paras:       
            para_name = re.search(r'"name": "(.*?)"',para).group(1)            
            desc = re.search(r'"description": "(.*?)"',para).group(1)            
            if re.search(r'"required": "(.*)"',para).group(1).strip().lower() == "true": required_paras.append(para_name)            
            sys_prompt += f'"\{para_name}\": {{\"type\": \"string\", \"description\": \"{desc}\"}}'         
        sys_prompt += "},\"required\": " + json.dumps(required_paras) + "} Format the arguments as a JSON object." + "\n\n"    
    func_names = json.dumps(func_names)    
    sys_prompt += f"## 当你需要调用工具时,请在你的回复中穿插如下的工具调用命令,可以根据需求调用零次或多次:\n\n工具调用\nAction: 工具的名称,必须是{func_names}之一\nAction Input: 工具的输入\nObservation: <result>工具返回的结果</result>\nAnswer: 根据Observation总结本次工具调用返回的结果,如果结果中出现url,请使用如下格式展示出来:![图片](url)\n\n\n# 指令\n\n你扮演AI-Agent,\n你具有下列具体功能:\n下面你将开始扮演\n\n请注意:你具有图像和视频的展示能力,也具有运行代码的能力,不要在回复中说你做不到。\n"
    
    return sys_prompt
    
jsonl_file_path = 'ms_agent/train_agent_react.jsonl'
target_file_path = 'new_ms_agent.jsonl'

modified_data = []

with open(jsonl_file_path, 'r', encoding='utf-8') as file:
    for line in file:    
        json_obj = json.loads(line)        
        system_prompt = json_obj["conversations"][0]["value"]        
        json_obj["conversations"][0]["value"] = _process_system(system_prompt)        
        modified_data.append(json_obj)
        
with open(target_file_path, 'w', encoding='utf-8') as file: 
    for json_obj in modified_data:    
        file.write(json.dumps(json_obj, ensure_ascii=False) + '\n')

转换后的30000条数据已上传至modelscope数据集,参考数据集链接:

https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary

使用该数据集finetune后,得到的模型在AgentFabric上的效果明显好转:每次访问都能够去调用工具,且基本能正确调用工具。但同时也有对工具调用结果的总结稍弱、有时无法自动停止输出等问题。

  • 总结能力稍弱:已经查询到天气,仍回答“无法获取实时天气数据”

图片

  • 停止能力稍弱:未生成终止符,多次调用同一工具同一参数

在这里插入图片描述

AgentFabric新增数据

ms_agent数据集全为英文、且并无AgentFabric的roleplay等内容信息。虽然基模型qwen-7b-chat拥有中文能力,使通过new_ms_agent 数据集finetune后的模型能够正常识别用户意图,正确调用工具;但总结和停止能力都稍弱。 为此,我们通过开源的AgentFabric框架实际调用访问,获得了一些AgentFabric使用过程中实际发送给模型的prompt。筛选处理成一个数据集,加上new_ms_agent的数据一起finetune。得到的模型在AgentFabric上修复了此前的总结稍弱、有时无法自动停止问题。

  • 多次调用均响应正常,甚至有一次get到了instruction中的内容。

在这里插入图片描述

处理好的488条数据已上传至modelscope数据集,可通过如下链接访问下载:

https://modelscope.cn/api/v1/datasets/AI-ModelScope/ms_agent_for_agentfabric/repo?Revision=master&FilePath=addition.jsonl

效果评估

测试数据来自以下数据集:

  • https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary
  • https://modelscope.cn/datasets/iic/ms_bench/summary

以上数据混合后,按照1%比例采样作为test data

图片

备注: 横轴为训练步数,纵轴为准确率

总结

我们在原有的两个用于agent训练集上又额外的增加了基于AgentFabric 版本的数据集,目前可供参考的agent应用数据集如下:

  • 魔搭通用agent数据集(agentfabric版)该数据集包含了30488条可支持AgentFabric格式的API调用数据

    • 数据集链接:https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary
  • 魔搭通用问答知识数据集 该数据集包含了38万条通用知识多轮对话数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_bench/summary
  • 魔搭通用Agent训练数据集 该数据集包含了3万条Agent格式的API调用数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_agent/summary

04

微调流程

训练准备

在gpu机器执行

将new_ms_agent.jsonl和addition.jsonl两个文件的具体路径通过–custom_train_dataset_path进行配置后,在8* A100 环境中可通过以下命令开启训练,需约2-3小时;如果是单卡训练,需要修改nproc_per_node=1。

# Experimental environment: A100

cd examples/pytorch/llm

# 如果使用1张卡则配置nproc_per_node=1
nproc_per_node=8

export PYTHONPATH=../../..

# 时间比较久,8*A100需要 2+小时,
nohup运行nohup torchrun \
    --nproc_per_node=$nproc_per_node \    
    --master_port 29500 \    llm_sft.py \    
    --model_id_or_path qwen/Qwen-7B-Chat \    
    --model_revision master \    
    --sft_type lora \    
    --tuner_backend swift \    
    --dtype AUTO \    
    --output_dir output \    
    --custom_train_dataset_path ms_agent_for_agentfabric/new_ms_agent.jsonl ms_agent_for_agentfabric/addition.jsonl    
    --train_dataset_mix_ratio 2.0 \    
    --train_dataset_sample -1 \    
    --num_train_epochs 2 \    
    --max_length 2048 \    
    --check_dataset_strategy warning \   
    --lora_rank 8 \    --lora_alpha 32 \    
    --lora_dropout_p 0.05 \    
    --lora_target_modules ALL \    
    --self_cognition_sample 3000 \    
    --model_name 卡卡罗特 \    
    --model_author 陶白白 \    
    --gradient_checkpointing true \    
    --batch_size 2 \    
    --weight_decay 0.01 \    
    --learning_rate 5e-5 \    
    --gradient_accumulation_steps $(expr 1 / $nproc_per_node) \    
    --max_grad_norm 0.5 \    
    --warmup_ratio 0.03 \    
    --eval_steps 100 \    
    --save_steps 100 \    
    --save_total_limit 2 \    
    --logging_steps 10 &


训练完成后,能在nohup.out文件看到最后的 log 显示最佳checkpoint的存放路径best_model_checkpoint: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828

[INFO:swift] best_model_checkpoint: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828
[INFO:swift] images_dir: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/images
[INFO:swift] End time of running main: 2024-03-14 23:33:54.658745

05

部署模型
此时我们获得了一个自己的finetuned model,可以将它部署到自己的机器上使用。以下执行过程参考了swift/docs/source/LLM/VLLM推理加速与部署.md at main · modelscope/swift · GitHub

1)合并lora

由于sft_type=lora,部署需要先将LoRA weights合并到原始模型中:

python tools/merge_lora_weights_to_model.py --model_id_or_path /dir/to/your/base/model --model_revision master --ckpt_dir /dir/to/your/lora/model

其中需要替换 /dir/to/your/base/model 和 /dir/to/your/lora/model为自己本地的路径, /dir/to/your/lora/model为训练最终的best_model_checkpoint。/dir/to/your/base/model 可以通过snapshot_download接口查看,训练时使用的基模型为qwen/Qwen-7B-Chat,则本地路径为:
在这里插入图片描述

也可以直接使用swift export指令完成merge lora

CUDA_VISIBLE_DEVICES=0 swift export \
    --ckpt_dir '/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxx' --merge_lora true

执行后完成后得到merge后的ckpt路径。

[INFO:swift] Saving merged weights...
[INFO:swift] Successfully merged LoRA and saved in /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828-merged.
[INFO:swift] End time of running main: 2024-03-18 10:34:54.307471

2)拉起部署
nohup python -m vllm.entrypoints.openai.api_server --model /dir/to/your/model-merged --trust-remote-code &

需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径。

当nohup.out文件显示以下信息时,表示部署完成
在这里插入图片描述

测试部署:需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径

curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "/dir/to/your/model-merged", "prompt": "San Francisco is a", "max_tokens": 7, "temperature": 0}'

也可以使用swift deploy 进行模型部署

CUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged

这种方式下测试部署和之后的config配置中的"model"需要改为qwen-7b-chat
05

Modelscope-Agent中使用

简单测试

可通过如下代码简单测试模型能力,使用时需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径。

from modelscope_agent.agents.role_play import RolePlay  # NOQA


def test_weather_role():
    role_template = '你扮演一个天气预报助手,你需要查询相应地区的天气,并调用给你的画图工具绘制一张城市的图。'
    llm_config =  {        
        "model_server": "openai",        
        "model": "/dir/to/your/model-merged",        
        "api_base": "http://localhost:8000/v1",        
        "is_chat": True,        
        "is_function_call": False,        
        "support_stream": False    
    }    
    #llm_config = {"model": "qwen-max", "model_server": "dashscope"}
    # input tool name    
    function_list = ['amap_weather']
    
    bot = RolePlay(   
        function_list=function_list, llm=llm_config, instruction=role_template)
        
    response = bot.run('朝阳区天气怎样?')
    
    text = ''    
    for chunk in response:    
        text += chunk    
    print(text)    
    assert isinstance(text, str)
    

test_weather_role()


Agentfabric中使用
  1. 进入agentfabric目录
cd modelscope-agent/apps/agentfabric

  1. 在config/model_config.json文件,新增训好的本地模型
    在这里插入图片描述

再次提醒,如果使用swift deoloy部署模型需要将"model"改为qwen-7b-chat

\3. 设置API key。在以下实践中,会调用wanx image generation

和高德天气 ,需要点击链接按照教程进行注册并手动设置API KEY

export DASHSCOPE_API_KEY=your_api_key
export AMAP_TOKEN=your_api_key

\4. 在agentfabric目录下执行如下命令拉起gradio

GRADIO_SERVER_NAME=0.0.0.0 PYTHONPATH=../../  python app.py

然后在浏览器中输入你 服务器IP:7860打开即可看到如下界面

图片

内置能力选择agent可以调用的API, 这里选择Wanx Image Generation高德天气 点击更新配置,等待配置完成后在右侧的输入栏中即可与Agent交互

图片

在这里插入图片描述

图片

图片

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

😝有需要的小伙伴,可以VX扫描下方二维码免费领取🆓

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

在这里插入图片描述
在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型落地应用案例PPT👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)

在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
img

在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

在这里插入图片描述
👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/875712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

Leetcode 旋转图像

解题思路&#xff1a; 转置矩阵&#xff1a;通过将矩阵的行列互换来实现转置操作。水平翻转矩阵&#xff1a;通过将每行的数据进行对称交换&#xff0c;从而完成90度旋转。 通过这两个步骤&#xff0c;矩阵就会顺时针旋转90度。 class Solution { public:void rotate(vector…

数仓建设:为什么我们的数据容易被业务方质疑?

目录 0 问题背景 1 问题产生的原因 2 问题解决方案 3 小结 数字化建设通关指南专栏原价99&#xff0c;现在活动价39.9&#xff0c;按照阶梯式增长&#xff0c;直到恢复原价 0 问题背景 “ 在数字化建设进程中&#xff0c;无论是处于数据产品的你&#xff0c;或是数据开发的…

【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信

目录 1、模块化语法 1.1 模块化基本认知 1.2 默认导出和导入 1.2.1 在ets下新建tools目录 1.2.2 在tools下新建moduls.ets文件 1.2.3 index.ets 1.3 按需导出和导入 1.4 全部导入 2、自定义组件 -基础 2.1 自定义组件 - 基本使用 2.2 自定义组件 -通用样式 2.2.1 et…

重生奇迹MU 红龙剑士的风采 游戏玩家的记忆

在重生奇迹MU游戏中&#xff0c;剑士是一个老牌职业&#xff0c;而其中红龙剑士更是备受瞩目的角色。红龙剑士选手身着一身红色龙王装&#xff0c;仿佛已经沐浴了敌人的鲜血&#xff0c;是一个经验丰富的剑手。很多老玩家都信任剑士这个职业&#xff0c;并视其为忠实的伙伴&…

运行PaddleOCR报错:requests.exceptions.SSLError: HTTPSconnectionPool……

文章目录 问题描述解决方法 问题描述 在运行以下代码时报错&#xff1a; ocr PaddleOCR(lang"en")解决方法 打开cmd&#xff0c;输入以下命令&#xff0c;查找Python解释器所在路径。 找到 Lib\site-packages\paddleocr\ppocr\utils\network.py&#xff0c;将代码…

对于mapper层代码的理解

昨天在改需求的时候&#xff0c;改了一天&#xff0c;发现关于数据库映射那里出现了问题。 因为我对于后端的mapper层了解的并不深&#xff0c;所以导致我改了一天还没发现问题所在。当我好不容易发现了问题出在mapper层&#xff0c;结果我发现我不会改哈哈哈&#xff0c;还是…

错误: 编码GBK的不可映射字符的解决方法

之前我一直用的eclipse来编写java代码&#xff0c;从来没有出现过这个错误&#xff0c;但是转到VS中后我写个中文注释都没法写&#xff0c;写了就报错&#xff0c;于是开始探索原因 出现这种问题大概率你是在官网下载的JDK&#xff0c;默认是国际版的&#xff0c;他在编译时如果…

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGis接口说明文档)

OSGeo4W简介 更高级的 QGIS 用户应该使用 OSGeo4W 包。此安装程序可以并行安装多个版本的 QGIS&#xff0c;并且还可以进行更高效的更新&#xff0c;因为每个新版本仅下载和安装更改的组件。      OSGeo4W 存储库包含许多来自 OSGeo 项目的软件。包括 QGIS 和所有依赖项&a…

【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)

【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享) 1. 本文摘要 本文实现了一个OpenCV和PyQT5 结合的摄像头视频捕捉和运动检测线程&#xff0c;实现了一款界面软件用于功能演示。主要使用帧差法实现&#xff0c;摄像头捕捉运动到静止的图片&#xff0c;捕捉到的图片可用…

朗迪锋亮相2024年中国国际服务贸易交易会

9月12日至14日&#xff0c;2024中国国际服务贸易交易会&#xff08;以下简称“服贸会”&#xff09;在国家会议中心和首钢园区成功举办。本届服贸会由商务部和北京市人民政府共同主办&#xff0c;继续秉承“全球服务 互惠共享”的宗旨&#xff0c;与参展企业一同聚焦“共享智慧…

高性能编程:无锁队列----MsgQueue代码实践

目录 概述 代码结构 1. 头文件解析 (msgqueue.h) 2. 实现文件解析 (msgqueue.c) 核心功能解析 2.1 创建队列 (msgqueue_create) 2.2 放入消息 (msgqueue_put) 2.3 获取消息 (msgqueue_get) 2.4 交换队列 (__msgqueue_swap) 2.5 阻塞与非阻塞模式 2.6 销毁队列 (msgq…

解决mp框架无法更新null值的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法 前言 在使用mp框架过程中可能会遇到需要将某个字段为null的情况 但是mp自带的方法例如update默认是不支持更新null值的 一、解决方法 主要是这两…

分析图形学示例报告

一、实验任务 二、主要功能模块 三、代码 //自定义坐标系模块 CDC* pDC GetDC();//获得设备上下文 CRect rect;//定义矩形 GetClientRect(&rect);//获得矩形客户去大小 pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系 pDC->SetWindowExt(rect.Width()/4, rect.He…

windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接失败的解决。

1、上一个已成功在安装过程中的图&#xff1a; 2、之前安装过程中错误的图&#xff1a; 3、离线安装解决&#xff1a; 下载.net framework 3.5&#xff0c;然后解压后&#xff0c;选择指定备用源路径&#xff0c;然后选择.net安装包所在目录&#xff1a; 只要指定上面全路径就…

Kubernetes 常用指令2

kubernetes 常用命 令 1. 编写 yaml 文件 2. kubectl create 通过配置文件名或标准输入创建一个集群资源对象&#xff0c;支 持 json 和 yaml 格式的文件 语法&#xff1a; kubectl create -f 文件名 kubectl create deployment 资源名 --image镜像名 kubectl create deplo…

Halcon 深度学习 分类预处理

文章目录 read_dl_dataset_classification 产生一个深度学习数据集算子split_dl_dataset 将样本分为训练、验证和测试子集create_dl_preprocess_param 使用预处理参数创建字典preprocess_dl_dataset 预处理DLDataset中声明的整个数据集write_dict 写入字典文件find_dl_samples …

Java wrapperr打包springboot项目到linux和Windows

Java wrapper打包springboot项目到linux和Windows 1 Java wrapper 说明2 linux的安装步骤2.1 解压 创建目录2.2 复制文件2.3 配置文件2.4 启动 3 windows3.1 配置文件3.2 复制文件3.3 启动 1 Java wrapper 说明 前提&#xff1a; 一定要有Java环境&#xff08;我使用的是jdk1.8…

C和指针:指针

内存和地址 程序视角看内存是一个大的字节数组&#xff0c;每个字节包含8个位&#xff0c;可以存储无符号值0至255,或有符号值-128至127。 多个字节可以合成一个字&#xff0c;许多机器以字为单位存储整数&#xff0c;每个字一般由2个或4个字节组成。 由于它们包含了更多的位&…

油耳用什么掏耳朵比较好?可视挖耳勺推荐平价

掏耳朵是一个轻松又舒服的感觉&#xff0c;很多人就会用棉签和普通耳勺越掏越进&#xff0c;在盲掏的过程中容易弄伤耳膜。所以我们在掏耳时要选好工具。市面上的智能可视挖耳勺&#xff0c;顶端带有摄像头&#xff0c;可以通过清楚的观察到耳道中的情况。但现在市面上关于可视…