LangChain
文章目录
- 一、LangChain 是什么?
- 二、核心概念
- 1. LLM Wrappers
- 2. Prompt Templates
- 3. Indexes
- 4. Chains
- 5. Agents
- 三、工作流程
- 四、应用场景
- 示例一:简单的语言模型调用
- 示例二:使用Prompt Templates(提示模板)
- 示例三:使用Indexes
- 示例四:构建一个简单的Chain(链)
- 示例五:利用Agents(代理)与外部工具交互(以使用SerpAPI进行搜索并回答问题为例)
LangChain
Introduction | 🦜️🔗 LangChain
一、LangChain 是什么?
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它具有连接数据、执行行动、无需硬编码等优势,其结构类似数据库领域的 JDBC,通过三个核心组件实现增强。
LangChain 框架可以实现数据感知和环境互动,将大型语言模型与外部的计算和数据源结合起来,目前提供了 Python 和 JavaScript(确切地说是 TypeScript)的软件包。其工作原理是通过三个核心组件:Components “组件”、Chains “链” 和 Agents “代理”,来提升大型语言模型(LLMs)的功能。
Components “组件” 为 LLMs 提供接口封装、模板提示和信息检索索引;Chains “链” 将不同的组件组合起来解决特定的任务,比如在大量文本中查找信息;Agents “代理” 使得 LLMs 能够与外部环境进行交互,例如通过 API 请求执行操作。
LangChain 的应用场景非常广泛,包括个人助手、学习辅助、数据分析和数据科学等。它可以帮助预订航班、转账、缴税,参考整个课程大纲帮助更快学习材料,连接公司客户数据或市场数据促进数据分析进展等。
二、核心概念
1. LLM Wrappers
LLM Wrappers 允许连接到大型语言模型,如 GPT-4 或 Hugging Face 提供的模型。它作为一个包装器,为开发人员提供了一种便捷的方式来与这些强大的语言模型进行交互,使得开发基于语言模型的应用程序变得更加容易。
2. Prompt Templates
Prompt Templates 可以动态生成查询,避免硬编码文本输入。这些模板包含一个文本字符串,可以接受来自用户的一组参数并生成提示。它可能包含对语言模型的指令、一些示例以及对语言模型的问题,帮助引导语言模型生成更好的响应。
3. Indexes
Indexes 帮助从语言模型中提取相关信息。LangChain 提供了多种文档加载器、文档转换器和检索器,能够从各种来源加载文档,将大型文档分割成较小的块,并通过文本嵌入模型为文档创建嵌入向量,以便在向量存储中进行高效检索和语义匹配。
4. Chains
Chains 将多个组件组合在一起,解决特定任务,构建完整的语言模型应用程序。例如,LLMChain 将 LLM 和 prompt 组合在一起,接受用户输入,格式化提示词模板,然后将格式化后的响应传递给 LLM。此外,还有 SimpleSequentialChain 和 SequentialChain 等类型的链,可以将多个链组合在一起,实现更复杂的任务。
5. Agents
Agents 允许语言模型与外部 API 交互。通过 Agents,语言模型可以执行特定的任务,如调用外部 API 获取信息、执行操作等,从而使语言模型能够与外部环境进行交互,进一步扩展了其应用范围。
三、工作流程
-
用户提问:
用户向基于 LangChain 开发的应用程序提出问题,这个问题可以是关于各种领域的查询、请求特定的操作或者寻求解决方案等。 -
问题转换成向量表示,在向量数据库中进行相似性搜索:
当用户提出问题后,问题会被转换成向量表示。这种向量表示能够捕捉问题的语义特征,以便在向量数据库中进行高效的相似性搜索。向量数据库中存储了大量的文本信息,这些信息也以向量的形式存在。通过计算问题向量与数据库中向量的相似度,可以快速找到与用户问题最相关的信息块。 -
从向量数据库中提取相关信息块,并输入给语言模型:
根据相似性搜索的结果,从向量数据库中提取出最相关的信息块。这些信息块包含了可能与用户问题相关的知识、数据或上下文信息。然后,将这些信息块输入给语言模型,为语言模型提供更多的背景信息和参考依据。 -
语言模型提供答案或执行操作:
语言模型在接收到用户的初始问题和从向量数据库中提取的相关信息后,利用其强大的语言理解和生成能力,提供答案或执行特定的操作。如果是回答问题,语言模型会根据问题和相关信息生成准确、详细的回答;如果是执行操作,语言模型会根据指令调用相应的外部 API 或执行其他任务。
四、应用场景
-
个人助手,可帮助预订航班、转账、缴税等。
LangChain 在个人助手方面具有很大的潜力。它可以通过与各种外部系统的交互,实现诸如预订航班、转账和缴税等任务。例如,通过连接到航空公司的预订系统,LangChain 可以根据用户的需求查询航班信息、进行座位选择并完成预订流程。在转账方面,它可以与银行系统集成,实现安全快速的资金转移。对于缴税,LangChain 可以协助用户准备所需的文件和信息,并与税务机构的系统进行交互,确保税款的准确缴纳。 -
学习辅助,参考课程大纲,加快学习材料。
在学习辅助方面,LangChain 能够参考整个课程大纲,为学生提供更高效的学习体验。它可以分析课程大纲中的知识点,根据学生的学习进度和需求,提供个性化的学习材料推荐。例如,当学生学习某个特定主题时,LangChain 可以检索相关的教材、文章、视频等资源,并以简洁明了的方式呈现给学生。此外,它还可以回答学生在学习过程中遇到的问题,帮助他们更好地理解和掌握知识。 -
数据分析和数据科学,连接公司数据,促进数据分析进展。
在数据分析和数据科学领域,LangChain 可以连接公司的客户数据或市场数据,极大地促进数据分析的进展。它可以与各种数据源进行集成,包括数据库、数据仓库和云存储服务。通过对这些数据的分析,LangChain 可以帮助企业发现潜在的趋势和模式,为决策提供有力支持。例如,在市场营销方面,它可以分析客户行为数据,为企业制定更精准的营销策略。在金融领域,LangChain 可以分析市场数据,为投资决策提供参考。
以下是一些使用LangChain的简单代码示例,以帮助你初步了解其基本用法,示例涵盖了几个常见的应用场景,这里以Python语言为例(确保你已经安装了 langchain
库以及对应的语言模型相关依赖等,比如连接OpenAI API的话要安装 openai
库并配置好相应的API密钥)。
示例一:简单的语言模型调用
这个示例展示了如何通过LangChain连接到OpenAI的语言模型(此处以 text-davinci-003
为例,实际可根据你的权限和需求换用其他模型),并发送一个简单文本提示来获取回复。
from langchain.llms import OpenAI# 设置OpenAI API密钥(替换为你真实的密钥,实际应用中要注意密钥安全,不要明文写在代码里,可通过环境变量等方式配置)
import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"# 初始化语言模型实例
llm = OpenAI(model_name="text-davinci-003", temperature=0)# 输入一个提示文本
prompt = "请描述一下人工智能在医疗领域的应用有哪些"
# 获取语言模型的回复
response = llm(prompt)
print(response)
示例二:使用Prompt Templates(提示模板)
Prompt Templates可以让你动态地构造发送给语言模型的提示,方便根据不同输入灵活调整。
from langchain.llms import OpenAI
from langchain import PromptTemplate# 同样先设置好API密钥
import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"# 定义一个简单的提示模板,有一个占位符{topic}
template = "请给我详细介绍一下{topic}相关的知识"
prompt_template = PromptTemplate(input_variables=["topic"],template=template
)# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)# 填入具体的话题值
topic = "区块链技术"
formatted_prompt = prompt_template.format(topic=topic)# 发送格式化后的提示给语言模型并获取回复
response = llm(formatted_prompt)
print(response)
示例三:使用Indexes
以下是一个使用LangChain中Indexes相关功能的示例代码,展示了如何从本地文本文件中加载文档,进行分割、创建嵌入向量,并实现基于向量存储的检索,以从文档中提取相关信息,这里以使用 Chroma
作为向量数据库(你需要提前安装 langchain
、 chromadb
以及相关的嵌入模型相关依赖等,示例中嵌入模型采用 OpenAIEmbeddings
,意味着还需要配置好 OpenAI_API_KEY
环境变量并安装 openai
库)为例:
import os
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalChain
from langchain.llms import OpenAI# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"# 1. 加载文档
# 假设你有一个本地的文本文件(这里以example.txt为例,你可替换为实际的文档路径)
loader = TextLoader('example.txt')
documents = loader.load()# 2. 分割文档
# 使用递归文本分割器将大型文档分割成较小的块,方便后续处理
text_splitter = RecursiveTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)# 3. 创建嵌入向量
# 使用OpenAI的嵌入模型为分割后的文档块创建嵌入向量
embeddings = OpenAIEmbeddings()# 4. 存储到向量数据库(这里使用Chroma)
# 将文档嵌入向量存储到Chroma向量数据库中,会自动根据向量进行索引,便于检索
docsearch = Chroma.from_documents(texts, embeddings)# 5. 创建检索链
# 结合语言模型和检索器构建检索链,用于后续查询并提取相关信息
llm = OpenAI(model_name="text-davinci-003", temperature=0)
qa = RetrievalChain.from_llm(llm, docsearch.as_retriever())# 6. 进行查询并获取相关信息
query = "文档中提到的主要技术优势有哪些"
result = qa({"question": query})
print(result['answer'])
在上述示例中:
- 首先通过
TextLoader
从本地文本文件加载文档内容,它可以处理多种常见的文本格式文件。 - 接着利用
RecursiveTextSplitter
把加载进来的文档按照指定的块大小(这里是1000个字符)分割成一个个较小的文本块,避免处理过大文本时的不便,且设置了块重叠为0(可根据实际情况调整重叠情况以保证语义连贯性等)。 - 然后借助
OpenAIEmbeddings
嵌入模型为这些分割好的文本块创建嵌入向量,使得文本能够在向量空间中有对应的语义表示。 - 使用
Chroma
向量数据库存储这些带有嵌入向量的文本块,它会自动构建索引方便后续基于语义的检索操作。 - 最后构建了
RetrievalChain
,将OpenAI
语言模型和向量数据库的检索器结合起来,这样当输入一个查询问题时,检索链会先从向量数据库中检索出和问题语义相关的文本块,再传递给语言模型进行处理,最终返回提取到的相关信息作为答案。
你可以根据实际需求,替换文本文件内容、调整分割策略、更换向量数据库等,以适应不同的应用场景,比如处理大量的技术文档、新闻文章等,来高效提取你所需的信息。
请注意,不同版本的库以及具体的应用场景可能需要对代码进行适当调整,并且要确保遵循各服务(如OpenAI等)的使用条款和隐私政策,妥善保管好API密钥等敏感信息。
示例四:构建一个简单的Chain(链)
Chains可以把多个组件(比如多个操作或者不同的语言模型调用等)组合起来完成更复杂的任务,以下是一个简单的顺序链示例,先对输入文本进行格式化,再传递给语言模型获取回复。
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain import PromptTemplateimport os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"# 定义提示模板
template = "对下面这段话进行总结:{text}"
prompt_template = PromptTemplate(input_variables=["text"],template=template
)# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)# 创建链,将提示模板和语言模型关联起来
chain = LLMChain(llm=llm, prompt=prompt_template)# 待处理的文本内容
text = "人工智能在诸多领域都有着广泛应用,比如医疗领域能辅助诊断疾病,交通领域能优化路况调度,教育领域可以个性化教学等等,它正深刻改变着人们的生活和各行业的运作模式。"
# 通过链来处理文本并获取结果
result = chain.run(text)
print(result)
示例五:利用Agents(代理)与外部工具交互(以使用SerpAPI进行搜索并回答问题为例)
Agents可以让语言模型具备调用外部工具的能力,比如根据问题去搜索引擎查找信息后再整合回答。
首先确保安装了 langchain
以及 serpapi
库,并且配置好 SERPAPI_API_KEY
环境变量(在SerpAPI官网注册获取对应的API密钥)。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAIimport os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
os.environ["SERPAPI_API_KEY"] = "YOUR_SERPAPI_KEY"# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)
# 加载要使用的工具,这里是SerpAPI搜索引擎工具
tools = load_tools(["serpapi"], llm=llm)# 初始化代理,设置为零-shot模式(根据问题直接调用工具尝试解决,无需预先的示例训练)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)# 提出一个需要查询外部信息的问题
question = "最新的人工智能研究成果有哪些"
# 通过代理去处理问题,代理会决定是否调用工具及如何整合回答
response = agent.run(question)
print(response)
这些示例只是LangChain强大功能的冰山一角,你可以基于它去构建各种更复杂、更贴合实际业务需求的语言模型驱动的应用程序,比如聊天机器人、智能文档问答系统等。
请注意,代码中的API密钥等敏感信息要妥善保管,按照正规的安全规范来配置和使用,避免出现安全风险。同时,不同版本的LangChain以及对应的依赖库可能在接口等方面有细微变化,具体使用时可参考官方文档进行调整。
以下是使用LangChain实现调用ChatGPT并获得流式回答的示例代码,这里以Python语言为例,在运行代码前,请确保你已经安装了 langchain
、 openai
等相关库,并且配置好了有效的OpenAI API密钥(将其设置在环境变量 OPENAI_API_KEY
中)。
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
import timedef stream_chat_response():# 初始化ChatOpenAI实例,设置为流式响应模式chat = ChatOpenAI(streaming=True, temperature=0.7)# 构造消息列表,这里仅示例一个简单的用户消息,你可以根据需求扩展messages = [HumanMessage(content="请介绍一下人工智能在医疗领域的最新应用情况")]# 用于收集流式响应的内容full_response = ""for chunk in chat.stream(messages):content = chunk.contentprint(content, end='', flush=True)full_response += contenttime.sleep(0.05) # 适当添加延迟,让输出更平滑,可根据实际情况调整print() # 换行,确保输出格式美观return full_responseif __name__ == "__main__":stream_chat_response()
在上述代码中:
- 首先通过
ChatOpenAI
类来实例化语言模型对象,关键在于设置streaming=True
参数,这就开启了流式响应模式,使得模型的回复会以流的形式逐步返回,而不是一次性返回全部内容。 - 接着构造了发送给模型的消息列表,这里使用
HumanMessage
来表示用户输入的消息,你可以根据具体的应用场景,增加更多的消息来丰富对话上下文等。 - 然后通过
chat.stream(messages)
来发起流式调用,它会逐个返回包含回复内容的块(chunk),在循环中获取每个块的内容,并将其输出展示(这里简单地直接打印,你也可以将其传递到前端界面等其他地方用于实时显示给用户),同时累加到full_response
变量中,以便后续如果需要完整保存整个回复内容可以使用。另外添加了一个小的时间延迟(通过time.sleep
)是为了让输出在视觉上更加平滑,避免内容过快刷出而影响阅读体验,这个延迟时间可以根据实际网络情况以及期望的展示效果等进行适当调整。
这样,运行代码时就能看到ChatGPT的回复以流式的方式逐字或逐段地呈现出来,模拟了更加自然流畅的对话交互体验。
请注意,使用OpenAI API需遵循其相应的使用条款和政策,并且要确保API密钥的安全性,防止泄露。同时不同版本的 langchain
等库可能在接口细节等方面有细微变化,具体使用时可参考官方文档进一步优化代码。
LangChain 就是对这些通用逻辑做了封装,让使用者可以不用关注在与大模型之间的交互细节能够更专注在业务本身上,通过组合模块和能力抽象来扩展LLM 的能力,通过chain、agent、model等多种封装工具,提供了扩展 LLM 使用场景、便捷 LLM 调用方式的一系列功能。。
相关文章:
LangChain
文章目录 一、LangChain 是什么?二、核心概念1. LLM Wrappers2. Prompt Templates3. Indexes4. Chains5. Agents 三、工作流程四、应用场景示例一:简单的语言模型调用示例二:使用Prompt Templates(提示模板)示例三&…...
搭建分布式Hive集群
title: 搭建分布式Hive集群 date: 2024-11-29 23:39:00 categories: - 服务器 tags: - Hive - 大数据搭建分布式Hive集群 本次实验环境:Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3、Mysql-5.7.38、Hive-3.1.2 功能规划 方案一(本地运行模…...
Scala的惰性求值:深入理解与实践
在编程中,我们经常需要处理那些计算成本高昂或者可能永远不会用到的值。在这种情况下,惰性求值(Lazy Evaluation)是一种非常有用的策略。它允许我们推迟计算,直到这些值真正需要被使用。Scala,作为一种多功…...
游戏引擎学习第54天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体,这些实体位于玩家的视野中,频繁更新,而那些离玩家较远的实体则以较低的频率运…...
QT绘制同心扇形
void ChartForm::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿painter.save();// 设置无边框(不需要设置QPen,因为默认是不绘制边框的)QPen pen(Qt::NoPen);// QPen pen…...
梳理你的思路(从OOP到架构设计)_浅尝架构师的滋味02
目录 1、 App开发者的职责:买主提供需求知识,App开发者帮他写代码 撰写的代码 撰写代码,将装配(扩充)到 2、 从生活中体会 基於軟硬整合觀點“两种知识” 编辑 1、 App开发者的职责:买主提供需求知识,App开发者帮…...
使用VLC 搭建 RTSP 服务器
第一步:打开 VLC ,媒体--->流 第二步:添加一个选择本地的文件,然后点击选择"串流" 第三步:确认你选择的文件,然后点击下一个 第四步: 配置 选择的视频文件使用哪种 流输出…...
什么是大型语言模型
大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法,可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个…...
游卡,科锐国际,蓝禾,汤臣倍健,顺丰,途游游戏25秋招内推
游卡,科锐国际,蓝禾,汤臣倍健,顺丰,途游游戏25秋招内推 ①科锐国际25届秋招补录 人力资源类岗位,补录城市:上海,苏州,锦州;全日制公办本科及以上 25届应届毕业…...
Linux -- 线程控制相关的函数
目录 pthread_create -- 创建线程 参数 返回值 代码 -- 不传 args: 编译时带 -lpthread 运行结果 为什么输出混杂? 如何证明两个线程属于同一个进程? 如何证明是两个执行流? 什么是LWP? 代码 -- 传 args&a…...
【Linux】Linux内核启动流程分析
Linux 内核的启动流程要比 uboot 复杂的多,涉及到的内容也更多,因此我们大致的了解一下Linux 内核的启动流程即可。 Linux启动流程 启动过程可以分为以下几个主要步骤: 1.引导加载程序(Bootloader)阶段 Linux 内核的…...
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙 uniapp不是仅支持低功耗蓝牙(基础蓝牙通讯不支持),有些可能需要基础蓝牙。我现在同步我的手机蓝牙列表低功耗,基础蓝牙都支持 /*** author wzj* 通用蓝牙模块封装* 搜索 ble 和非…...
OpenGL ES 03 加载3张图片并做混合处理
OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号,目的是为了告诉纹理采样器,从哪个纹理单元采集数据2.如果你没有显式地设置采…...
c++数据结构算法复习基础--13--基数算法
基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位(个位、十位。。。),所以取值范围就为0-9。 根据该特点,设计桶的概念 – 0号桶、1号桶… 1、思想 1)找出最长的数字,确定要处理的…...
基于YOLOv5的行人与帽子检测与识别说明文档
基于YOLOv5的行人与帽子检测与识别说明文档 1. 任务的内容和目标 1.1 任务目标 在计算机视觉领域,头盔检测至关重要,主要用于判定图像或视频里的人是否佩戴头盔。于工业生产、建筑工地、交通出行(如摩托车与自行车骑行)等高危场…...
Mybatis——(2)
2.2 Mybatis 工具类(了解) 为了简化MyBatis的开发,可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...
QT笔记- QSystemTrayIcon系统托盘功能完整示例
1. 创建托盘对象 // 创建托盘图标QSystemTrayIcon * trayIcon new QSystemTrayIcon(this);QIcon icon("://icon/test.png");trayIcon->setIcon(icon);trayIcon->show();trayIcon->connect(trayIcon, &QSystemTrayIcon::activated,this, &MainWindo…...
ElasticSearch08-分析器详解
零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。 (1ÿ…...
指针的深入讲解
本章重点: 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数 我们在指针的初阶的时候主要讲了: 1.指针就是变量,用来存放地址,地址唯一标识一块内存空间 2.指针的大小是固定4个…...
王佩丰24节Excel学习笔记——第十二讲:match + index
【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 vlookup与match,index 相结合使用match,index 结合,快速取得引用的值扩展功能,使用match/index函数,结合照相机工具获取照片 一、回顾…...
概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法
目录 1 折线图和散点图,对数据的处理差别 1.1 EXCEL画图的一些默认设置 1.2 多于2列的数据,也是如此 2 如果我们非要以第1列数据为X轴,做一个折线图呢?也能 2.1 首先,把第1列,想当成X轴的数据…...
387. 字符串中的第一个唯一字符
1,题目 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 2,代码 class Solution { public:int firstUniqChar(string s) {//记数排序int coutArr[26] {0};//统计字符出现…...
Oracle RAC最佳实践-优化私网连接
在 Oracle RAC 环境中,私网(Interconnect) 是节点之间通信和数据传输的关键部分。一直有个误解,认为私网(心跳网)只要能通随便什么交换机都可以,甚至有直连的,实际上私网的性能至关重要…...
[bug] StarRocks borker load意向之外的bug
意向之外,又清理之中 背景: StarRocks各方面碾压相同类型的数据库,最近我们要从生成HIVE导历史数据(ORC格式)到StarRocks,前期小测一下,在测试是没问题,上生产先导2个月的数据&…...
游戏AI实现-寻路算法(Dijkstra)
戴克斯特拉算法(英语:Dijkstras algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程: 1.首先设置开始节点的成本值为0,并将…...
9 OOM和JVM退出。OOM后JVM一定会退出吗?
首先我们把两个概念讲清楚 OOM是线程在申请堆内存,发现堆内存空间不足时候抛出的异常。 JVM退出的条件如下: java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程,服务于用户线程。 我们简单说下守护线程的功能: 1.日志的记录…...
Linux 端口操作
安装netstat yum -y install net-tools 检测端口占用 netstat -npl | grep "端口" 安装lsof lsof yum -y install lsof 检测端口占用 lsof -i :端口号 安装nc yum -y install nc 查看对方端口是否开放 nc -vz 对方ip 对方端口 安装telnet telnet yum -y in…...
【USB-HID】“自动化键盘“ - 模拟键盘输入
目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现,网…...
基于Spring Boot+Vue 的高校运动会管理系统
目录 1 绪论1.1研究背景1.2 研究意义1.3 相关开发技术简介1.3.1 Vue.js1.3.2 Spring Boot1.3.3 MySQL 2 系统分析2.1 需求分析2.1.1 功能需求2.1.2 非功能需求 2.2 系统可行性分析2.2.1 经济可行性2.2.2 技术可行性2.2.3 操作可行性 3 系统概要设计系统功能描述业务流程分析 4 …...
Linux应用程序中终止进程的几种方法
目录 1、正常退出进程的方法 1.1、exit(int status) 函数 1.2、_exit(int status) 函数 1.3、_Exit(int status) 函数 2、异常退出进程的方法 3、何时使用这些方法? 在 Linux 应用程序中,终止进程的方式有多种,通常取决于进程是否需要进…...
电脑文档损坏:原因剖析和修复方法
在使用电脑的过程中,许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑,特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作: 在编…...
了解ARM的千兆以太网——RK3588
1. 简介 本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...
【Nginx-4】Nginx负载均衡策略详解
在现代Web应用中,随着用户访问量的增加,单台服务器往往难以承受巨大的流量压力。为了解决这一问题,负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了多种负载均衡策略,能够有效地将请求分…...
低级计算机网络知识总结
1 应用层 1.1 HTTP(TCP) 浏览器访问WWW服务器过程:首先进行域名解析,然后通过TCP向服务器发送连接请求 HTTP本身是无连接,无状态的。无状态特性使服务器能够支持大量的并发HTTP请求。实际应用中,通常使用Cookie加数据库跟踪用户…...
linux sysrq的使用举例
在menuconfig中选择m和 *的区别: *: 模块驱动编译到内核中,启动时自动加载 M:标识作为内核模块编译 空格:表示该功能不编译到内核中,即新的内核将不支持该功能。 m:模块会被编译,但是不会被编译到内核中,只…...
数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?
TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…...
Oracle 适配 OpenGauss 数据库差异语法汇总
背景 国产化进程中,需要将某项目的数据库从 Oracle 转为 OpenGauss ,项目初期也是规划了适配不同数据库的,MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后,只写…...
【记录】Django解决与VUE跨域问题
1 梗概 这里记录Django与VUE的跨域问题解决方法,主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…...
Yolov10本地部署,torch找不到GPU问题解决
在本地部署跑Yolov10的模型.具体分为以下几步,也是踩了一些坑: 1.YoloV10 代码拉取 2.安装CUDA 1.查看CUDA支持版本 2.下载安装CUDA 3.下载CUDNN 3.创建python虚拟环境 Anaconda下载安装 虚拟环境安装配置 4.运行 1.yoloV10代码拉取 源码地址: GitHub - THU-MIG/yolov10: YOLO…...
el-upload 上传文件 入参格式为form-data格式,入参字段为code、name、type、file(文件)的形式,如何实现?
el-upload 是 Element UI 中用于文件上传的组件。如果你需要上传文件并将其封装为 form-data 格式,并且包含字段如 code、name、type 和 file,你可以通过自定义 before-upload 或 action 进行处理。 1. el-upload 的基本用法 Element UI 的 el-upload …...
VUE组件插槽使用示例,弹窗样式
在Vue.js中,插槽(slots)是一种非常强大的功能,它允许你在父组件中向子组件传递内容。插槽主要有三种类型:默认插槽、具名插槽和作用域插槽。下面是一些示例来展示如何使用这些插槽。 默认插槽 默认插槽是最简单的插槽…...
ARM嵌入式学习--第八天(PWM)
PWM -PWM介绍 PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面 PWM的频率 是指在1秒钟内,信号从…...
新能源汽车大屏可视化第三次数据存储
任务: 将数据存放到temp.csv 链接: 1.排行页面 https://www.dongchedi.com/sales 2.参数页面 https://www.dongchedi.com/auto/params-carIds-x-9824 完善打印: 1. [{‘series_id’: 5952, ‘series_name’: ‘海鸥’, ‘image’: ‘https://…...
linux 替换yum源镜像
1. 备份源镜像 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 下载国内镜像阿里云 如果没有wget可以用curl 代替 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清华大学 sudo wget -…...
SAP:如何修改已释放的请求
SAP:如何修改已释放的请求 QQ出了一个新功能,把10年前的旧日志推给自己。这个10年前的日志,是用户反映在SE10中把请求释放后发现漏了内容,想修改已释放的请求。经调查写了一个小程序,实现用户的需求。 *&-------------------…...
js的?. 和??和||有什么区别
let a 0; let b null; let c Hello;console.log(a ?? default); // 0 console.log(b ?? default); // "default" console.log(c ?? default); // "Hello"console.log(a || default); // "default" (因为 0 是假值) console.log(b |…...
clickhouse 分布式表创建、增加、更新、删除、查询
创建分布式表 --先创建本地表 设置自动过期时间3天 CREATE TABLE IF NOT EXISTS ck_database.ck_databaseon cluster default(cluster name) (table_id String COMMENT id,item_id String COMMENT 业务id,desc Int64 COMMENT 描述,time DateTime DEFAULT now() COMMENT 数据…...
推送本地仓库到远程git仓库
目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容,从新建库,同时创建一个 A.txt 文件 清空原有的远程仓库内容,重新创建一个新的仓库,…...
LSTM长短期记忆网络
LSTM(长短期记忆网络)数学原理 LSTM(Long Short-Term Memory)是一种特殊的递归神经网络(RNN),解决了标准RNN中存在的梯度消失(Vanishing Gradient) 和**梯度爆炸&#x…...
ABAP SQL 取日期+时间最新的一条数据
我们在系统对接的时候,外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的,那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案: 方式 1:SELECT MAX 可以通过两个 SELECT MAX 来取…...