LangChain之Agent代理

news2024/11/18 1:50:10

OpenAI Functions Agent

概述

某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经过微调,可以检测何时应该调用特定的函数,并应该将该函数的正确输入进行响应。在API调用中,您可以描述想要调用的函数,然后让模型智能地选择输出包含调用这些函数所需参数的JSON对象。

在LangChain中,create_openai_functions_agent是一个便捷的函数,用于创建能够与OpenAI提供的函数交互的代理。这使得开发人员可以创建智能应用程序,通过代理与用户进行更自然、更有效的对话。

配置环境变量

设置OpenAI和TAVILY的API密钥

import os

# 设置OpenAI的BASE_URL、API_Key
os.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c1234fsfsdaf9b4813bc437B82c2"

# 设置tavily
os.environ["TAVILY_API_KEY"] = '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'

基本使用

from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI

# 初始化工具
tools = [TavilySearchResults(max_results=1)]

# 获取使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")

# 选择将驱动代理的LLM
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")

# 构建OpenAI函数代理
agent = create_openai_functions_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 执行
agent_executor.invoke(
    {
        "input":"我叫什么名字?",
        "chat_history":[
            HumanMessage(content="你好!我叫鲍勃"),
            AIMessage(content="你好鲍勃!我今天能帮你什么?"),],
    }
)

在这里插入图片描述

实际应用示例

创建一个代理,它能够处理用户的常见问题,并且能够根据用户的问题进行动态响应。

from langchain import hub
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
from langchain_core.tools import Tool

# 定义查询订单状态的函数
def query_order_status(order_id):
    if order_id == "12345":
        return "订单 12345 的状态是:已发货,预计送达时间是 3-5 个工作日。"
    else:
        return f"未找到订单 {order_id} 的信息,请检查订单号是否正确。"

# 定义退款政策说明函数
def refund_policy(keyword):
    print("keyword = ", keyword)
    return "我们的退款政策是:在购买后30天内可以申请全额退款,需提供购买凭证。"

# 初始化工具
tools = [TavilySearchResults(max_results=1),
         Tool(
             name="queryOrderStatus",
             func=query_order_status,
             description="根据订单ID查询订单状态"
         ),
         Tool(
             name="refundPolicy",
             func=refund_policy,
             description="查询退款政策内容"
         ),
         ]

# 获取使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")

# 选择将驱动代理的LLM
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")

# 构建OpenAI函数代理
agent = create_openai_functions_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 定义一些测试询问
queries = [
    "请问订单12345的状态是什么?",
    "你们的退款政策是什么?"
]

# 运行代理并输出结果
for input in queries:
    response = agent_executor.invoke({"input": input})
    print(f"客户提问:{input}")
    print(f"代理回答:{response}\n")


在这里插入图片描述

OpenAI Tools Agent

概述

某些OpenAI模型可以检测何时应该调用一个或多个函数,并使用应该传递给函数的输入进行响应。在API调用中,可以描述函数,并让模型智能地选择输出包含参数的JSON对象来调用这些函数。这与函数调用非常相似。

OpenAI将调用单个函数的能力称为函数,将调用一个或多个函数的能力称为工具。

基本使用

from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI

#  使用Tavily搜索工具
tools = [TavilySearchResults(max_results=1)]

# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-tools-agent")

# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 构建 OpenAI 工具代理
agent = create_openai_tools_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 运行代理
agent_executor.invoke({"input": "目前市场上黄金的平均售价是多少?"})

在这里插入图片描述

实际应用示例

创建一个能帮助用户进行搜索与获取天气信息的智能代理。

import requests
from langchain_core.tools import Tool
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI

# 获取天气信息的函数
def get_weather(city):
    url = f"https://xxx.com/api/weather?city={city}"
    response = requests.get(url)
    if response.status_code == 200:
        jsonData = response.json()
        data = jsonData['data']
        type = data['type']
        low = data['low']
        high = data['high']
        return f"{city} 的天气是 {type},最低温度是 {low}°C,最高温度是 {high}°C。"
    else:
        return "无法获取天气信息,请检查城市名称。"

# 初始化工具
tools = [TavilySearchResults(max_results=1),
         Tool(
             name="getWeather",
             func=get_weather,
             description="根据城市名称查询天气情况"
         )]

# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-tools-agent")

# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 构建 OpenAI 工具代理
agent = create_openai_tools_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 定义一些测试询问
queries = [
    "成都今天天气情况?",
    "目前市场上黄金的平均售价是多少?"
]

# 运行代理并输出结果
for input in queries:
    response = agent_executor.invoke({"input": input})
    print(f"提问:{input}")
    print(f"回答:{response}\n")

在这里插入图片描述

ReAct Agent

概述

ReAct (Reflective Agent) 是 LangChain 中的一种聊天代理(Agent)类型。它具有以下独特的特点:

反思能力:ReAct 代理在给出响应之前,会先对自己的行为和预测进行深入的反思和评估。它会检查自己是否遵循了预先设定的规则和指令,是否达到了预期的目标。

自我纠错:如果ReAct代理在反思过程中发现自己存在问题或疏漏,它会主动尝试对自己的行为进行纠正和改正,以修复错误,提高自身的表现。

迭代学习:通过不断的反思和自我纠错,ReAct 代理可以在与用户的交互中逐步学习和优化自己的行为方式,不断提高回答的质量和准确性。

可解释性:ReAct 代理在给出最终响应时,会同时提供自己的思考过程和决策依据,使得它的行为更加透明和可解释。

ReAct 代理具有更强的自我意识和自我管理能力。它可以主动思考自己的行为,发现问题并及时修正,从而提供更加可靠和合理的响应。

这种具备反思和自我纠错能力的 ReAct 代理,在需要较高可靠性和稳定性的应用场景中很有优势,例如智能客服、问答系统、任务执行等。它可以通过持续的自我学习和优化,为用户提供更加智能和可信的交互体验。

Google搜索API

安装SerpAPI库

pip install google-search-results  -i https://pypi.org/simple

设置好OpenAI和SerpAPI的API密钥

import os

os.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c99B9Q4c1234fsfsdaf9b4813bc437B82c2"

os.environ["SERPAPI_API_KEY"] = 'a871b9e551299Q4c1234fsfsdaf9b4813bc47233d796de36'

initialize_agent

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain_openai import ChatOpenAI

import langchain

# 开启DEBUG 显示具体的日志信息
# langchain.debug = True
# langchain.verbose = True

# 初始化大模型:语言模型控制代理
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 设置工具:加载使用的工具,serpapi:调用Google搜索引擎 llm-math:通过LLM进行数学计算的工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 初始化Agent:使用工具、语言模型和代理类型来初始化代理
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# 让代理来回答提出的问题
agent.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价?"})

大模型成功遵循了ReAct框架,它输出的思考与行动轨迹如下:

> Entering new AgentExecutor chain...
I need to find the average selling price of the iPhone 15 on the market and then calculate a 5% markup.
Action: Search
Action Input: "average selling price of iPhone 15"
Observation: How much does an iPhone 15 cost? iPhone 15 prices start at $535 and cost $716 on average as of April 2024. iPhone 15 prices will continue to get cheaper over time. Apple phones hold their value well, but prices will continue to drop as time passes and new models are announced.
Thought:I need to calculate a 5% markup on the average selling price of $716.
Action: Calculator
Action Input: 716 * 1.05
Observation: Answer: 751.8000000000001
Thought: I now know that if I add a 5% markup to the average selling price of iPhone 15, I should price it at $751.80.
Final Answer: $751.80

> Finished chain.

执行发现有如下警告:

initialize_agent在新版本中不推荐使用并在将来会删除,推荐使用create_react_agent, create_json_agent, create_structured_chat_agent等初始化Agent

LangChainDeprecationWarning: The function `initialize_agent` was deprecated in LangChain 0.1.0 and will be removed in 0.2.0. Use Use new agent constructor methods like create_react_agent, create_json_agent, create_structured_chat_agent, etc. instead.
  warn_deprecated(

create_react_agent

# 加载所需的库
from langchain.agents import load_tools, AgentExecutor
from langchain.agents import create_react_agent
from langchain_openai import ChatOpenAI
from langchain import hub

# 初始化大模型:语言模型控制代理
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 设置工具:加载使用的工具,serpapi:调用Google搜索引擎 llm-math:通过LLM进行数学计算的工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 获取使用提示
prompt = hub.pull("hwchase17/react")
print(prompt)

# 初始化Agent:使用工具、语言模型和代理类型来初始化代理
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 让代理来回答提出的问题
agent_executor.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价?"})


> Entering new AgentExecutor chain...
I need to find the average selling price of the iPhone 15 on the current market and then calculate a 5% markup.
Action: Search
Action Input: "average selling price of iPhone 15"How much does an iPhone 15 cost? iPhone 15 prices start at $535 and cost $724 on average as of April 2024. iPhone 15 prices will continue to get cheaper over time. Apple phones hold their value well, but prices will continue to drop as time passes and new models are announced.I need to calculate a 5% markup on the average selling price of $724.
Action: Calculator
Action Input: $724 * 1.05Answer: 760.2I now know the final answer.
Final Answer: The average selling price of the iPhone 15 on the current market is $724. To sell it with a 5% markup, I should price it at $760.20.

> Finished chain.

使用聊天记录

# 与聊天记录一起使用
agent_executor.invoke(
    {
        "input": "what's my name?",
        "chat_history": "Human: My name is Bob\nAI: Hello Bob!",
    }
)

Structured Chat Agent

create_structured_chat_agent 是 LangChain 提供的一个函数,用于创建结构化聊天代理。这种代理能够根据用户的输入调用预定义的工具函数,并将结果返回给用户。

# 使用 Tavily Search 测试代理
from langchain_community.tools.tavily_search import TavilySearchResults

tools = [TavilySearchResults(max_results=1)]

# 初始化大模型
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0.5)

# 创建代理Agent
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain import hub

# 获取使用提示,也可以自己写
prompt = hub.pull("hwchase17/structured-chat-agent")
# 初始化Agent
agent = create_structured_chat_agent(
    llm,
    tools,
    prompt
)

# 输入代理和工具,创建代理执行器
agent_executor = AgentExecutor(
    agent=agent, tools=tools, verbose=True, handle_parsing_errors=True
)

# 运行代理Agent
response = agent_executor.invoke({"input": "网站https://www.runoob.com中有哪些教程?"})
print(response)

> Entering new AgentExecutor chain...
{
  "action": "tavily_search_results_json",
  "action_input": {
    "query": "site:runoob.com 教程"
  }
}[{'url': 'https://www.runoob.com/', 'content': '菜鸟教程(www.runoob.com)提供了编程的基础技术教程, 介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP , MySQL等各种编程语言的基础知识。 同时本站中也提供了大量的在线实例,通过实例,您可以更好的学习编程。'}]{
  "action": "Final Answer",
  "action_input": "菜鸟教程(www.runoob.com)提供了编程的基础技术教程,介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP,MySQL等各种编程语言的基础知识。同时本站中也提供了大量的在线实例,通过实例,您可以更好地学习编程。"
}

> Finished chain.
{'input': '网站https://www.runoob.com中有哪些教程?', 'output': '菜鸟教程(www.runoob.com)提供了编程的基础技术教程,介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP,MySQL等各种编程语言的基础知识。同时本站中也提供了大量的在线实例,通过实例,您可以更好地学习编程。'}

Self-Ask with Search Agent

Self-Ask with Search是一个通过搜索自我询问的代理,通过询问+答案的机制来帮助大模型寻找事实性问题的过渡性答案,从而引出最终答案。

from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain_community.tools.tavily_search import TavilyAnswer

# 将初始化工具,让它提供答案而不是文档
tools = [TavilyAnswer(max_results=1, name="Intermediate Answer", description="Answer Search")]

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 获取使用提示 可以修改此提示
prompt = hub.pull("hwchase17/self-ask-with-search")

# 使用搜索代理构建自助询问
agent = create_self_ask_with_search_agent(llm, tools, prompt)

# 通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)

# 运行代理
agent_executor.invoke({"input": "中国有哪些省份呢?"})

在这里插入图片描述

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

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

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

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

img

三、AI大模型经典PDF籍

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

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 MediaPipe 实现实时手部追踪和手势识别 | Rerun展示

点击下方卡片,关注“小白玩转Python”公众号 在本文中,我将展示一个使用 MediaPipe Python 和 Rerun SDK 进行手部追踪和手势识别的示例。如果您有兴趣深入了解并扩展您的知识,我将指导您如何安装 MediaPipe Python 和 Rerun SDK 来进行手部追…

web前端课程大作业-高校学生事务中心

文章目录 概述代码页面截图代码链接 概述 仿制高校的学生事务中心&#xff0c;一个登录和注册页面 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conten…

计算机毕业设计Thinkphp/Laravel智能道路交通管理系统4ir8r

Laravel非常的简洁并且是开源的&#xff0c;Laravel 是一个具有表现力、优雅语法的 Web 应用程序框架. Laravel 是构建现代全栈 Web 应用程序的最佳选择. 它的语法更富有表现力&#xff0c;拥有高质量的文档和丰富的扩展包&#xff0c;技术上它有Bundle扩展包、Eloquent ORM、反…

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源&#xff1a; https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总&#xff1a; 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

【AIGC】《AI-Generated Content (AIGC): A Survey》

文章目录 相关概念What is AI-generated content?Necessary conditions of AIGCHow can AI make the content better?The industrial chain of AIGCAdvantages of large-scale pre-trained modelsGeneration of smart textPros of AIGCCons of AIGCAIGC and Metaverse 挑战潜…

第 11 课:组件介绍与自定义开发

本讲主要介绍了隐语的组件标准、已有的组件能力以及进一步的自定义开发流程。经过本讲的学习&#xff0c;可以为将隐语集成到任意调度系统&#xff0c;基于Kusica/SecretPad进行二次开发&#xff0c;以及参与隐语开放标准共建建立基础。 一、隐语开放标准 隐语提出的适用于隐私…

Sora:探索AI视频模型的无限可能

随着人工智能技术的飞速发展&#xff0c;AI在视频处理和生成领域的应用正变得越来越广泛。Sora&#xff0c;作为新一代AI视频模型&#xff0c;展示了前所未有的潜力和创新能力。本文将深入探讨Sora的功能、应用场景以及它所带来的革命性变化。 一、Sora的核心功能 1.1 视频生…

java类的加载 ,类加载器以及双亲委派机制详细介绍

1_类的加载 路径 类的加载过程类的加载时机 类的加载 当程序在运行后&#xff0c;第一次使用某个类的时候&#xff0c;会将此类的class文件读取到内存&#xff0c;并将此类的所有信息存储到一个Class对象中 说明&#xff1a;Class对象是指java.lang.Class类的对象&#xff0c…

Orangepi Zero2使用外设驱动库wiringOP驱动蜂鸣器

目录 一、安装外设驱动库 1.1 wiringPi外设SDK安装&#xff1a; 二、使用wiringOP库驱动蜂鸣器 2.1 蜂鸣器的硬件连接&#xff1a; 2.2 使用wiringOP库实现蜂鸣器滴滴响&#xff1a; 2.3 设置vim代码显示格式&#xff1a; 一、安装外设驱动库 1.1 wiringPi外设SDK安装&a…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…

windows@局域网或蓝牙文件传输@共享文件夹@就近共享

文章目录 windows系统下的简单共享文件方案&#x1f47a;就近共享设置共享文件夹(推荐)方法1:使用shrpubw程序引导创建方法2:使用图形界面创建右键设置共享文件夹 查看所有已经共享的文件夹&#x1f47a;停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题&#x1f60a;…

JFrame和JScrollPanel布局初步使用

还不是很了解&#xff0c;做了几个程序&#xff1b; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

一个多文件工程的例子

代码; main.c #include <stdio.h> #include "add.h" #include "sub.h"int main(void) {int a10,b12;float x1.23456,y9.87654321;printf("int ab IS :%d\n",add_int(a,b));printf("int a-b IS :%d\n",sub_int(a,b));printf(&q…

STM32 中断和事件的区别

原文 简述 上图蓝线为中断的处理过程&#xff0c;红线是事件处理过程。 区别 中断&#xff08;Interrupts&#xff09;&#xff1a; 简述&#xff1a;当发生中断请求后&#xff0c;CPU暂停当前任务&#xff0c;进入对应的中断服务函数&#xff0c;完成后再回到原来暂停的地方…

IP地址专用SSL证书申请指南

IP地址SSL证书是一种专门设计用于IP地址的SSL/TLS证书&#xff0c;部署IP地址SSL证书可以实现IP地址HTTPS加密。 一&#xff1a;前提条件 1&#xff1a;申请IP地址SSL证书,必须拥有这个IP地址的管理权限 2 &#xff1a;80、443、22、端口中任一个可以短暂开放 二&#xff1…

rtthread stm32h743的使用(十)i2c设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.打开cubemux&#xff0c;设置外部时钟及串口外设…

Java文件操作小项目-带GUI界面统计文件夹内文件类型及大小

引言 在Java编程中&#xff0c;文件操作是一项基本且常见的任务。我们经常需要处理文件和文件夹&#xff0c;例如读取、写入、删除文件&#xff0c;或者遍历文件夹中的文件等。本文将介绍如何使用Java的File类和相关API来统计一个文件夹中不同类型文件的数量和大小。 准备工作…

气膜体育馆的使用年限有多少—轻空间

气膜体育馆作为一种新兴的建筑形式&#xff0c;因其独特的结构和功能而备受青睐。它不仅在建设速度、成本控制和环保方面具有显著优势&#xff0c;还在使用年限上展现出良好的性能。轻空间将探讨气膜体育馆的使用年限及其影响因素。 气膜体育馆的基本结构 气膜体育馆主要由膜材…

我教你做不花钱的SEO

我教你做不花钱的SEO **SEO&#xff08;搜索引擎优化&#xff09;投入不一定有产出**不花钱的SEO标题标签元描述标题标签URL结构图片优化内容优化内部链接外部链接结构化数据页面速度优化移动友好性社交媒体整合 结论 SEO&#xff08;搜索引擎优化&#xff09;投入不一定有产出…