LLM之Agent初探
Agent是什么?
Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。
Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。如果Copilot是副驾驶,那么Agent就是主驾驶。
自主Agent是由人工智能驱动的程序,当给定目标时,它们能够自己创建任务、完成任务、创建新任务、重新确定任务列表的优先级、完成新的顶级任务,并循环直到达到目标。
最直观的公式:Agent = LLM+Planning+Feedback+Tool use
Agent决策流程
感知(Perception)→ 规划(Planning)→ 行动(Action)
-
• 感知(Perception)是指Agent从环境中收集信息并从中提取相关知识的能力。
-
• 规划(Planning)是指Agent为了某一目标而作出的决策过程。
-
• 行动(Action)是指基于环境和规划做出的动作。
Agent通过感知从环境中收集信息并提取相关知识。然后通过规划为了达到某个目标做出决策。最后,通过行动基于环境和规划做出具体的动作。Policy是Agent做出行动的核心决策,而行动又为进一步感知提供了观察的前提和基础,形成了一个自主的闭环学习过程。
人是如何做事的?
在工作中,我们通常会用到PDCA思维模型。基于PDCA模型,我们可以将完成一项任务进行拆解,按照作出计划、计划实施、检查实施效果,然后将成功的纳入标准,不成功的留待下一循环去解决。目前,这是人们高效完成一项任务非常成功的经验总结。
请添加图片描述
如何让LLM替代人去做事?
要让LLM替代人去做事,我们可以基于PDCA模型进行 规划、执行、评估和反思。
规划能力(Plan)-> 分解任务:Agent大脑把大的任务拆解为更小的,可管理的子任务,这对有效的、可控的处理好大的复杂的任务效果很好。
执行能力(Done)-> 使用工具:Agent能学习到在模型内部知识不够时(比如:在pre-train时不存在,且之后没法改变的模型weights)去调用外部API,比如:获取实时的信息、执行代码的能力、访问专有的信息知识库等等。这是一个典型的平台+工具的场景,我们要有生态意识,即我们构建平台以及一些必要的工具,然后大力吸引其他厂商提供更多的组件工具,形成生态。
评估能力(Check)-> 确认执行结果:Agent要能在任务正常执行后判断产出物是否符合目标,在发生异常时要能对异常进行分类(危害等级),对异常进行定位(哪个子任务产生的错误),对异常进行原因分析(什么导致的异常)。
反思能力(Adjust)-> 基于评估结果重新规划:Agent要能在产出物符合目标时及时结束任务,是整个流程最核心的部分;同时,进行归因分析总结导致成果的主要因素,另外,Agent要能在发生异常或产出物不符合目标时给出应对措施,并重新进行规划开启再循环过程。
下面,来看几个具体的案例
让LLM能够获取当前时间
首先,我们定义一个获取当前时间的tool
from langchain.tools import Tool def get_time(input=""): return datetime.datetime.now() #定义获取当前时间
time_tool = Tool( name='get current time', func= get_time, description="用来获取当前时间. input should be 'time'"""
)
name: 工具名称 func: 工具的实现 description: 工具的描述,一定要是准确的描述,该部分会加入到LLM的prompt中,若描述不准确,LLM可能无法准确调用
我们将langchain中内置的prompt打印出来看看
Respond to the human as helpfully and accurately as possible. You have access to the following tools: get current time: 用来获取当前时间. input should be 'time', args: {{'tool_input': {{'type': 'string'}}}} Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). Valid "action" values: "Final Answer" or get current time Provide only ONE action per $JSON_BLOB, as shown: ```{{ "action": $TOOL_NAME, "action_input": $INPUT }} ```Follow this format: Question: input question to answer Thought: consider previous and subsequent steps Action: ```$JSON_BLOB ```Observation: action result ... (repeat Thought/Action/Observation N times) Thought: I know what to respond Action: ```{{ "action": "Final Answer", "action_input": "Final response to human" }} ```Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:. Thought:
从以上prompt可以看出,我们定义好的获取当前时间的工具函数,也被包裹在里面,并且,他还帮我们生成了一个输入参数的格式限制prompt:args: {{‘tool_input’: {{‘type’: ‘string’}}}}
我们接着看:
Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). Valid "action" values: "Final Answer" or get current time Provide only ONE action per $JSON_BLOB, as shown: ```{{ "action": $TOOL_NAME, "action_input": $INPUT }} ```
这段prompt要求LLM生成的action需要是一个jsonb的格式,并且包含两个key:action
和action_input
,分别对应工具名和工具的输入,并且给了一个样例。
并且,有效的action不仅包含了get current time
,还多了个Final Answer
我们来用一个实际的问题试试:
question = "现在几点?" result = agent.run(question)
print(result)
输出
当前时间是2024年01月02日11点12分01秒。
对比下未使用tool的输出:
我无法回答这个问题,因为我没有实时访问实际的时间或日期。我是根据我的训练数据提供信息的。
可见,当不使用tool时,LLM是无法知道当前时间的
为了更容易理解Agent是如何工作的,我打印出了中间过程的日志:
Thought: 需要使用工具获取当前时间 Action: ```{ "action": "get current time", "action_input": { "type": "string" } } ```Observation: 2024-01-02 11:44:16.900356 我现在知道了当前时间 Action: ```{ "action": "Final Answer", "action_input": "当前时间是2024年01月02日11点44分16秒。" } ```
首先,LLM先思考应该调用哪个工具,并且知道应该调用get current time
,且给出了输入参数的类型
接着,拿到了LLM输出的结果,即:Observation: 2024-01-02 11:44:16.900356
最后,LLM知道了答案,再次调用工具:Final Answer
输出答案
让LLM拥有计算器的功能
langchain内置了许多工具,使用load_tools
函数即可加载,这次我们不自己定义tool了,我们使用langchain内置的工具试试。
tools = load_tools(tool_names=["llm-math"], llm=llm) tools.append(time_tool)
看看llm-math的定义
def _get_llm_math(llm: BaseLanguageModel) -> BaseTool: return Tool( name="Calculator", description="Useful for when you need to answer questions about math.", func=LLMMathChain.from_llm(llm=llm).run, coroutine=LLMMathChain.from_llm(llm=llm).arun, )
我们看看此时的prompt
Respond to the human as helpfully and accurately as possible. You have access to the following tools: Calculator: Useful for when you need to answer questions about math., args: {{'tool_input': {{'type': 'string'}}}} get current time: 用来获取当前时间. input should be 'now', args: {{'tool_input': {{'type': 'string'}}}} Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). Valid "action" values: "Final Answer" or Calculator, get current time Provide only ONE action per $JSON_BLOB, as shown: ```{{ "action": $TOOL_NAME, "action_input": $INPUT }} ```Follow this format: Question: input question to answer Thought: consider previous and subsequent steps Action: ```$JSON_BLOB ```Observation: action result ... (repeat Thought/Action/Observation N times) Thought: I know what to respond Action: ```{{ "action": "Final Answer", "action_input": "Final response to human" }} ```Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:. Thought:
相比上一个例子,多了一个名叫Calculator的prompt: Calculator: Useful for when you need to answer questions about math., args: {{'tool_input': {{'type': 'string'}}}}
实际上就是多了个tool name 和 tool description
来试试效果
question = "789*324353等于多少?" result = agent.run(question)
print(result)
输出
255914517
对比下未使用tool的输出:
789 * 324353 = 324353 * (700 + 80 + 9) = 324353 * 700 + 324353 * 80 + 324353 * 9 = 227047100 + 25948240 + 2921177 = 252995340 + 2921177 = 255916517
未使用tool虽然没有获得正确答案,但好在知道将数学问题分解,但我这里使用的是qwen-72b-chat-int4,要是小一点的模型,就不一定有这样的效果了。
以下是baichuan2-13b-chat的输出
789乘以324353等于259553427。
让LLM获取实时天气
定义tool:
China-City-List-latest.csv
文件从(https://github.com/qwd/LocationList/blob/master/China-City-List-latest.csv下载
和风天气API key需要在https://dev.qweather.com注册获取,自行google
def getLocationId(city): d = collections.defaultdict(str) try: df = pd.read_csv("./data/datasets/virus/China-City-List-latest.csv", encoding='utf-8') except Exception as e: print(e) for i, row in df.iterrows(): d[row['Location_Name_ZH']] = row['Location_ID'] return d[city] if city in d else '' def get_weather(location): key = "你的和风天气API key" id = getLocationId(location) if not id: return "没有这个城市" base_url = 'https://devapi.qweather.com/v7/weather/now?' params = {'location': id, 'key': key, 'lang': 'zh'} response = requests.get(base_url, params=params) data = response.json() if data["code"] != "200": return "没有这个城市的天气情况" return get_weather_info(data) def get_weather_info(info): if info["code"] != "200": return "没有这个城市的天气情况" # result = f'现在天气{info["hourly"][0]["text"]},温度 {info["hourly"][0]["temp"]} 度, 未来 24 小时天气{info["hourly"][-1]["text"]},温度 {info["hourly"][-1]["temp"]} 度。' result = f"""
现在天气: {info["now"]["text"]}
温度: {info["now"]["temp"]} 摄氏度
风向: {info["now"]["windDir"]}
风力等级: {info["now"]["windScale"]}
风速: {info["now"]["windSpeed"]} 公里/小时
""" return result weather_tool = Tool( name='get current weather', func= get_weather, description="用来获取当地的天气信息,输入应该是城市名称"""
)
来试试效果
question = "杭州今天能穿短袖吗?" result = agent.run(question)
print(result)
输出
不建议穿短袖,今天杭州有霾,温度为10摄氏度。
对比下未使用tool的输出:
作为一个语言模型,我无法获取实时的天气信息。请您自行查询杭州当前的天气情况,并根据气温和个人体质决定是否穿短袖。
以上工具函数,输入参数均只有一个,接下来看看,当输入参数有多个时,应如何处理
tool有多个输入参数的场景
定义tool:
class FutureWeatherInput(BaseModel): location: str = Field(description="城市名称") date: str = Field(description="日期,格式:yyyy-mm-dd,如:2021-11-15") def get_future_weather(location, date): key = "你的和风天气API key" id = getLocationId(location) if not id: return "没有这个城市" base_url = 'https://devapi.qweather.com/v7/weather/7d?' params = {'location': id, 'key': key, 'lang': 'zh'} response = requests.get(base_url, params=params) data = response.json() if data["code"] != "200": return "没有这个城市的天气情况" result = {} daily = data["daily"] for item in daily: fxDate = item["fxDate"] weather_text = f"""
天气: {item["textDay"]}
最高温度: {item["tempMax"]} 摄氏度
最低温度: {item["tempMin"]} 摄氏度
风向: {item["windDirDay"]}
风力等级: {item["windScaleDay"]}
风速: {item["windSpeedDay"]} 公里/小时
""" result[fxDate] = weather_text return result[date] future_weather_tool = StructuredTool( name='get future weather', func= get_future_weather, description="用来获取当地今天和未来六天的天气信息。""", args_schema=FutureWeatherInput
)
当tool需要多个输入参数时,我们不再使用Tool类,而使用StructuredTool类,它的定义如下(从langchain源码里可以找到)
class StructuredTool(BaseTool): """Tool that can operate on any number of inputs.""" description: str = "" args_schema: Type[BaseModel] = Field(..., description="The tool schema.") """The input arguments' schema.""" func: Optional[Callable[..., Any]] """The function to run when the tool is called.""" coroutine: Optional[Callable[..., Awaitable[Any]]] = None """The asynchronous version of the function."""
且通过pydantic的BaseModel来约束输入,对输入参数的description也是必要的,因为该description也会传到prompt中
Calculator: Useful for when you need to answer questions about math., args: {{'tool_input': {{'type': 'string'}}}}
get current time: 用来获取当前时间. input should be 'now'。当需要获取今天、明天、后天等的日期时,你应该调用此函数获取今天的日期, args: {{'tool_input': {{'type': 'string'}}}}
get current weather: 用来获取当地当天的天气信息,输入应该是城市名称, args: {{'tool_input': {{'type': 'string'}}}}
get future weather: 用来获取当地今天和未来六天的天气信息。, args: {{'location': {{'title': 'Location', 'description': '城市名称', 'type': 'string'}}, 'date': {{'title': 'Date', 'description': '日期,格式:yyyy-mm-dd,如:2021-11-15', 'type': 'string'}}}} Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). Valid "action" values: "Final Answer" or Calculator, get current time, get current weather, get future weather
来试试效果
question = "今天是几号?明天准备去杭州旅游,能穿短袖吗?" result = agent.run(question)
print(result)
输出
明天杭州的天气预报为晴,最高温度为13摄氏度,最低温度为2摄氏度,建议携带一些保暖衣物。
让LLM实现联网搜索
定义tool:
def get_internet_content(query): params = { "engine": "baidu", "q": query, "api_key": "你的 Serpapi key" } search = BaiduSearch(params) result = search.get_json()["organic_results"][0]["snippet"] return result baidu_search_tool = Tool( name='百度搜索', func= get_internet_content, description="用来从互联网上获取当前时事信息,输入应该是搜索query"""
)
Serpapi key需要你自行注册获取,地址https://serpapi.com/
来试试效果
question = "小米su7什么时候发布" result = agent.run(question)
print(result)
输出
小米su7预计将于2024年上半年量产上市。
Agent之所以能回答该问题,是因为我们使用百度搜索获取了小米su7 发布日期
的相关信息,LLM再基于该信息总结答案,相当于外挂了一个知识库,只不过这个知识库不再是我们本地的数据库,而是百度搜索
到这里你会发现,其实不同的工具,就是不同的函数而已,要想Agent能够适配自己的业务场景,只是把这些函数换成了自己业务相关的函数或接口。
以上LLM使用的均是qwen-72b-chat-int4,同时也对比过baichuan2-13b-chat、yi-34b-chat,qwen-14b-chat,其中baichuan2-13b-chat效果最差,基本无法理解如何调用tool,yi-34b-chat不如qwen-14b-chat,qwen-72b-chat-int4效果最好,个人猜测主要原因是因为qwen系列的模型在专门的工具调用数据集上训练过,因此效果要比其他模型要好,且官方开源了一个大模型工具调用数据集,地址: MSAgent-Bench大模型工具调用数据集
完整代码
import collections
import random
import requests
import datetime
import pandas as pd
from langchain.tools import Tool, StructuredTool
from langchain.agents import initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.agents import load_tools
from langchain.agents import AgentType from pydantic import BaseModel, Field
from serpapi.baidu_search import BaiduSearch def getLocationId(city): d = collections.defaultdict(str) try: df = pd.read_csv("./data/datasets/virus/China-City-List-latest.csv", encoding='utf-8') except Exception as e: print(e) for i, row in df.iterrows(): d[row['Location_Name_ZH']] = row['Location_ID'] return d[city] if city in d else '' def get_weather(location): key = "你的和风天气API key" id = getLocationId(location) if not id: return "没有这个城市" base_url = 'https://devapi.qweather.com/v7/weather/now?' params = {'location': id, 'key': key, 'lang': 'zh'} response = requests.get(base_url, params=params) data = response.json() if data["code"] != "200": return "没有这个城市的天气情况" return get_weather_info(data) class FutureWeatherInput(BaseModel): location: str = Field(description="城市名称") date: str = Field(description="日期,格式:yyyy-mm-dd,如:2021-11-15") def get_future_weather(location, date): key = "你的和风天气API key" id = getLocationId(location) if not id: return "没有这个城市" base_url = 'https://devapi.qweather.com/v7/weather/7d?' params = {'location': id, 'key': key, 'lang': 'zh'} response = requests.get(base_url, params=params) data = response.json() if data["code"] != "200": return "没有这个城市的天气情况" result = {} daily = data["daily"] for item in daily: fxDate = item["fxDate"] weather_text = f"""
天气: {item["textDay"]}
最高温度: {item["tempMax"]} 摄氏度
最低温度: {item["tempMin"]} 摄氏度
风向: {item["windDirDay"]}
风力等级: {item["windScaleDay"]}
风速: {item["windSpeedDay"]} 公里/小时
""" result[fxDate] = weather_text return result[date] def get_weather_info(info): if info["code"] != "200": return "没有这个城市的天气情况" # result = f'现在天气{info["hourly"][0]["text"]},温度 {info["hourly"][0]["temp"]} 度, 未来 24 小时天气{info["hourly"][-1]["text"]},温度 {info["hourly"][-1]["temp"]} 度。' result = f"""
现在天气: {info["now"]["text"]}
温度: {info["now"]["temp"]} 摄氏度
风向: {info["now"]["windDir"]}
风力等级: {info["now"]["windScale"]}
风速: {info["now"]["windSpeed"]} 公里/小时
""" return result def get_internet_content(query): params = { "engine": "baidu", "q": query, "api_key": "你的SerpApi key" } search = BaiduSearch(params) result = search.get_json()["organic_results"][0]["snippet"] return result def test_agent_example(): model = "Qwen-72B-Chat-Int4" api_key = "EMPTY" base_url = "http://localhost:8000/v1" llm = ChatOpenAI(model=model, temperature=0, api_key=api_key, base_url=base_url) print(get_weather("北京")) def get_time(input=""): return datetime.datetime.now() #定义获取当前时间 time_tool = Tool( name='get current time', func= get_time, description="用来获取当前时间. input should be 'now'。当需要获取今天、明天、后天等的日期时,你应该调用此函数获取今天的日期""" ) weather_tool = Tool( name='get current weather', func= get_weather, description="用来获取当地当天的天气信息,输入应该是城市名称""" ) future_weather_tool = StructuredTool( name='get future weather', func= get_future_weather, description="用来获取当地今天和未来六天的天气信息。""", args_schema=FutureWeatherInput ) tools = load_tools(tool_names=["llm-math"], llm=llm) tools.extend([time_tool, weather_tool, future_weather_tool]) #创建代理 agent = initialize_agent( agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, tools=tools, llm=llm, verbose=True, max_iterations=5, handle_parsing_errors=True ) print(agent.agent.llm_chain.prompt[0].prompt.template) question = "今天是几号?明天准备去杭州旅游,能穿短袖吗?" result = agent.run(question) print("----"*20) print(result)
总结
1、tool description 非常重要,没有写好description,agent无法理解在什么情况下应该调用该tool
2、输入参数的 description 非常重要,想要LLM生成给定格式的输入参数,可以给一些few shot样例
3、agent本质还是prompt工程,极大程度上依赖于LLM的参数量。小模型无法理解prompt,无法生成给定格式的输入参数,导致tool函数不能被正常调用
如何学习AI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
相关文章:
LLM之Agent初探
Agent是什么? Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。 Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。…...
目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!
还是半夜睡不着,打开靶机开始操作。今天看了文件下载和目录穿越漏洞想结合以及防御方法。半夜来进行操作一波。复现一下漏洞,这个网上的文章页比较的少!!! 开始操作起来!!! 进入到页…...
代码随想录算法训练营day41
题目:01背包理论基础、416. 分割等和子集 参考链接:代码随想录 动态规划:01背包理论基础 思路:01背包是所有背包问题的基础,第一次看到比较懵,完全不知道dp数据怎么设置。具体分析还是dp五部曲ÿ…...
从0~1开发财务软件
1.获取图形验证码接口 功能要求 1、随机生成6位字符 2、将字符生成base64位格式的图片,返回给前端 3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。 clientId通过/login/getClien…...
Python实现连连看9
(2)标识选中的图片 在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…...
项目验收总体计划书(实际项目验收原件参考Word)
测试目标:确保项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保项目的业务流程符合用户和产品设计要求;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 ࿰…...
C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字
文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法:传返回值表示函数调用是否正常结束。 例如,返回 0 表示…...
番外篇 | 利用华为2023最新Gold-YOLO中的Gatherand-Distribute对特征融合模块进行改进
前言:Hello大家好,我是小哥谈。论文提出一种改进的信息融合机制Gather-and-Distribute (GD) ,通过全局融合多层特征并将全局信息注入高层,以提高YOLO系列模型的信息融合能力和检测性能。通过引入MAE-style预训练方法,进一步提高模型的准确性。🌈 目录 🚀1.论文解…...
python记录之字符串
在Python中,字符串是一种非常常见且重要的数据类型,用于存储文本信息。下面,我们将对Python字符串进行深入的讲解,包括其基本操作、常见方法、格式化以及高级特性。 1. 字符串的创建 在Python中,字符串可以通过单引号…...
Elasticsearch 认证模拟题 - 15
一、题目 原索引 task1 的字段 title 字段包含单词 The,查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new,重建后的索引, title 字段查询 the 单词,不能匹配到任何文档。 PUT task1 {"mappings": {"…...
g++ 预处理 编译 汇编 链接 命令
g 预处理 编译 汇编 链接 命令 在命令行中使用 g 预处理、编译、汇编和链接源代码文件通常遵循以下步骤: 预处理(Preprocessing):将源代码文件转换为经过预处理器处理的中间文件。 g -E source.cpp -o source.i 编译ÿ…...
计算机视觉中的low-level与 high-level任务
文章目录 low-level任务high-level任务区别联系others参考在计算机视觉领域中,low-level任务和high-level任务是两个重要的概念,他们分别涉及图像处理和分析的不同的层次。 low-level任务 low-level任务主要关注的是图像的底层特征,如颜色、纹理、边缘、形状等。通常涉及对…...
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而,随着科技的进步,我们对时间管理和测量的方法已经发生了翻天覆地的变…...
图论第8天
685.冗余连接II 这题需要考虑两种情况: 1.两个输入 2.没有两个输入就是有成环 class Solution { public:static const int N 1005;int father[N];int n;void init(){for (int i 0; i < n; i){father[i] i;}}int find(int x){return x father[x] ? x : f…...
Python怎么配置环境变量:深度探索与实战指南
Python怎么配置环境变量:深度探索与实战指南 在Python编程的世界中,环境变量的配置是一个至关重要的步骤。它不仅影响着Python解释器的运行,还关系到各种第三方库和工具的使用。本文将带你深度探索如何配置Python的环境变量,并为…...
计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)
前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算…...
HTML做成一个炫酷跳动爱心的页面
大家好,今天制作制作一个炫酷跳动爱心的页面! 先看具体效果: 要创建一个炫酷跳动爱心的HTML页面,你可以使用HTML、CSS和JavaScript的组合。以下是一个简单的示例,它使用CSS动画和JavaScript来实现跳动效果。 首先&…...
React + SpringBoot实现图片预览和视频在线播放,其中视频实现切片保存和分段播放
图片预览和视频在线播放 需求描述 实现播放视频的需求时,往往是前端直接加载一个mp4文件,这样做法在遇到视频文件较大时,容易造成卡顿,不能及时加载出来。我们可以将视频进行切片,然后分段加载。播放一点加载一点&am…...
Suse Linux ssh配置免密后仍需要输入密码
【问题描述】 Suse Linux已经配置了ssh免密,但无法ssh到目标服务器。 对自身的ssh登陆也需要输入密码。 系统–Suse 15 SP5 【重现步骤】 1.使用ssh-keygen -t rsa生产key文件 2.使用ssh-copy-id拷贝public key到目标机器(或者自身) 3.配置成功后ssh 目标时仍需要输…...
apifox 生成签名
目录 前言准备编写签名脚本签名说明捋清思路编码获取签名所需的参数生成签名将签名放到合适的位置完整代码 在apifox中配置脚本新增公共脚本引用公共脚本添加环境变量 参考 前言 略 准备 查看apifox提供的最佳实践文章:接口签名如何处理 编写签名脚本 签名说明…...
介绍建造者模式
建造者模式 将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示 四种角色 Product 产品角色 指的是一个具体的产品对象Builder 抽象建造者 创建一个产品对象的各个部件的接口/抽象类ConcreteBuilder 具体建造者 实现或继承抽象建造者接口…...
【全部更新完毕】2024全国大学生数据统计与分析竞赛B题思路代码文章教学数学建模-电信银行卡诈骗的数据分析
电信银行卡诈骗的数据分析 摘要 电信银行卡诈骗是当前社会中严重的犯罪问题,分析电信银行卡交易数据,找出高风险交易特征,建立预测模型,将有助于公安部门和金融机构更好地防范诈骗行为,保障用户的财产安全。 针对问…...
【应用浅谈】Odoo的库存计价与产品成本(三)
序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo的库存(Stock)模块拥有众多功能,其中库存计价是一项非常重要的功能,原生的成本方法分三种:【标准成本】,【平均成本】,【先进先出】&#…...
数据结构之ArrayList与顺序表(下)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇:数据结构之ArrayLis…...
openi启智社区 aarch64 npu环境安装飞桨paddlepaddle和PaddleNLP(失败)
以前在启智社区都是编译安装飞桨,这回看到飞桨提供了npu安装包,兴冲冲的以为安装很简单。 之所以安装飞桨,是因为想在启智社区的启智大脑调试环境使用最新的PaddleNLP,结果报错:No module named paddle.nn.layer.laye…...
【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞
0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络,它提供了用户之间交流、分享、讨论的平台。在这个系统中,用户可以创建、加入不同的圈子,圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…...
46-1 护网溯源 - 钓鱼邮件溯源
一、客户提供钓鱼邮件样本 二、行为分析 三、样本分析 对钓鱼邮件中的木马程序1111.exe文件进行了分析,提交了360安全大脑沙箱云和微步在线云沙箱。 360安全大脑沙箱云显示,该1111.exe文件存在危险,因此在解压时需要谨慎操作,以免触发木马程序。 建议使用360压缩软件进行…...
鸿蒙低代码开发一个高频问题
在版本是DevEco Studio 3.1.1 Release,SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况,或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的: JSON schema validation error: data/visualModel/value/…...
关于使用南墙waf防护halo网站主页请求404报错的解决方案
文章目录 环境说明问题展示原因探究解决方法 环境说明 在1panel应用商店,部署南墙waf(docker版)halo(2.16.1社区版)注意部署过程中注意uuwaf必须勾选允许外部访问,halo可以不勾选[这里为了证明确实是南墙waf的原因,选择勾选] 问题展示 使…...
Elasticsearch 认证模拟题 - 13
一、题目 集群中有索引 task3,用 oa、OA、Oa、oA 查询结构是 4 条,使用 dingding 的查询结果是 1 条。通过 reindex 索引 task3 为 task3_new,能够使 task3_new 满足以下查询条件。 使用 oa、OA、Oa、oA、0A、dingding 查询都能够返回 6 条…...
临安做网站的公司/100种找客户的方法
对大多数交易员来说,策略的制定仅仅是一种手段,是获利的必要路径。交易系统开发的过程,相对最终投入使用,是比较艰难的:通常,实际交易远比制定交易策略要更有意思。 不过,这会使得交易员采取各…...
老网站301跳转新网站/营销网络的建设怎么写
我们所有的数据一般都放在Mysql的data目录下 注意这里的端口写的是主机映射到mysql下的端口,而不是3306...
如何用魔方网表做门户网站/写软文一篇多少钱合适
前言 大家好呀,最近很多小伙伴,让我帮忙找找 Java 面试资料。 于是我把以前的面试专栏的文章,整理成PDF啦!有MySQL、Redis、消息队列、计算机网络、Zookeeper、Java基础、以及各个大厂的面试真题,大家一起学习&#…...
做网站的外包公司上班好不好/seochan是什么意思
背景: 因为移动端APP和Msite手机注册发送短信验证码没有添加图片验证码功能。公司的短信接口被恶意刷取。所以我们就觉得在移动端添加一个图片验证码功能。分享一下大体实现方式思路。PS demo是自己写的。跟公司代码还是有很大差距的。 一. 图片验证码第一版 1. 建立图片…...
网站备案需要什么/河北seo网络优化师
Description Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其…...
晋城市公用事业建设局网站/店铺如何运营和推广
版本 JDK8(JDK1.8) Consumer函数式接口源码重点 1.Consumer函数式接口需要实现的方法是 void accept(T t),表示一个接受单个输入参数但不返回结果的操作。 2.Consumer andThen(Consumer<? super T> after) 用于拼接多个Consumer的accept(T t)方法࿰…...