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

回调处理器

文章目录

    • 什么是回调处理器
      • 回调处理器的工作流程
      • 回调处理器的使用
      • 自定义链组件中的回调
    • 内置回调处理器
    • 自定义回调处理器

    在编程领域中,回调是一个非常重要的概念。简而言之,回调是一种特殊的函数或方法,它可以被传递给另一个函数作为参数,并在适当的时候被调用。随着技术的发展,无论是为用户实时显示数据,还是为开发者提供即时的系统日志,LangChain都希望系统能够在关键时刻为开发者提供即时信息。这正是回调处理器(Callbacks)的用途。回调处理器允许开发者在特定事件发生时执行自定义操作,这在许多场景中都非常有用,例如日志记录、性能监控、流式处理等。

什么是回调处理器

    回调处理器就是一种允许开发者在特定事件发生时执行自定义操作的机制。在LangChain框架中,回调处理器是一种特殊的包装机制,其允许开发者定义一系列的方法来响应不同的生命周期事件。每当特定事件被触发时,相应的回调处理器方法就会被执行。设计回调处理器的目的是提供一个统一、模块化和可重用的机制,使开发者能够更轻松地为链组件和Aget组件添加各种回调功能。下面是使用回调处理器的几个好处。

  1. 模块化与可重用性:通过定义回调处理器,可以创建一组可重用的操作,并且可以轻松地在不同的LangChain实例或应用中使用这些操作。例如,如果你有多个应用都需要流式输出到WebSocket,那么使用一个统一的WebSocketStreamingHandler可以避免重复的代码。
  2. 灵活性:回调处理器提供了一种结构化的方式来响应各种事件,而不仅仅是流式输出。这意味着你可以为各种事件(如链开始、链结束、错误发生等)定义特定的逻辑。
  3. 与LangChain框架中的其他组件紧密集成:回调处理器是为LangChain框架特别设计的,确保与其内部机制的兼容性和高效性。
  4. 代码清晰且具有维护性:通过使用专门的回调处理器,你的代码结构会更清晰。当其他开发者查看或维护你的代码时,他们可以轻松地找到和理解回调逻辑。然而,是否使用回调处理器取决于业务需求。如果你发现直接在应用逻辑中实现特定功能更适合你的需求,那么完全可以这样做。LangChain框架中的回调处理器只是提供了一个方便、统一的工具,旨在简化开发者的工作。

回调处理器的工作流程

    LangChain的回调机制的核心在于两个参数:callbacks=[]和run_manager。run_manager参数的主要职责是管理和触发回调事件。callbacks=[]参数则是为run _manager提供具体的回调处理器列表。这意味着,在利用链组件(无论是LangChain的内置组件还是开发者自定义的组件)时,通过提供callbacks=-列表,开发者实际上是在为un_manager定义规则:“当特定事件发生时,希望这些特定的回调处理器被触发。”整个回调处理器的工作流程都发生在执行链组件的内部。为了让读者更直观地理解这个过程,请读者参见下图。整个流程包含开始执行链组件、链组件执行中、触发回调和完成4个阶段。

  • 开始执行链组件阶段:此时,系统开始执行链组件,并为处理输入数据做好准备。然后检查callbacks=-参数,若传递了callbacks-=[),则系统进人下一步初始化un manager。此时,系统使用传递的callbacks=[列表来初始化run_manager,确保它包含了所有提供的回调处理器。
  • 链组件执行中阶段:系统根据输人数据执行链组件。在各个关键点,如数据处理、模型调用等,系统会检查run_manager是否需要触发任何回调。
  • 触发回调阶段:如果un_manager在某个执行阶段检测到需要触发的回调事件,它会按照callbacks-=[0中定义的顺序触发回调处理器。
  • 完成阶段:当所有任务都完成,并且所有必要的回调都被触发后,链组件的执行就此结束。
图片名称

回调处理器的使用

    开发者常用的回调处理器的使用方法是:在实例化链组件和Agent组件的时候,通过使用callbacks=[]参数传入回调处理器,整个回调处理器的工作流程都发生在执行链组件的内部。什么时候链组件被执行了,回调处理器就被调用了。链组件的调用方式有两种,一种是构造函数回调,在创建链组件或Agent组件时,通过callbacks=[]参数将回调处理器传入构造函数。这种类型的回调会在整个组件的生命周期中起作用,只要这个组件被调用,相关的回调函数就会被触发;另一种是请求回调,这是在调用组件的run()或apply()方法的callbacks=[]参数传入回调处理器。

    当运行一个链组件或者Agent组件时,回调处理器会负责在其内部定义事件触发时,调用回调处理器中内部定义的方法。例如,如果一个CallbackHandler有一个名为on_task_start的方法,那么每当链组件开始一个新任务时,CallbackManager就会自动调用这个on_task_start方法。

    如下图所示,当一个回调处理器被传递给Agent组件时,这个处理器会自动响应Agent组件在运行过程中触发的各种事件。当LLM启动时(图中①步骤),如果你实现了on_llm_start方法,则该方法会在LLM开始运行时被触发。当工具(Tool)启动时(图中②步骤),如果你实现了on_tool_start方法,则该方法会在工具(例如数学工具或谷歌搜索工具)开始运行时被触发。当Agnt组件执行某个动作时(图中③步骤):如果你实现了on_agent_action方法,那么每当Agent组件执行一个动作时,这个方法都会被触发。

图片名称

    本质上,Agnt组件是一个特殊的复合链组件,可以简化回调处理器的使用范围为链组件。凡是链组件,皆可使用callbacks参数传递具体的回调处理器列表。(此方式仅为简化方便之用,在实际开发应用中、最多的使用场景是链组件实例化的时候。实际上LangChain的各种链组件、LLM、Chat Models、Agents和Tools这些类都可以使用回调处理器。以下是一个具体的链组件,其使用callbacks参数传递具体的回调处理器列表。自定义的回调处理器

class MyCustomHandler (BaseCallbackHandler):def on_llm_start (self,*args,kwargs):print("LLNf始运行")
my_handler= MyCustomHandler ()
# 运行链组件,传递ca11 backs参数的列表
result = my_chain.run ("some input",callbacks=[my handler])

    在上面的例子中,当链开始执行并触发on_Ilm_start事件时,MyCustomHandler中的相应方法将被调用,从而打印出“"LLM开始运行””。

自定义链组件中的回调

    链组件或Agent组件通常都有一些核心的执行方法,如_call、_generate、__run等。这些方法现在都被设计为接收一个名为run_manager的参数。这是因为run_manager允许这些组件在执行过程中与回调系统进行交互,在执行这些组件时,如果传递了callbacks=[]回调处理器列表,那么run_manager就会包含这些处理器,并负责在适当的时机触发它们。

    run_manager主要用于管理和触发回调事件。而callbacks=[]则是为这个管理器提供具体的回调处理器列表。当你在使用链组件(无论是内置的还是自定义的)时,为其提供callbacks=[]列表,实际上是在告诉run_manager:“当特定事件发生时,我希望这些回调处理器被触发。”

    run_manager被绑定到特定的执行或运行,并提供日志方法,使得在执行代码过程中的任何时刻,都可以触发回调事件,如生成新的提示词、完成执行等。因此,可以说任何链组件都可以使用callbacks关键字参数,这是因为这些组件的设计已经考虑到了与回调系统的交互,只要它们的核心方法(如call、_generate、_run等)被调用,run_manager就可以被传递进去,从而使得回调系统可以在执行过程中被触发。分析以下自定义链:

class MyCustomChain (Chain):#···[代码简化]def call(self,inputs:Dict(str,Any],run_manager:Optional[CallbackManagerForChainRun]None,)->Dict[str,str]:#...[代码简化]#当调用语言模型或其他链时,应传递一个回调管理器。response =self.llm.generate_prompt([prompt_value],callbacks=run_manager.get_child() if run_manager else None#如果需要记录此运行的信息,则可以通过调用'run manager'中的方法来做到。if run_manager:run_manager.on_text("记录此次运行的相关信息")return (self.output_key:response.generations[0][0].text)

    在上述代码中,run_manager被作为一个参数传递给call方法,允许开发者在链组件的执行中获取实时反馈,并进行日志记录。这个yCustomChain在被执行时,可以提供callbacks-=[]列表,这样就完成了整个回调工作流程。

handler= MyCallbackHandler ()
chain= MyCustomChain(llm=llm,prompt=prompt,callbacks=[handler])
chain.run()

内置回调处理器

    为了简化开发过程,LangChain提供了一系列内置的回调处理器,比如运行一个Agent组件,它的底层都使用到了StdOutCallbackHandler。.例如在下面代码中,设置verbose=True,在运行Agent组件时,也就是事件发生时,会将Agent组件的相关信息打印到标准输出(通常是控制台或命令行界面中)。在程序开发过程中,即时的反馈对于开发者理解程序的运行状态和识别潜在问题是至关重要的。LangChain通过其StdOutCallbackHandler为开发者提供了这一功能。

import os
os.environ["OPENAI API KEY"]="填人你的密钥"
from langchain.agents import load tools
from langchain.agents import initialize agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
llm =OpenAI()
tools =load_tools (["llm-math"],llm=llm)
agent=initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True)
agent.run ("9+7")

    在命令行界面中就可以看到以Entering new AgentExecutor chain…为开始,以Finished chain为结尾的标准输出。这是因为当运行Agent组件并启用verbose=True时,StdOutCallbackHandler将被自动激活,其将Agent组件的活动实时打印到标准输出。这为开发者提供了即时的反馈,帮助他们了解Agent组件的工作情况。

Entering new AgentExecutor chain...
I need to add two numbers together
Action:Calculator
Action Input:9+7
Observation:Answer:16
Thought:I now know the final answer
Final Answer:9+7= 16
Finished chain.
"9+7=16"

    这一系列的输出不仅告诉Agent组件已经开始运行,并完成了其任务,还详细地展示了Agent组件在执行过程中的所有操作和决策。例如,从输出中可以清楚地看到Agt组件收到的任务是“将两个数字加在一起”,接下来它决定采取的行动是使用“计算器”,并为此提供了具体的输人“9+7”。之后,Agnt组件给出了观察结果“答案:16”,并在思考后给出了最终答案“9+7=16”。这样的即时反馈对开发者来说意义重大。首先,它帮助开发者即时了解Agent组件的决策过程和操作顺序。当Agt组件的输出与预期不符时,开发者可以通过这些详细的反馈迅速定位问题所在,而无须深入底层代码中进行调试。其次,这也为开发者提供了一个观察和测试Aget组件在不同情境下的行为的机会,从而优化和完善其功能。

    然而,如果你更倾向于只获取Aget组件的最终执行结果,而不关心其内部的执行过程,那么你可以设置verbose=-False。这样,命令行界面中只会显示大语言模型的最终答案,如’9+7=16’,让输出更为简洁。这对于那些希望集成LangChain到他们的应用中,并希望只展示关键信息的开发者来说是非常有用的。

9+7=16

    还可以给链组件和Aget组件添加内置或者自定义的回调处理器。比如给一个基础的链组件LLMChain添加一个内置回调处理器:StdOutCallbackHandler。.可以先创建一个链组件。在初始化LLMChain的时候,这个链组件没有设置内置回调处理器,也不能设置verbose=True。

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import OpenAI
llm_chain=LLMChain(llm=OpenAI (),prompt=PromptTemplate.from_template ("(input)"))
llm= chain.run('上海的旅游景点有哪些?)

    运行LLMChain后,大语言模型回答的是:

上海的旅游景点有:\n\n1,上海迪士尼乐园\n2.东方明珠塔1n3.南京路步行街1n4.上海外滩\n5.上海野生动物园\n6,外白渡桥1n7.南京路商业街\n8.上海科技馆\n9.上海老城隍庙\n10.上海博物馆1n11.上海浦江夜游1n12.上海水上乐园\n13.上海徐汇森林公园\n14.上海金茂大厦An...

    如果想要监控这个链组件,则可以添加一些回调逻辑,比如想要命令行输出这个链组件运行的相关信息,则可以给这个链组件增加一个回调处理器。这里导入内置的StdOutCallbackHandler,.并且创建它的实例handler_1。

from langchain.callbacks import StdoutCallbackHandler
handler_1 =StdoutCallbackHandler (

    回调处理器的使用很简单,将handler_1作为回调处理器通过callbacks=-[handler_1]参数添加到LLMChain中,以实现对链组件运行状态的监控和命令行输出。这意味着可以添加多个回调处理器,完成不同的任务逻辑。

llm_chain =LLMChain(llm=OpenAI (),callbacks=[handler_1],prompt=PromptTemplate.from template("(input )")
llm_chain.run('上海的旅游景点有哪些?)

    这样就给一个LLMChain添加了一个回调处理器,内置的StdOutCallbackHandler完成的是标准的链组件的打印输出。当继续运行这个链组件时,在命令行界面中就可以看到以Entering new AgentExecutor chain…为开始,以Finished chain为结尾的标准输出。

>Entering new LLMChain chain...
Prompt after formatting:
上海的旅游景点有哪些?
Finished chain.
\n\n上海的旅游景点有:1n\n1,东方明珠广播电视塔n2.豫园n3.外滩\n4.南京路步行街
n5.上海野...\n\n

自定义回调处理器

    在程序开发过程中,常常会遇到一些特定的需求,例如为每个用户请求单独创建日志文件,或在发生某一个关键事件时及时发送通知。这些需求超出了内置回调处理器的能力范围,而自定义回调处理器在此时发挥了重要的作用。为了真正充分利用回调处理器,需要设计并实现自己的处理器。每一个链,从它被创建到最终被销毁,都会经历多个关键阶段。在链的生命周期中,每一个阶段都可能会触发某些事件。为了确保在恰当的时机介人并执行相应的操作,需要深入了解每一个阶段并对其进行精确的控制。这样,当链处于某个特定的阶段时,就可以在相应的回调处理器方法中执行预定的代码。

    在某些情况下,可能只希望在特定的请求中执行特定的代码,而不是在链的整个生命周期中。这种需求可以通过请求回调来实现。请求回调为实现这种特定请求提供了灵活性。例如,在一个场景中,你只希望在某个特定的请求中记录日志,而不是在所有的请求中都这样做。通过使用请求回调,你可以轻松地达到这个目的。不过,无论如何设计和使用回调处理器,最关键的始终是理解自己的业务逻辑需求。只有清晰地知道自己想要达到的目的,才能在正确的回调处理器方法中插入合适的代码,确保在合适的时机执行正确的操作。自定义回调处理器提供了一个强大的框架,但如何充分利用这个框架,最终取决于对业务需求的理解和技术的运用。

    在编写自定义回调处理器之前,了解其背后的基础类是非常重要的。BaseCallbackHandler正是这样一个核心类,其提供了一个强大而灵活的框架,可以轻松地响应和处理各种事件。这个类定义了一系列的方法,每一个都与LangChain中的一个特定事件相对应。只有深入理解了这些事件和方法,才能有效地为应用编写自定义的回调处理器。

  1. LLM事件on_Ilm_start:当LLM启动并开始处理请求时,这个方法会被调用。它提供了一个机会,例如,初始化某些资源或记录开始时间。on_llm_new_token:当LLM生成一个新的令牌时,这个方法就会被执行。它在流式处理中特别有用,其允许实时捕获和处理每一个生成的令牌。on_Ilm_end:当LLM完成任务并生成了完整的输出时,这个方法就会被调用。它提供了一个机会进行清理操作或记录任务的完成时间。on_llm_error:如果在LLM处理过程中发生任何错误,则这个方法将会被执行。可以在这个方法中添加错误日志或执行其他的错误处理操作。
  2. 聊天模型事件on_chat_model_start:这个方法在Chat Model类模型包装器开始工作时被调用。它提供了一个机会进行初始化操作或其他准备工作。
  3. 链事件on _hain_start::当链开始执行时,这个方法会被调用。可以在这个方法中进行一些初始化操作。on_chain_end:在链完成所有任务后,这个方法就会被执行。它提供了一个机会进行清理操作或收集结果。on_chain_error:如果链在执行过程中遇到错误,则这个方法将会被调用。它许进行错误处理或日志记录。
  4. 工具事件on_tool_start:当工具开始执行任务时,这个方法就会被调用。on_tool_end:在工具成功完成任务后,这个方法就会被执行。on_tool _error:如果工具在执行过程中发生错误,则这个方法将会被执行。
  5. 其他事件on_text:当需要处理任意文本时,这个方法会被调用。它提供了一个机会对文本进行处理或分析。on_agent_action:当代理执行某个特定的操作时,这个方法就会被执行。on_agent_finish:在代理完成所有操作后,这个方法就会被调用。

    BaseCallbackHandler是一个强大的基础类,使开发者可以轻松地定义和处理各种事件。深人理解这个基础类是编写自定义回调处理器的关键。如果你要自定义自己的回调处理器,则可以继承BaseCallbackHandler并重写你需要的方法。例如,如果你想在大语言模型开始输出时打印一条消息,则可以这样做:

class MyCallbackHandler(BaseCallbackHandler):def on_llm_start (self,serialized,prompts,kwargs):print ("LLM has started!")

    一旦你自定义了自己的回调处理器,就可以将其传递给LLMChain,以便在相应的事件发生时执行你的方法。例如:

handler =MyCallbackHandler()
chain =LLMChain(llm=llm,prompt=prompt,callbacks=(handler])

相关文章:

回调处理器

文章目录 什么是回调处理器回调处理器的工作流程回调处理器的使用自定义链组件中的回调 内置回调处理器自定义回调处理器 在编程领域中,回调是一个非常重要的概念。简而言之,回调是一种特殊的函数或方法,它可以被传递给另一个函数作为参数&am…...

国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!

1 文件操作 2 应用场景 在文件编辑过程中,有时需要对文件进行一些操作,比如:在命令窗口输入文件路径、文件名,进入到文件目录,对文件进行压缩等,如果没有直达命令,用户需要通过文件管理器找到目…...

23种设计模式 - 解释器模式

模式定义 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言(如数控系统的G代码)定义文法规则,并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类,实现…...

深度学习在语音识别中的应用

引言 语音识别技术是人工智能领域中的一个重要分支,它使得机器能够理解和转换人类的语音为文本。深度学习的出现极大地推动了语音识别技术的发展。本文将介绍如何使用深度学习构建一个基本的语音识别系统,并提供一个实践案例。 环境准备 在开始之前&a…...

【相聚青岛】人工智能与材料国际学术会议即将召开

一、大会简介 人工智能与材料国际会议(ICAIM 2025) 官方网站:www.ic-aim.net 官方邮箱:icaim2025163.com 会议时间:2025年3.21-24 会议地点:中国青岛 会议检索:EI检索 截稿时间:2月…...

PHP会务会议系统小程序源码

📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…...

能够私有化部署的集装箱箱号识别软件,技术实现方法

启智畅想集装箱箱号识别软件是一种基于计算机视觉和OCR(光学字符识别)技术的工具,主要用于自动识别集装箱上的唯一编号(如ISO6346标准的箱号,格式为4位字母7位数字1位校验码)。以下是关于此类软件的关键信息…...

idea连接gitee后.反向创建仓库和分支

文章目录 自动关联你登录的账号填写你的仓库和分支完成后会在gitee上创建一个仓库 (使用idea远程兼容gitee并反向创建仓库和分支) 自动关联你登录的账号 填写你的仓库和分支 完成后会在gitee上创建一个仓库...

Java——面向对象编程

面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性之一。它通过将现实世界中的事物抽象为对象,使程序更易于理解、维护和扩展。以下是Java面向对象编程的详细介绍: 1. 面向对象编程的四大特性 Java的面向对象编程…...

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型(LLM)本地运行框架,旨在简化大模型的部署和管理流程,使开发者、研究人员及爱好者能够高效地在本地环境中实验和…...

从猜想终结到算法革新,弹性哈希开启数据存储新篇章

目录 哈希表的前世今生基本原理从传统到现代:哈希表的演变历程 安德鲁 克拉皮文及其团队的创作历程弹性哈希详解基本原理优点技术细节 漏斗哈希解析基本原理优点技术细节 新算法的实际应用案例电子商务推荐系统金融交易监控系统社交媒体内容过滤物联网设备管理 结论…...

云端SaaS系统架构设计

随着互联网的发展,SaaS(软件即服务)架构在众多行业中得到了广泛应用。作为一种高效、可扩展的服务模式,SaaS不仅提升了企业的信息化水平,也使得服务提供商能够通过云计算平台实现全球范围内的业务交付。在设计一个现代…...

黑盒测试和白盒测试的主要优缺点

黑盒测试 vs. 白盒测试:优缺点对比 类别黑盒测试(Black-box Testing)白盒测试(White-box Testing)定义不关注代码实现,仅测试功能和输入输出关注代码逻辑,测试代码内部实现测试依据需求文档、功…...

获取每月最后一个工作日:考虑法定节假日与调休

在许多业务场景中,了解每个月的最后一个工作日对于财务结算、报告生成等至关重要。然而,确定这一日期时必须考虑到国家的法定节假日以及可能存在的调休安排。本文将介绍如何通过Java编写一个工具类来获取指定月份的最后一个工作日,并利用第三…...

Hayabusa:一款针对Windows事件日志的威胁搜索与取证分析工具

关于Hayabusa Hayabusa是一款针对Windows事件日志的威胁搜索与取证分析工具,该工具基于内存安全的Rust开发,支持多线程运行,并且是唯一完全支持 Sigma 规范(包括 v2 关联规则)的开源工具。 Hayabusa本质上是一个Windo…...

leetcode_位运算 190.颠倒二进制位

190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。 1. 字符串 class Solution:# param n, an integer# return an integerdef reverseBits(self, n):res "" # 创建一个保存结果的空字符串for b in str(bin(n))[2:]:# 遍历n的二进制数res b res # 把每…...

O1 Embedder:让检索器思考后再行动

25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大,彻底改变人们获取和利用信息的方式。值得注意的是,LLM 擅长执行细粒度数据表示,这有助于精确检索信息。它…...

Python项目中一些常用的关键字

数据定义与类型相关 int:表示整数类型。 float:用于表示浮点数类型。 str:字符串类型,用于处理文本数据。 bool:布尔类型,取值为True或False。 list:列表类型,可存储多个元素&am…...

Java 反射 (Reflection) 详解

一、什么是 Java 反射? Java 反射 (Reflection) 是 Java 语言的一个强大特性,它允许 在运行时 检查和修改类、接口、字段和方法的信息,而不需要在编译时知道这些信息。 换句话说,反射可以让你在程序运行过程中“动态”地获取类的…...

MicroPython使用ESP32和acs712模块测量电流

我们在做物联网应用时,电流检测是监控设备能耗、优化电源管理的重要手段,本文介绍如何利用MicroPython开发ESP32与ACS712霍尔电流传感器模块,实现高精度电流测量,并提供硬件连接、代码实现及校准方法,适用于智能家居、…...

Rust编程语言入门教程 (七)函数与控制流

Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo&#x1f…...

pdf预览在vue项目中的使用兼容ie浏览器

一、下载pdf预览插件 链接: https://pan.baidu.com/s/1wuzay-saAfiqtS-efd-cvw?pwd6m78 提取码: 6m78 二、创建一个pdf文件夹,将下载下来的文件build和web文件夹复制到pdf文件夹下 三、项目中使用 (路径由两部分组成,第一部分是项目存放pdf插件的路径…...

二级指针略解【C语言】

以int** a为例 1.二级指针的声明 a 是一个指向 int*(指向整型的指针)的指针,即二级指针。 通俗的讲,a是一个指向指针的指针,对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...

前端基础入门:HTML、CSS 和 JavaScript

在现代网页开发中,前端技术扮演着至关重要的角色。无论是个人网站、企业官网,还是复杂的 Web 应用程序,前端开发的基础技术 HTML、CSS 和 JavaScript 都是每个开发者必须掌握的核心技能。本文将详细介绍这三者的基本概念及其应用 一、HTML——网页的骨架 HTML(HyperText …...

测试 FreeSWITCH 的 sip_invite_route_uri

bgapi originate sofia/external/123461.132.230.73:5161 &echo 得到的是: 172.17.129.123:5088 -> 61.132.230.73:5161 INVITE sip:123461.132.230.73:5161 SIP/2.0 Via: SIP/2.0/UDP 8.141.11.8:5088;rport;branchz9hG4bKcagQFyUgF21NS Max-Forwards: 70 …...

网络安全中的机器学习

当涉及到网络安全时,技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中,我将介绍一些当前在网络安全领域使用的关键技术,包括加密,身份验证和防火墙。 首先,加密是网络安全中最常见的技术之一。加密是指使用算…...

Electron通过ffi-napi调用dll导出接口

electron使用ffi-napi环境搭建 附打包好的ffi-napi可以直接放到项目目录下使用,避免以后麻烦 一、安装node.js Node.js官网:https://nodejs.org/zh-cn/download,选择LTS长期稳定版本即可 需要注意Node.js 区分32和64位,32位版…...

使用 DeepSeek + 语音转文字工具 实现会议整理

目录 简述 1. DeepSeek与常用的语音转文字工具 1.1 DeepSeek 1.2 讯飞听见 1.3 飞书妙记 1.4 剪映电脑版 1.5 Buzz 2. 安装Buzz 3. 使用DeepSeek Buzz提取并整理语音文字 3.1 使用 Buzz 完成语音转文字工作 3.2 使用 DeepSeek 进行文本处理工作 3.3 整理成思维导图…...

RAGFLOW使用flask转发的open ai接口

flask转发openai标准接口 背景 搭建RAGFLOW 的过程中,遇到一个比较严重的问题,公司部署的大模型代理需要获取token,且token存在有效期5分钟,在RAGFLOW中不能直接用,所以希望通过flask项目转发请求。 方案 比较好的…...

语音芯片非隔离电源供电WT5104

语音芯片非隔离电源供电WT5104 语音芯片供电非隔离电源芯片 WT5104 介绍 在语音相关设备的运行中,稳定的电源供应是确保语音芯片正常工作、实现高质量语音交互的关键。WT5104 作为一款专为多种设备供电设计的非隔离电源芯片,能将常见的 220V 交流电高效转…...

P8752 [蓝桥杯 2021 省 B2] 特殊年份——string提取索引转换为值

这里写目录标题 链接题目代码大佬解答string提取索引转换为值 链接 P8752 [蓝桥杯 2021 省 B2] 特殊年份 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue&g…...

玩机日记 12 群晖部署AList并配置SSL,安装opkg,使用rclone挂载到本地

目录 1、部署alist&#xff0c;配置ssl 安装alist 参考官方文档添加网盘 配置ssl 开启webdav访问 2、安装opkg 修改环境变量 添加计划任务 3、安装配置rclone挂载alist 安装rclone&#xff0c;新建remote 安装fuse3 挂载AList 添加计划任务 1、部署alist&#xff0…...

Fastgpt学习(5)- FastGPT 私有化部署问题解决

1.☺ 问题描述&#xff1a; Windows系统&#xff0c;本地私有化部署&#xff0c;postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…...

我们来学nginx -- work process

题记 回看困惑工作进程能处理大量的并发请求几乎不会阻塞Worker进程可绑定到固定的核&#xff0c;避免CPU频繁地上下文切换看样子&#xff0c;还得转为人话 大白话 作为一般的应用的开发大部分人没有很强的底层技术基础如果深究&#xff0c;涉及复杂技术点&#xff0c;很容易…...

2000-2019年各省农业机械总动力数据

2000-2019年各省农业机械总动力数据 1、时间&#xff1a;2000-2019年 2、指标&#xff1a;行政区划代码、地区、年份、农业机械总动力(万千瓦) 3、范围&#xff1a;31省 4、来源&#xff1a;国家统计局、统计年鉴 5、指标解释&#xff1a;‌农业机械总动力‌是指主要用于农…...

Nginx 常用命令和部署详解及案例示范

一、Nginx常用命令 1.1 启动 Nginx 要启动 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重启 Nginx 在修改了 Nginx…...

从零开始用STM32驱动DRV8301:无人机/机器人电机控制指南

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、为什么需要专业电机驱动&#xff1f;二、硬件架构深度解析2.1 STM32微控制器核心作用2.2 DRV8301三大核心功能功能…...

HTML5 面试题

1. HTML5 新增了哪些重要特性&#xff1f; 语义化标签&#xff1a;这些标签有助于提高页面的可读性和可维护性。多媒体支持&#xff1a;HTML5 引入了 和 标签&#xff0c;可以直接嵌入音频和视频文件&#xff0c;无需依赖插件。本地存储&#xff1a;引入了 localStorage 和 se…...

获取指定的python库安装路径

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; ---------------------------------------…...

C语言预处理学习笔记

1. 预处理器的功能 预处理器&#xff08;Preprocessor&#xff09;在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头&#xff0c;主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容&#xff0c;通常用…...

动态内存分配算法对比:最先适应、最优适应、最坏适应与邻近适应

动态内存分配算法对比&#xff1a;最先适应、最优适应、最坏适应与邻近适应 在操作系统中&#xff0c;动态内存分配算法用于管理空闲内存块的分配和回收。最先适应算法&#xff08;First Fit&#xff09;、最优适应算法&#xff08;Best Fit&#xff09;和最坏适应算法&#x…...

Flutter 常见布局模型

Flutter的常见的布局模型有容器&#xff08;Container&#xff09;、弹性盒子布局&#xff08;Flex、Row、Column、Expanded&#xff09;、流式布局&#xff08;Wrap、Flow&#xff09;、层叠布局&#xff08;Stack、Position&#xff09;、滚动布局&#xff08;ListView、Grid…...

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…...

文献阅读 250220-Convective potential and fuel availability complement near-surface

Convective potential and fuel availability complement near-surface weather in regulating global wildfire activity 来自 <https://www.science.org/doi/10.1126/sciadv.adp7765> ## Abstract: 炎热、干燥、多风、无雨的条件有利于野火——这种关于火灾天气的知识为…...

ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

本文主要介绍如何通过ASP.NET Core的JwtBearerEvents机制&#xff0c;实现JWT认证失败响应的深度定制。 1. 背景 在之前的文章《一个简单的ASP.NET一致性返回工具库》 中&#xff0c;我们介绍了 Sang.AspNetCore.CommonLibraries 这一通用库&#xff0c;它通过统一API响应模型…...

AI大模型生成Logo图形商标,快速可选性强!

在申请注册商标时&#xff0c;不仅有文字商标&#xff0c;还有图形商标&#xff0c;及文字和图形的组合商标&#xff0c;如何更好的实现快速出图和对图形描述的要求&#xff0c;普推知产商标老杨近期也是研究测试了各种大模型。 最后选了AI模型本地部署及API接入生成图形商标的…...

Python爬虫实战:爬取豆瓣电影

目录 引言 1. 爬虫基础 1.1 什么是爬虫&#xff1f; 1.2 Python爬虫常用库 2. 实战&#xff1a;抓取豆瓣电影Top250 2.1 安装依赖库 2.2 发送HTTP请求 ​编辑 2.3 解析HTML ​编辑 2.4 存储数据 2.5 完整代码 3. 进阶&#xff1a;处理分页和动态内容 3.1 抓取多页…...

嵌入式0xDEADBEEF

在嵌入式系统中&#xff0c;0xDEADBEEF 是一个常见的“魔数”&#xff08;magic number&#xff09;&#xff0c;通常用于调试和内存管理。它的含义和用途如下&#xff1a; 1. 调试用途 未初始化内存的标记&#xff1a;在调试时&#xff0c;0xDEADBEEF 常用于标记未初始化或已…...

python入门笔记5-集合与字典

元组 Python 的元组&#xff08;tuple&#xff0c;简写为tup&#xff09;与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号​()​&#xff0c;列表使用方括号​[]​。 好处就是节省内存。 集合 集合是无序、不重复元素的容器。 用 {} 或 set() 创建…...

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1?安装nginx的依赖插件 3.2 下载nginx ?3.3?创建一个目录作为nginx的安装路径 ?3.4?解压 ?3.5?进入解压后的目录 3.6?指定nginx的安装路径 ?3.7?编译和安装nginx 3.8 启动nginx ?…...