当前位置: 首页 > news >正文

对 LLM 工具使用进行统一

我们为 LLM 确立了一个跨模型的 统一工具调用 API。有了它,你就可以在不同的模型上使用相同的代码,在 [Mistral] 或 [Llama]) 等模型间自由切换,而无需或很少需要根据模型更改工具调用相关的代码。此外,我们还在 transformers 中新增了一些实用接口以使工具调用更丝滑,我们还为此配备了 [完整的文档]以及端到端工具使用的 [示例]。我们会持续添加更多的模型支持。

引言

LLM 工具使用这个功能很有意思 —— 每个人都认为它很棒,但大多数人从未亲测过。它的概念很简单: 你给 LLM 提供一些工具 (即: 可调用的函数),LLM 在响应用户的查询的过程中可自主判断、自行调用它们。比方说,你给它一个计算器,这样它就不必依赖其自身不靠谱的算术能力; 你还可以让它上网搜索或查看你的日历,或者授予它访问公司数据库的权限 (只读!),以便它可以提取相应信息或搜索技术文档。

工具调用使得 LLM 可以突破许多自身的核心限制。很多 LLM 口齿伶俐、健谈,但涉及到计算和事实时往往不够精确,并且对小众话题的具体细节不甚了解。它们还不知道训练数据截止日期之后发生的任何事情。它们是通才,但除了你在系统消息中提供的信息之外,它们在开始聊天时对你或聊天背景一无所知。工具使它们能够获取结构化的、专门的、相关的、最新的信息,这些信息可以帮助其成为真正有帮助的合作伙伴,而不仅仅是令人着迷的新奇玩意儿。

然而,当你开始真正尝试工具使用时,问题出现了!文档很少且互相之间不一致,甚至矛盾 —— 对于闭源 API 和开放模型无不如此!尽管工具使用在理论上很简单,但在实践中却常常成为一场噩梦: 如何将工具传递给模型?如何确保工具提示与其训练时使用的格式相匹配?当模型调用工具时,如何将其合并到聊天提示中?如果你曾尝试过动手实现工具使用,你可能会发现这些问题出奇棘手,而且很多时候文档并不完善,有时甚至会帮倒忙。

更糟糕的是,不同模型的工具使用的实现可能迥异。即使在定义可用工具集这件最基本的事情上,一些模型厂商用的是 JSON 模式,而另一些模型厂商则希望用 Python 函数头。即使那些希望使用 JSON 模式的人,细节上也常常会有所不同,因此造成了巨大的 API 不兼容性。看!用户被摁在地板上疯狂摩擦,同时内心困惑不已。

为此,我们能做些什么呢?

聊天模板

Hugging Face Cinematic Universe 的忠​​粉会记得,开源社区过去在 聊天模型 方面也面临过类似的挑战。聊天模型使用 <|start_of_user_turn|><|end_of_message|> 等控制词元来让模型知道聊天中发生了什么,但不同的模型训练时使用的控制词元完全不同,这意味着用户需要为他们用的模型分别编写特定的格式化代码。这在当时是一个非常头疼的问题。

最终的解决方案是 聊天模板 - 即,模型会自带一个小小的 [Jinja]模板,它能用正确的格式来规范每个模型的聊天格式和控制词元。聊天模板意味着用户能用通用的、与模型无关的方式编写聊天,并信任 Jinja 模板来处理模型格式相关的事宜。

基于此,支持工具使用的一个显而易见的方法就是扩展聊天模板的功能以支持工具。这正是我们所做的,但工具给模板方案带来了许多新的挑战。我们来看看这些挑战以及我们是如何解决它们的吧。希望在此过程中,你能够更深入地了解该方案的工作原理以及如何更好利用它。

将工具传给聊天模板

在设计工具使用 API 时,首要需求是定义工具并将其传递给聊天模板的方式应该直观。我们发现大多数用户的流程是: 首先编写工具函数,然后弄清楚如何据其生成工具定义并将其传递给模型。一个自然而然的想法是: 如果用户可以简单地将函数直接传给聊天模板并让它为他们生成工具定义那就好了。

但问题来了,“传函数”的方式与使用的编程语言极度相关,很多人是通过 [JavaScript] 或 [Rust]而不是 Python 与聊天模型交互的。因此,我们找到了一个折衷方案,我们认为它可以两全其美: 聊天模板将工具定义为 JSON 格式,但如果你传 Python 函数给模板,我们会将其自动转换为 JSON 格式 这就产生了一个漂亮、干净的 API:

def get_current_temperature(location: str):"""Gets the temperature at a given location.Args:location: The location to get the temperature for"""return 22.0 # bug: Sometimes the temperature is not 22. low prioritytools = [get_current_temperature]chat = [{"role": "user", "content": "Hey, what's the weather like in Paris right now?"}
]tool_prompt = tokenizer.apply_chat_template(chat,tools=tools,add_generation_prompt=True,return_tensors="pt"
)

apply_chat_template 内部, get_current_temperature 函数会被转换成完整的 JSON 格式。想查看生成的格式,可以调用 get_json_schema 接口:

>>> from transformers.utils import get_json_schema>>> get_json_schema(get_current_weather)
{"type": "function","function": {"name": "get_current_temperature","description": "Gets the temperature at a given location.","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The location to get the temperature for"}},"required": ["location"]}}
}

如果你更喜欢手动控制或者使用 Python 以外的语言进行编码,则可以将工具组织成 JSON 格式直接传给模板。但是,当你使用 Python 时,你可以无需直接处理 JSON 格式。你仅需使用清晰的 函数名、 准确的 类型提示 以及完整的含 参数文档字符串文档字符串 来定义你的工具函数,所有这些都将用于生成模板所需的 JSON 格式。其实,这些要求本来就已是 Python 最佳实践,你本应遵守,如果你之前已经遵守了,那么无需更多额外的工作,你的函数已经可以用作工具了!

请记住: 无论是从文档字符串和类型提示生成还是手动生成,JSON 格式的准确性,对于模型了解如何使用工具都至关重要。模型永远不会看到该函数的实现代码,只会看到 JSON 格式,因此它们越清晰、越准确越好!

在聊天中调用工具

用户 (以及模型文档😬) 经常忽略的一个细节是,当模型调用工具时,实际上需要将 两条 消息添加到聊天历史记录中。第一条消息是模型 调用 工具的信息,第二条消息是 工具的响应,即被调用函数的输出。

工具调用和工具响应都是必要的 - 请记住,模型只知道聊天历史记录中的内容,如果它看不到它所作的调用以及传递的参数,它将无法理解工具的响应。 22 本身并没有提供太多信息,但如果模型知道它前面的消息是 get_current_temperature("Paris, France") ,则会非常有帮助。

不同模型厂商对此的处理方式迥异,而我们将工具调用标准化为 聊天消息中的一个域,如下所示:

message = {"role": "assistant","tool_calls": [{"type": "function","function": {"name": "get_current_temperature","arguments": {"location": "Paris, France"}}}]
}
chat.append(message)

在聊天中添加工具响应

工具响应要简单得多,尤其是当工具仅返回单个字符串或数字时。

message = {"role": "tool","name": "get_current_temperature","content": "22.0"
}
chat.append(message)

实操

我们把上述代码串联起来搭建一个完整的工具使用示例。如果你想在自己的项目中使用工具,我们建议你尝试一下我们的代码 - 尝试自己运行它,添加或删除工具,换个模型并调整细节以感受整个系统。当需要在软件中实现工具使用时,这种熟悉会让事情变得更加容易!为了让它更容易,我们还提供了这个示例的 [notebook]。

首先是设置模型,我们使用 Hermes-2-Pro-Llama-3-8B ,因为它尺寸小、功能强大、自由使用,且支持工具调用。但也别忘了,更大的模型,可能会在复杂任务上获得更好的结果!

import torch
from transformers import AutoTokenizer, AutoModelForCausalLMcheckpoint = "NousResearch/Hermes-2-Pro-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, torch_dtype=torch.bfloat16, device_map="auto")

接下来,我们设置要使用的工具及聊天消息。我们继续使用上文的 get_current_Temperature :

def get_current_temperature(location: str):"""Gets the temperature at a given location.Args:location: The location to get the temperature for, in the format "city, country""""return 22.0 # bug: Sometimes the temperature is not 22. low priority to fix thotools = [get_current_temperature]chat = [{"role": "user", "content": "Hey, what's the weather like in Paris right now?"}
]tool_prompt = tokenizer.apply_chat_template(chat,tools=tools,return_tensors="pt",return_dict=True,add_generation_prompt=True,
)
tool_prompt = tool_prompt.to(model.device)

模型可用工具设定完后,就需要模型生成对用户查询的响应:

out = model.generate(**tool_prompt, max_new_tokens=128)
generated_text = out[0, tool_prompt['input_ids'].shape[1]:]print(tokenizer.decode(generated_text))

我们得到:

<tool_call>
{"arguments": {"location": "Paris, France"}, "name": "get_current_temperature"}
</tool_call><|im_end|>

模型请求使用一个工具!请注意它正确推断出应该传递参数 “Paris, France” 而不仅仅是 “Paris”,这是因为它遵循了函数文档字符串推荐的格式。

但模型并没有真正以编程方式调用这些工具,就像所有语言模型一样,它只是生成文本。作为程序员,你需要接受模型的请求并调用该函数。首先,我们将模型的工具请求添加到聊天中。

请注意,此步骤可能需要一些手动处理 - 尽管你应始终按照以下格式将请求添加到聊天中,但模型调用工具的请求文本 (如 <tool_call> 标签) 在不同模型之间可能有所不同。通常,它非常直观,但请记住,在你自己的代码中尝试此操作时,你可能需要一些特定于模型的 json.loads()re.search()

message = {"role": "assistant","tool_calls": [{"type": "function","function": {"name": "get_current_temperature","arguments": {"location": "Paris, France"}}}]
}
chat.append(message)

现在,我们真正在 Python 代码中调用该工具,并将其响应添加到聊天中:

message = {"role": "tool","name": "get_current_temperature","content": "22.0"
}
chat.append(message)

然后,就像之前所做的那样,我们按格式更新聊天信息并将其传给模型,以便它可以在对话中使用工具响应:

tool_prompt = tokenizer.apply_chat_template(chat,tools=tools,return_tensors="pt",return_dict=True,add_generation_prompt=True,
)
tool_prompt = tool_prompt.to(model.device)out = model.generate(**tool_prompt, max_new_tokens=128)
generated_text = out[0, tool_prompt['input_ids'].shape[1]:]print(tokenizer.decode(generated_text))

最后,我们得到对用户的最终响应,该响应是基于中间工具调用步骤中获得的信息构建的:

The current temperature in Paris is 22.0 degrees Celsius. Enjoy your day!<|im_end|>

令人遗憾的响应格式不统一

在上面的例子中,你可能已经发现,尽管聊天模板可以帮助隐藏模型之间在聊天格式以及工具定义格式上的差异,但它仍有未尽之处。当模型发出工具调用请求时,其用的还是自己的格式,因此需要你手动解析它,然后才能以通用格式将其添加到聊天中。值得庆幸的是,大多数格式都非常直观,因此应该仅需几行 json.loads() ,最坏情况下估计也就是一个简单的 re.search() 就可以创建你需要的工具调用字典。

尽管如此,这是最后遗留下来的“不统一”尾巴。我们对如何解决这个问题有一些想法,但尚未成熟,“撸起袖子加油干”吧!

总结

尽管还留了一点小尾巴,但我们认为相比以前,情况已经有了很大的改进,之前的工具调用方式分散、混乱且记录不足。我们希望我们为统一作的努力可以让开源开发人员更轻松地在他们的项目中使用工具,以通过一系列令人惊叹的新工具来增强强大的 LLM。从 [Hermes-2-Pro-8B]等较小模型到 [Mistral-Large]、[Command-R-Plus]或 [Llama-3.1-405B]等最先进的巨型庞然大物,越来越多的前沿 LLM 已经支持工具使用。我们认为工具将成为下一波 LLM 产品不可或缺的一部分,我们希望我们做的这些改进能让你更轻松地在自己的项目中使用它们。祝你好运!


在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

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

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

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

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

相关文章:

对 LLM 工具使用进行统一

我们为 LLM 确立了一个跨模型的 统一工具调用 API。有了它&#xff0c;你就可以在不同的模型上使用相同的代码&#xff0c;在 [Mistral] 或 [Llama]) 等模型间自由切换&#xff0c;而无需或很少需要根据模型更改工具调用相关的代码。此外&#xff0c;我们还在 transformers 中新…...

webpack/vite的区别

Webpack和Vite都是前端开发中常用的构建工具&#xff0c;它们在多个方面存在显著的区别。以下是对这两个构建工具的详细比较&#xff1a; 一、基础概念与定位 Webpack Webpack是一个现代JavaScript应用程序的静态模块打包器&#xff08;module bundler&#xff09;。它允许开发…...

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…...

使用Python实现无人机路径规划的灰狼优化算法

目录 使用 Python 实现无人机路径规划的灰狼优化算法引言1. 灰狼优化算法概述1.1 定义1.2 算法原理1.3 灰狼的狩猎策略1.4 算法步骤 2. Python 中的灰狼优化算法实现2.1 安装必要的库2.2 定义类2.2.1 灰狼类2.2.2 群体类2.2.3 路径规划类 2.3 示例程序 3. 灰狼优化算法的优缺点…...

理解递归和回溯

文章目录 什么是递归回溯 什么是递归 回溯 //使用递归回溯来给小球找路//说明//1. map 表示地图//2. i,j 表示从地图的哪个位置开始出发 (1,1)//3. 如果小球能到 map[6][5] 位置&#xff0c;则说明通路找到.//4. 约定&#xff1a; 当map[i][j] 为 0 表示该点没有走过 当为 1 表…...

知识图谱入门——3:工具分类与对比(知识建模工具:Protégé、 知识抽取工具:DeepDive、知识存储工具:Neo4j)

在知识图谱构建的过程中&#xff0c;针对不同的任务和需求&#xff0c;我们可以使用多种工具。为了帮助你快速选择合适的工具&#xff0c;本文将常用工具按类别进行分类介绍&#xff0c;并对比其优缺点&#xff0c;方便你在不同场景中做出最佳选择。 文章目录 1. 知识建模工具…...

使用指标进行量化交易时,有哪些需要注意的风险点呢

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

数据结构阶段测试2的一点小补充

数据结构阶段测试2的一点小补充 1.已知⼩根堆为8,15,10,21,34,16,12&#xff0c;删除关键字8之后需重建堆&#xff0c;最后的叶⼦ 节点为() A. 34 B. 21 C. 16 D. 12 解题思路 向下调整算法删除堆顶元素 &#x1f4a1; 答案&#xff1a;C 删除堆顶元素的思路&#xff1a; …...

量化交易里面的挂单成交率大概是多少呢

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

【Android 14源码分析】Activity启动流程-3

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…...

Javascript客户端时间与服务器时间

在Java代码中使用new Date()&#xff0c;获取的是本机时间&#xff1b; 但是在Javascript 中使用new Date()&#xff0c;获取的却是访问该页面的客户端时间。 这样&#xff0c;就可能会出现一个问题&#xff1a;我的电脑时间比正常时间要快&#xff0c;我访问一个页面&#x…...

系统架构设计师教程 第11章 11.4 边缘计算概述 笔记

11.4 边缘计算概述 ★★☆☆☆ 11.4.1 边缘计算概念 边缘计算将数据的处理、应用程序的运行甚至一些功能服务的实现&#xff0c;由 网络中心下放到网络边缘的节点上。在网络边缘侧的智能网关上就近采集并且处理数据&#xff0c;不需要上传原生数据。 11.4.2 边缘计算的定义 1…...

CSS全解析

文章目录 CSS全解析一、CSS是什么二、基本语法规范三、引入方式&#xff08;一&#xff09;内部样式表&#xff08;二&#xff09;行内样式表&#xff08;三&#xff09;外部样式 四、代码风格&#xff08;一&#xff09;样式格式&#xff08;二&#xff09;样式大小写&#xf…...

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…...

CSS3渐变

一、线性渐变 通过background-image: linear-gradient(...)设置线性渐变 语法&#xff1a; linear-gradient(direction,color1,color2, . . ) direction&#xff1a;渐变方向&#xff0c;默认从上到下&#xff0c;可选值&#xff1a; 简单选取&#xff1a; ① to right&…...

Emissive CEO Fabien Barati谈《消失的法老》背后的故事:XR大空间体验的创新与未来

在最近的一次播客访谈中,虚拟现实之声(Voices of VR)的主持人Kent Bye与Emissive公司的联合创始人兼CEO Fabien Barati进行了深入交流。Emissive是全球顶级的VR大空间体验制作商之一,以其沉浸式探险项目如《永恒的巴黎圣母院》和《胡夫地平线》而闻名。以下是这次访谈的核心…...

mysql设置表的某一个字段每天定时清零

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

实例分割、语义分割和 SAM(Segment Anything Model)

实例分割、语义分割和 SAM&#xff08;Segment Anything Model&#xff09; 都是图像处理中的重要技术&#xff0c;它们的目标是通过分割图像中的不同对象或区域来帮助识别和分析图像&#xff0c;但它们的工作方式和适用场景各有不同。 1. 语义分割&#xff08;Semantic Segme…...

深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)

前言 前几天在看论文&#xff0c;打算复现&#xff0c;论文用到了LSTM&#xff0c;故这一篇文章是小编学LSTM模型的学习笔记&#xff1b;LSTM感觉很复杂&#xff0c;但是结合代码构建神经网络&#xff0c;又感觉还行&#xff1b;本次学习的案例数据来源于GitHub&#xff0c;在…...

《精通开关电源设计》笔记一

重点 效率 纹波 环路响应 尺寸&#xff0c;从静态到动态的研究方法&#xff0c;假设开关电源稳态运行&#xff0c;以电感为中心&#xff0c;根据半导体器件(mos管或二极管)分段分析电路的状态&#xff0c;工具有电路原理和能量守恒 影响效率的主要是开关损耗&#xff0c;所以…...

QLoRA代码实战

QLoRA原理参考&#xff1a; BiliBili&#xff1a;4bit量化与QLoRA模型训练 zhihu&#xff1a;QLoRA&#xff08;Quantized LoRA&#xff09;详解 下载llama3-8b模型 from modelscope import snapshot_download model_dir snapshot_download(LLM-Research/Meta-Llama-3-8B-In…...

pyqt QGraphicsView 以鼠标为中心进行缩放

注意几个关键点&#xff1a; 1. 初始化 class CustomGraphicsView(QGraphicsView):def __init__(self, parentNone):super(CustomGraphicsView, self).__init__(parent)self.scene QGraphicsScene()self.setScene(self.scene)self.setGeometry(0, 0, 1024, 600)# 以下初始化…...

FPGA-Vivado-IP核-逻辑分析仪(ILA)

ILA IP核 背景介绍 在用FPGA做工程项目时&#xff0c;当Verilog代码写好&#xff0c;我们需要对代码里面的一些关键信号进行上板验证查看。首先&#xff0c;我们可以把需要查看的这些关键信号引出来&#xff0c;接好线通过示波器进行实时监测&#xff0c;但这会用到大量的线材…...

基于webComponents的纯原生前端框架

我本人的个人开发web前端前框架xui&#xff0c;正在开发中&#xff0c;业已完成50%的核心开发工作&#xff0c;并且在开发过程中逐渐完善. 目前框架未采用任何和市面上框架模式&#xff0c;没有打包过程&#xff0c;实现真实的开箱即用。 当然在开发过程中也会发现没有打包工…...

OpenCV-背景建模

文章目录 一、背景建模的目的二、背景建模的方法及原理三、背景建模实现四、总结 OpenCV中的背景建模是一种在计算机视觉中从视频序列中提取出静态背景的技术。以下是对OpenCV背景建模的详细解释&#xff1a; 一、背景建模的目的 背景建模的主要目标是将动态的前景对象与静态的…...

一个简单的摄像头应用程序6

主要改进点&#xff1a; 使用 ThreadPoolExecutor 管理多线程&#xff1a; 使用 concurrent.futures.ThreadPoolExecutor 来管理多线程&#xff0c;这样可以更高效地处理图像。 在 main 函数中创建一个 ThreadPoolExecutor&#xff0c;并在每个循环中提交图像处理任务。 减少…...

Pikachu-目录遍历

目录遍历&#xff0c;跟不安全文件上传下载有差不多&#xff1b; 访问 jarheads.php 、truman.php 都是通过 get 请求&#xff0c;往title 参数传参&#xff1b; 在后台&#xff0c;可以看到 jarheads.php 、truman.php所在目录&#xff1a; /var/www/html/vul/dir/soup 图片…...

用Python实现基于Flask的简单Web应用:从零开始构建个人博客

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 前言 在现代Web开发中&#xff0c;Python因其简洁、易用以及丰富的库生态系统&#xff0c;成为了许多开发者的首选编程语言。Flask作为一个轻量级的Python Web框架&#xff0c;以其简洁和灵活性深受开…...

IDEA的lombok插件不生效了?!!

记录一下&#xff0c;防止找不到解决方案&#xff0c;已经遇到好几次了 前面啰嗦的多&#xff0c;可以直接跳到末尾的解决方法&#xff0c;点击一下 问题现场情况 排查过程 确认引入的依赖正常 —》&#x1f197; idea 是否安装了lombok插件 --》&#x1f197; 貌似没有问题…...

CSP-S 2022 T1假期计划

CSP-S 2022 T1假期计划 先思考暴力做法&#xff0c;题目需要找到四个不相同的景点&#xff0c;那我们就枚举这四个景点&#xff0c;判断它们之间的距离是否符合条件&#xff0c;条件是任意两个点之间的距离是否大于 k k k&#xff0c;所以我们需要求出任意两点之间的距离。常用…...