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

[langchain教程]langchain03——用langchain构建RAG应用

RAG

RAG过程

离线过程:

  1. 加载文档
  2. 将文档按一定条件切割成片段
  3. 将切割的文本片段转为向量,存入检索引擎(向量库)

在线过程:

  1. 用户输入Query,将Query转为向量
  2. 从向量库检索,获得相似度TopN信息
  3. 将检索结果和用户输入,共同组成Prompt
  4. 将Prompt 输入大模型,获取LLM的回复

用langchian构建RAG

1. 加载文档

LangChain中的文档对象Document有两个属性:

  • page_content: str类型,记录此文档的内容。
  • metadata: dict类型,保存与此文档相关的元数据,包括文档ID、文件名等。

在langchain中,加载文档使用 文档加载器DocumentLoader 来实现,它从源文档加载数据并返回文档列表。每个DocumentLoader都有其特定的参数,但它们都可以通过.load()方法以相同的方式调用。

加载pdf

需要先安装pypdf库

pip install pypdf

PyPDFLoader加载pdf,输入是文件路径,输出提取出的内容列表:

from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader(file_path)
pages = []
for page in loader.load():pages.append(page)

返回的文档列表如下所示:

[
Document(metadata={'source': 'D:\\桌面\\RAG分析.pdf', 'page': 0}, page_content='11111111111111111111111111111111111111111111111111111111'), 
Document(metadata={'source': 'D:\\桌面\\RAG分析.pdf', 'page': 1}, page_content='2222222222222222222222222222222222222222222222222222222')
]

加载网页

简单快速的文本提取

对于“简单快速”解析,需要 langchain-community 和 beautifulsoup4 库:

pip install  langchain-community beautifulsoup4

使用WebBaseLoader,输入是url的列表,返回一个 Document 对象的列表,列表里的内容是一系列包含页面文本的字符串。在底层,它使用的是 beautifulsoup4 库。

import bs4
from langchain_community.document_loaders import WebBaseLoaderpage_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"loader = WebBaseLoader(web_paths=[page_url])
docs = loader.load()assert len(docs) == 1
print(docs)

这样提取出的基本上是页面 HTML 中文本的转储,可能包含多余的信息,提取的信息如下所示(截取了首部)

[Document(metadata={'source': 'https://python.langchain.com/', 'title': 'How to add memory to chatbots | 🦜️🔗 LangChain',},page_content='\n\n\n\n\nHow to add memory to chatbots | 🦜️🔗 LangChain\n\n\n\n\n\n\nSkip to main contentJoin us at  ')
]

如果了解底层 HTML 中主体文本的表示,可以通过 BeautifulSoup 指定所需的 <div> 类和其他参数。

下面仅解析文章的主体文本:

loader = WebBaseLoader(web_paths=[page_url],bs_kwargs={"parse_only": bs4.SoupStrainer(class_="theme-doc-markdown markdown"),},bs_get_text_kwargs={"separator": " | ", "strip": True},
)docs = []
async for doc in loader.alazy_load():docs.append(doc)assert len(docs) == 1
doc = docs[0]

提取出的内容如下所示:

[Document(metadata={'source': 'https://python.langchain.com/docs/how_to/chatbots_memory/'}, 	page_content='How to add memory to chatbots | A key feature of chatbots is their ability to use the content of previous conversational turns as context. ')
]

可以使用各种设置对 WebBaseLoader 进行参数化,允许指定请求头、速率限制、解析器和其他 BeautifulSoup 的关键字参数。详细信息参见 API 参考。

高级解析

如果想对页面内容进行更细粒度的控制或处理,可以用langchain-unstructured进行高级解析。

pip install langchain-unstructuredpip install unstructured

注意: 如果不安装unstructured会报错!

下面的代码不是为每个页面生成一个 Document 并通过 BeautifulSoup 控制其内容,而是生成多个 Document 对象,表示页面上的不同结构。这些结构包括章节标题及其对应的主体文本、列表或枚举、表格等。

from langchain_unstructured import UnstructuredLoaderpage_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"
loader = UnstructuredLoader(web_url=page_url)docs = []
for doc in loader.load():docs.append(doc)print(docs[:5])

输出如下所示(太长了,截取了部分):

[Document(metadata={'image_url': 'https://colab.research.google.com/assets/colab-badge.svg', 'link_texts': ['Open In Colab'], 'link_urls': ['https://colab.research.google.com/github/langchain-ai/langchain/blob/master/docs/docs/how_to/chatbots_memory.ipynb'], 'languages': ['eng'], 'filetype': 'text/html', 'url': 'https://python.langchain.com/docs/how_to/chatbots_memory/', 'category': 'Image', 'element_id': '76f10732f139a03f24ecf55613a5116a'}, page_content='Open In Colab'), Document(metadata={'category_depth': 0, 'languages': ['eng'], 'filetype': 'text/html', 'url': 'https://python.langchain.com/docs/how_to/chatbots_memory/','category': 'Title', 'element_id': 'b6bfe64119578f39e0dd7d0287b2964a'}, page_content='How to add memory to chatbots'), Document(metadata={'languages': ['eng'], 'filetype': 'text/html', 'parent_id': 'b6bfe64119578f39e0dd7d0287b2964a', 'url': 'https://python.langchain.com/docs/how_to/chatbots_memory/', 'category': 'NarrativeText', 'element_id': 'ac3524f3e30afbdf096b186a665188ef'},page_content='A key feature of chatbots is their ability to use the content of previous conversational turns as context. This state management can take several forms, including:'), Document(metadata={'category_depth': 1, 'languages': ['eng'], 'filetype': 'text/html', 'parent_id': 'b6bfe64119578f39e0dd7d0287b2964a', 'url': 'https://python.langchain.com/docs/how_to/chatbots_memory/', 'category': 'ListItem', 'element_id': '0c9193e450bacf9a4d716208b2e7b1ee'}, page_content='Simply stuffing previous messages into a chat model prompt.'), 
]

可以用doc.page_content来输出正文文本:

for doc in docs[:5]:print(doc.page_content)

输出如下所示:

Open In Colab
Open on GitHub
How to add memory to chatbots
A key feature of chatbots is their ability to use the content of previous conversational turns as context. This state management can take several forms, including:
Simply stuffing previous messages into a chat model prompt.    

2. 切割文档

当文档过长时,模型存在两方面问题:一是可能无法完整加载至上下文窗口,二是即便能加载,从中提取有用信息也较为困难。

为破解此困境,可将文档拆分成多个块来进行嵌入与存储,如此一来,分块后还能快速精准地定位到与查询最相关的部分。

在具体操作中,可以把文档按照每块 1000 个字符的规格进行拆分,同时在块之间设置 200 个字符的重叠。之所以设置重叠,是为了降低将某块有效信息与其关联的重要上下文被人为割裂开的风险,保证内容的连贯性与完整性。

以下代码采用的文本分割器是 RecursiveCharacterTextSplitter,它会利用常见分隔符对文档进行递归拆分,直至各块大小满足既定要求。此外,代码还启用了 add_start_index=True 的设置,使每个分割后的文档块在初始文档中的字符起始位置得以保留,这一位置信息将以元数据属性 “start_index” 的形式呈现。

from langchain_text_splitters import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(docs)

3. 将块转为向量存储到数据库

为了在运行时能够对文本块进行高效搜索,我们通常需要对文本块进行索引,而嵌入内容是实现这一目标的常见方法。

我们将每个文档分割后的文本块进行嵌入处理,并将这些嵌入插入到向量数据库中。当要搜索这些分割后的文本块时,可以将文本搜索查询进行嵌入,然后执行“相似性”度量,以识别出与查询嵌入最相似的存储文本块。其中,余弦相似性是一种简单且常用的相似性度量方法,它通过测量每对嵌入(高维向量)之间的角度的余弦值,来评估它们的相似程度。

我们可以通过Chroma 向量存储和 Ollama嵌入模型,完成对所有文档分割后的文本块的嵌入和存储工作。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddingsembedding = OllamaEmbeddings(model_url="http://localhost:11434")
vectorstore = Chroma.from_documents(documents=all_splits, embedding=embedding)

4. 检索

创建一个简单的应用程序,接受用户问题,搜索相关文档,并将检索到的文档和初始问题传递给模型以返回答案,具体步骤如下:

  • 定义搜索文档的逻辑:LangChain 定义了一个检索器接口,它封装了一个可以根据字符串返回相关文档的索引查询。检索器的唯一要求是能够接受查询并返回文档,具体的底层逻辑由检索器指定。

  • 使用向量存储检索器:最常见的检索器类型是向量存储检索器,它利用向量存储的相似性搜索能力来促进检索。任何 VectorStore 都可以轻松转换为一个 Retriever,使用 VectorStore.as_retriever() 方法。

retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 6})retrieved_docs = retriever.invoke("What are the approaches to Task Decomposition?")print(retrieved_docs[0].page_content)

输出如下所示:

Tree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.
Task decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.

5. 生成

生成时,将所有内容整合到一个链中,该链接受一个问题,检索相关文档,构建提示,将其传递给模型,并解析输出。

from langchain_community.document_loaders import UnstructuredURLLoader
from langchain_community.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.retrievers import VectorStoreRetriever
from langchain_community.prompts import PromptTemplate
from langchain_community.chains import RetrievalQA# 加载文档
page_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"
loader = UnstructuredURLLoader(urls=[page_url])# 拆分文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(loader.load())# 创建向量存储和嵌入
embedding = OllamaEmbeddings(model_url="http://localhost:11434")
vectorstore = Chroma.from_documents(documents=all_splits, embedding=embedding)
retriever = VectorStoreRetriever(vectorstore=vectorstore)# 构建提示和生成链
prompt_template = """Use the following context to answer the question at the end. If the answer isn't found in the context, just say that you don't know.{context}Question: {question}"""
PROMPT = PromptTemplate.from_template(prompt_template)# 创建 RAG 链
rag_chain = RetrievalQA.from_chain_type(retriever=retriever,chain_type="stuff",prompt=PROMPT
)# 执行查询
result = rag_chain.invoke("What are the approaches to Task Decomposition?")
print(result['result'])

相关文章:

[langchain教程]langchain03——用langchain构建RAG应用

RAG RAG过程 离线过程&#xff1a; 加载文档将文档按一定条件切割成片段将切割的文本片段转为向量&#xff0c;存入检索引擎&#xff08;向量库&#xff09; 在线过程&#xff1a; 用户输入Query&#xff0c;将Query转为向量从向量库检索&#xff0c;获得相似度TopN信息将…...

Android 图片加载框架 Glide 详细介绍

一、简单使用 1、加载图片 导入依赖 implementation("com.github.bumptech.glide:glide:4.16.0")编写代码 private static final String url = "http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg";btnPic.setOnClickList…...

vue2解析html中的公式,使用vue-katex

文本是markdown格式&#xff0c;需要解析markdown <p v-html"md.render(text)"></p>import MarkdownIt from markdown-it ...const mdRender MarkdownIt(); ...data中md: new MarkdownIt(),现在文本中会出现数学公式&#xff0c;解析使用vue-katex 1.…...

使用Unity Cache Server提高效率

2021年1月20日19:04:28 1 简介 Unity Cache Server,翻译过来就是Unity缓存服务器 1.1 缓存服务器の官方介绍 Unity 有一个完全自动的资源管线。每当修改 .psd 或 .fbx 文件等源资源时,Unity 都会检测到更改并自动将其重新导入。随后,Unity 以内部格式存储从文件导入的数…...

【C++】模板2.0

最近学习了一些模板的知识&#xff0c;速写本博客作为学习笔记&#xff0c;若有兴趣&#xff0c;欢迎垂阅读&#xff01; 1.非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名…...

深入解析 Linux 文件系统中的软硬链接:从原理到实践

引言 在 Linux 系统中&#xff0c;软链接&#xff08;Symbolic Link&#xff09; 和 硬链接&#xff08;Hard Link&#xff09; 是文件管理的两大核心机制。它们如同文件系统的“快捷方式”与“分身术”&#xff0c;既能节省存储空间&#xff0c;又能实现灵活的文件管理。但两…...

JumpServer多用户VNC桌面配置指南:实现多端口远程访问

在当今的云计算和远程工作环境中,高效且安全地管理多用户远程桌面访问变得越来越重要。本文将详细介绍如何在JumpServer中配置多个VNC桌面,以满足不同用户的远程访问需求。我们将以创建第二个桌面为例,为用户user2配置VNC访问。 一、背景说明 JumpServer作为一款优秀的开源…...

【数据结构入门训练DAY-19】总结数据结构中的栈

文章目录 前言一、栈的思想二、栈的解题思路结语 前言 本次训练内容&#xff1a; 栈的复习。总结栈的基本操作 一、栈的思想 在数据结构中&#xff0c;栈是一种很常见的算法。栈——就像你往桶里放东西似的&#xff0c;要取出桶内的物体就得先把桶顶的物品取出来&#xff…...

MyBatis-Plus 防止 SQL 注入最佳实践指南

&#x1f6ab; MyBatis-Plus 防止 SQL 注入最佳实践指南 作者&#xff1a;William Dawson 标签&#xff1a;Java、MyBatis-Plus、安全、SQL 注入、防护 &#x1f4a5; 什么是 SQL 注入&#xff1f; SQL 注入是一种常见的安全漏洞&#xff0c;攻击者通过恶意构造 SQL 输入参数&…...

AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能为 RapidOCR)和 plumberpdf 的对比分析及使用建议

目录标题 Tesseract、PaddleOCR、RapidPaddle&#xff08;可能为 RapidOCR&#xff09;和 plumberpdf 的对比分析1. Tesseract类型: 开源 OCR 引擎特点:缺点:适用场景: 2. PaddleOCR (推荐)类型:特点:缺点:适用场景: 复杂版式文档、多语言混合文本、需要高精度识别的场景&#…...

经典文献阅读之--Kinematic-ICP(动态优化激光雷达与轮式里程计融合)

0. 简介 传统的激光雷达里程计系统通过点云配准来计算移动机器人的自运动&#xff08;ego-motion&#xff09;&#xff0c;但它们通常没有考虑机器人的运动学特性&#xff0c;这可能导致不准确的运动估计&#xff0c;特别是在机器人不可能发生某些运动&#xff08;如沿z轴的小…...

【显卡占用】kill程序后,显卡仍被占用

如果 kill 程序执行了&#xff0c;但显卡仍然显示被占用&#xff0c;咋个办&#xff1f; 如图所示&#xff0c;GPU-Util占用为0%&#xff0c;但显示占用48G&#xff0c;且无法再上程序&#xff1a; 执行命令&#xff1a; fuser -v /dev/nvidia* kill pid若上述方法无法解决&am…...

在 macOS 上合并 IntelliJ IDEA 的项目窗口

在使用 IntelliJ IDEA 开发时&#xff0c;可能会打开多个项目窗口&#xff0c;这可能会导致界面变得混乱。为了提高工作效率&#xff0c;可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…...

IO流--字节流详解

IO流 用于读写数据的&#xff08;可以读写文件&#xff0c;或网络中的数据&#xff09; 概述&#xff1a; I指 Input&#xff0c;称为输入流&#xff1a;负责从磁盘或网络上将数据读到内存中去 O指Output&#xff0c;称为输出流&#xff0c;负责写数据出去到网络或磁盘上 因…...

6N60-ASEMI机器人功率器件专用6N60

编辑&#xff1a;ll 6N60-ASEMI机器人功率器件专用6N60 型号&#xff1a;6N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大漏源电流&#xff1a;6A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;1.20Ω …...

实现侧边栏点击标题列表,和中间列表区域联动效果

左侧边栏标题列表实现&#xff1a; -------------------html-----------------------<divclass"uav":class"{ hidden: !isVisible, visible: isVisible }"><ul id"toc"><liv-for"(item, index) in HotList":key"…...

基于MuJoCo物理引擎的机器人学习仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多种机器人模型&#xff0c;提供丰富多样的任务场景&#xff0c;像基础的抓取、推物&#xff0c;精细的开门、拧瓶盖等操作。它可灵活配置多种传感器&#xff0c;提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…...

kafka监控kafka manager(CMAK)部署配置

一、准备工作 1.1、服务器信息梳理 角色IP操作系统安装服务监控机10.45.19.20Linux CentOS 7.9CMAK3.0.0.5、ZooKeeper3.9.0、JDK11、JDK1.8被监控机 Kafka broker.id 050.50.50.101Linux CentOS 7.9Kafka、ZooKeeper&#xff08;任意版本&#xff09;被监控机 Kafka broker.…...

线程池的介绍

目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池&#xff0c;我们可能想到 常量池&#xff0c;可以先来说说常量池&#xff1a; 像是字符串常量&#xff0c;在Java程序最初构建的时候&#xff0c;就已经准备好了&#xff0c;等程…...

day33和day34图像处理OpenCV

文章目录 一、图像预处理12 图像梯度处理12.3 Sobel算子12.4 Laplacian算子1.原理&#xff1a;2.语法&#xff1a; 13 图像边缘检测思路13.1 高斯滤波去噪点13.2 计算图像的梯度与方向13.3 非极大值抑制13.4 双阈值筛选13.5 Canny方法和使用 14 绘制图像轮廓14.1 什么是轮廓14.…...

电脑硬盘常见的几种接口类型

一、传统接口&#xff08;机械硬盘为主&#xff09; 1. SATA 接口&#xff08;Serial ATA&#xff09; 特点&#xff1a; 最主流的机械硬盘&#xff08;HDD&#xff09;接口&#xff0c;广泛用于台式机和笔记本电脑。传输速度较慢&#xff0c;理论最大带宽为 6 Gbps&#xff…...

Windows网络及服务:制作系统盘

今天我要介绍的是一个比较有意思且好玩的一个小玩意儿&#xff1a;关于系统盘的制作&#xff1b; 注明&#xff1a;对于系统盘的制作&#xff0c;以及接下来的课程&#xff0c;基本是作为动手课业来进行的&#xff0c;这也是作为程序员的必要进行的一项活动。 对于系统盘&…...

Docker Compose 使用实例

文章目录 一、Docker Compose 简介二、安装 Docker Compose三、基础配置文件示例&#xff08;docker-compose.yml&#xff09;四、关键配置解析五、常用命令六、完整项目示例&#xff08;Node.js MySQL Nginx&#xff09;七、高级功能八、最佳实践九、调试技巧 一、Docker Co…...

系统架构师2025年论文《论基于UML的需求分析》

论基于 UML 的需求分析 摘要: 2018 年 3 月 1 日至 12 月 20 日,我参加了 “某市医院预约挂号系统” 项目的开发,担任系统架构师的工作。该项目是某市医院信息化建设的重要组成部分,目标是:优化医院挂号流程,提高患者就医体验,规范医院号源管理,实现患者预约挂号、医…...

Uniapp 自定义TabBar + 动态菜单实现教程(Vuex状态管理详解)

大家好&#xff0c;我是一诺。今天跟大家分享一下uniapp 封装自定义底部导航栏&#xff08;TabBar&#xff09; 过程中的思考和实践。通过本文&#xff0c;你将学会如何打造一个功能完善、可自由定制的TabBar组件&#xff01; 先看效果&#xff1a; 支持自定义图标和样式动态…...

4月21日日记

新的一周开始了&#xff0c;好消息是未来这两周都每周只用上3天课&#xff0c;因为这周四五是运动会&#xff0c;下周四五是五一&#xff01; 非常好的周一&#xff01;收到了wxx和san还有小林的礼物&#xff01;&#xff01; wxx的是一个定制的有小排球的蓝牙影响&#xff0…...

2025高频面试算法总结篇【其他】

文章目录 直接刷题链接直达LRU Cache买卖股票的最佳时机系列实现一个HashMap环形链表寻找重复数缺失的第一个正数螺旋矩阵字符串相乘分发糖果 直接刷题链接直达 LRU Cache 头尾两个伪节点&#xff08;避免判断&#xff09; 双向链表146. LRU 缓存 买卖股票的最佳时机系列 121…...

vue项目中使用antvX6(可拖拽,vue3)

参考 先知demons 这位大佬的这篇文章&#xff1a;https://blog.csdn.net/wzy_PROTEIN/article/details/136305034?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-136305034-blog-136032209.235v43pc_blog_bottom_relevance_ba…...

文档处理控件Aspose.Words 教程:在 Word 中删除空白页完整指南

Word 文档中的空白页总是令人烦恼。如果您想从 Word 文档中删除空白页&#xff0c;以获得更清晰的演示文稿或整理文件&#xff0c;那么您来对地方了。本指南涵盖了使用 Aspose.Words编码解决方案和在 Microsoft Word 中手动删除方案&#xff0c;让您可以灵活地选择最适合自己的…...

自动驾驶最新算法进展

自动驾驶技术的算法进展迅速&#xff0c;涵盖感知、预测、规划、端到端学习等多个领域。以下是2023年至2024年的关键进展及实例&#xff1a; 1. ‌感知与融合‌ ‌BEVTransformer的进化‌&#xff1a;特斯拉的Occupancy Networks升级至支持动态场景建模&#xff0c;结合NeRF技术…...

OpenCV训练题

一、创建一个 PyQt 应用程序&#xff0c;该应用程序能够&#xff1a; 使用 OpenCV 加载一张图像。在 PyQt 的窗口中显示这张图像。提供四个按钮&#xff08;QPushButton&#xff09;&#xff1a; 一个用于将图像转换为灰度图一个用于将图像恢复为原始彩色图一个用于将图像进行…...

34、Spark实现读取XLS文件

需求背景&#xff1a; 有一些xls大文件数据。使用spark-excel&#xff08;spark-excel&#xff09;来读取时&#xff0c;文件太大会oom&#xff1b;工具提供的流式读取参数&#xff1a;maxRowsInMemory 也只支持xlsx类型文件。搜索了poi流式读取xls的方案&#xff0c;HSSFEvent…...

为什么RPN生成的候选框,要使用rcnn来进行分类和回归操作?

一句大白话总结&#xff1a;RPN是广撒网捕鱼&#xff0c;RCNN是细化鱼的分类和具体尺寸 在目标检测任务中&#xff0c;RPN&#xff08;区域提议网络&#xff09; 生成的候选框需要经过 RCNN&#xff08;如 Fast R-CNN、Faster R-CNN&#xff09; 进行分类和回归&#xff0c;这…...

固定总价合同工程范围变更,如果规避风险

一、合同签订阶段 工程范围的锁定 清单式列举 兜底条款&#xff1a;在合同附件中以 “正负零以上主体结构”“XX 型号设备采够” 等具体描述界定承包范围&#xff0c;同时约定 “超出本附件描述的工程内容视为变更”111。 设计深度要求&#xff1a;对于 EPC 项目&#xff0c;需…...

windows传文件给mac, linux或者其他windows

如果你想把你本地windows的文件传递给mac, linux或者其他windows电脑, 你会使用什么方法呢? 方法一 经常写python的朋友, 肯定会说, 我会用 SimpleHTTPServer python -m SimpleHTTPServer 8000生成一个超链接, 然后在其他机器上直接下载这个链接. 方法二 scp命令 Use SC…...

AI音乐解决方案:1分钟可切换suno、udio、luno、kuka等多种模型,suno风控秒切换 | AI Music API

你有没有觉得&#xff0c;suno风控来了&#xff0c;就要停服了&#xff1f; 你有没有觉得&#xff0c;对接多种音乐模型&#xff0c;让你很疲乏&#xff1f; 你有没有觉得&#xff0c;音乐模型&#xff0c;中文咬字不清楚&#xff0c;让你很苦恼&#xff1f; 别怕&#xff0…...

LeetCode 热题100题解(Java版本)

一、哈希 1、两数之和 https://leetcode.cn/problems/two-sum/?envType=study-plan-v2&envId=top-100-liked使用HashMap,遍历数组,判断当前元素的“补数”是否存在,如果存在直接返回结果,否则在Map中记录当前元素及其下标。 时间复杂度 O(n) 空间复杂度 O(n) class …...

突破传统!SEARCH-R1如何让LLM与搜索引擎协同推理?

大语言模型&#xff08;LLMs&#xff09;虽强大&#xff0c;但在复杂推理和获取最新信息方面存在局限。本文介绍的SEARCH-R1框架&#xff0c;通过强化学习让LLMs能自主与搜索引擎交互&#xff0c;在多个问答数据集上性能大幅提升。想知道它是如何做到的吗&#xff1f;快来一探究…...

C语言复习笔记--字符函数和字符串函数(下)

在上篇我们了解了部分字符函数及字符串函数,下面我们来看剩下的字符串函数. strstr 的使用和模拟实现 老规矩,我们先了解一下strstr这个函数,下面看下这个函数的函数原型. char * strstr ( const char * str1, const char * str2); 如果没找到就返回NULL指针. 下面我们看下它的…...

Git SSH 密钥多个 Git 来源

1. 生成 SSH 密钥 ssh-keygen -t rsa -b 4096 -C "997959066qq.com" 2. 输入指定路径 3. 增加 config文件在.ssh文件下 # GitHub 主账户 Host github.dis.comHostName github.disney.comUser gitIdentityFile ~/.ssh/id_rsa# 其他 Git 服务器 Host github.comHost…...

华为盒式交换机堆叠配置

1. 堆叠线缆连线图(如下图) 2. 配置Swtich1: [HUAWEI] sysname Switch1 [Switch1] interface stack-port 0/1 [Switch1-stack-port0/1] port interface xgigabitethernet 0/0/3 xgigabitethernet 0/0/4 enable Warning: Enabling stack function may cause configuration l…...

map和set的使用

序列式容器和关联式容器 c标准库为我们提供了多种容器类型&#xff0c;可以大体分为两类&#xff1a;序列式容器和关联式容器。 序列式容器按照线性顺序储存数据&#xff0c;元素的位置取决与插入的时间和地点。关联式容器基于键值对存储元素&#xff0c;提供高效的键查找能力…...

VMware制作Windows虚拟机模板注意点

1 、删除右下角的热删除 这个是必须的&#xff01;虚拟机的高级参照中添加devices.hotplug “FALSE”&#xff0c;关闭USB设备热插拔&#xff0c;防止用户把虚拟桌面的网卡删除掉。 2、移除CD/DVD驱动器 这个建议&#xff01;移除CD/DVD驱动器&#xff0c;此项操作…...

公有云攻防5(云函数)

Serverless概述 无服务器(Serverless)不是表示没有服务器,而是表示当您在使用Serverless时,您无需关心底层的资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。 Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资…...

【计算机网络】第五章 局域网技术

以太网技术 以太网的诞生 网络适配器和MAC地址 单播MAC地址 广播MAC地址 CSMA/CD协议 CSMA/CD协议的基本原理 共享式以太网---广播特性 MA多址接入 CS载波监听---先听后说 CD碰撞检测---边听边说 载波监听检测到总线空闲&#xff0c;但总线并不一定空闲。 使用CSMA/CD协议的…...

傲来云分享,负载均衡:提升网站性能与稳定性

在网站或应用的流量不断增加时&#xff0c;单台服务器往往无法承载过多的并发请求&#xff0c;导致性能下降和响应延迟。负载均衡技术正是为了解决这个问题&#xff0c;它可以将流量分发到多台服务器&#xff0c;从而提高系统的可扩展性、处理能力和可靠性。今天&#xff0c;我…...

Python基础总结(九)之推导式

文章目录 一、列表推导式1.1 列表推导式的格式1.2 列表推导式的注意事项1.3 列表推导式示例 二、 字典推导式2.1 字典推导式格式2.2 字典推导式注意事项2.3 字典推导式示例 三、 元组推导式3.1 元组推导式格式3.3 元组推导式示例 Python中的推导式有列表推导式&#xff0c;字典…...

程序员学商务英文之Terms of Payment Packing

Dia-3: Packing 1 包装-1 1. I’m here to improve my communication skill of English. 我来这里是为了提升我的英文沟通技能。 2. What a co-incidence! Fancy meeting you here. 这么巧&#xff01;真没想到在这见到你。 3. Some birds aren’t meant to be caged…...

学生管理系统项目中的相关问题总结

目录 1. 项目中哪里体现出了封装性及其好处&#xff1f; 2. 项目中的setter/getter模式与封装性 什么是setter/getter&#xff1f;有什么用&#xff1f;怎么自动生成&#xff1f; 3.项目中某些类的toString()方法 4. 项目中几个常用方法解析 5. 项目中的面向对象设计 1…...

AI驱动下的企业学习:人力资源视角下的范式重构与价值觉醒

一、传统企业学习体系的系统性失效 当企业学习市场规模突破3600亿美元&#xff0c;人均年投入达1400美元的历史高位时&#xff0c;这场看似繁荣的图景背后却暗藏结构性危机。正如一份2024年研究报告所指出的&#xff0c;66%的企业仍倾向于通过外部招聘而非内部培养获取AI人才&…...