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提供的最佳实践文章:接口签名如何处理 编写签名脚本 签名说明…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
