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

有了大语言模型还需要 RAG 做什么

一、百炼平台简介

阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据自己的口味(业务需求)对这些食材进行调味和烹饪(微调)。
在这里插入图片描述

百炼平台主要特点:

  • 啥都能做:无论是文字处理、图像生成还是语音识别,甚至是推荐系统,“百炼平台”就像一个多才多艺的大厨,什么都能搞定。

  • 火力全开:有了阿里云强大的计算能力作为后盾,比如高性能的GPU和TPU,即使是最复杂的食谱(大规模数据集上的训练任务)也能轻松完成。

  • 食材管理:提供一整套工具来挑选最好的原材料(数据清洗、标注及增强技术),确保菜肴(模型)既美味又健康。

  • 快速上手:即使是新手,也可以利用平台提供的现成配方(预训练模型)和自动化的烹饪助手(AutoML),让制作过程变得简单快捷。

  • 轻松出餐:无论是想通过外卖(API接口开发)还是在自家餐厅(云端部署)为顾客服务,“百炼平台”都提供了简便的操作流程,迅速把美食送到客人面前。

  • 各式菜品:已经在金融、医疗、零售等多个领域成功地做出了不少受欢迎的菜品,展示了它在不同行业中的应用潜力。

二、加载阿里大模型

接下来展示如何利用Python脚本通过langchain_community库访问阿里云的大规模语言模型(以Qwen-Turbo为例)和服务,包括聊天交互功能和文本嵌入功能。

它提供了一个简单的入口点,允许开发者快速测试与阿里云模型的交互过程。这对于希望集成阿里云AI能力到自己应用中的开发者来说是一个很好的起点。

注意,实际运行这段代码之前,需要确保已经正确配置了相关的环境变量,例如API密钥等,这通常是通过.env文件完成的。下面这段代码保存在models.py文件中

from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings.dashscope import DashScopeEmbeddings
from dotenv import load_dotenv
load_dotenv()def get_tongyi_chat_model():"""加载阿里大模型"""return ChatTongyi(model="qwen-turbo", temperature=0.1, top_p=0.3, max_tokens=512)def get_tongyi_embed_model():"""加载阿里向量化大模型"""return DashScopeEmbeddings(model="text-embedding-v3")if __name__ == "__main__":"""测试"""chat = get_tongyi_chat_model()response = chat.invoke("你好")print(response)

输出结果:

AIMessage(content='你好!很高兴为你提供帮助。', 
additional_kwargs={}, 
response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': 'b97d9cd6-f2d7-9f31-b210-dc8b77cbe200', 'token_usage': {'input_tokens': 9, 'output_tokens': 7, 'total_tokens': 16}}, id='run-049c4807-7310-4b50-be44-e29a52472fcd-0')

代码解释

  1. 加载环境变量

    from dotenv import load_dotenv
    load_dotenv()
    

    这部分代码用来加载项目根目录下的.env文件中的环境变量。这些环境变量通常包含API密钥、模型ID等敏感信息,避免直接在代码中暴露,此处调用阿里的大模型,就需要在百炼平台申请自己专属的API_KEY,填写到.env文件中

    DASHSCOPE_API_KEY=sk-0d5a1111*****111de0b2f
    
  2. 导入所需模块

    • langchain_community.chat_models导入ChatTongyi,这是用来与阿里云的对话模型进行交互的接口。
    • langchain_community.embeddings.dashscope导入DashScopeEmbeddings,用于获取文本的向量表示。
  3. 定义函数

    • get_tongyi_chat_model():该函数返回一个配置好的ChatTongyi实例,这里指定了模型版本为qwen-turbo,并设置了生成回复时的一些参数,如temperature(创造力)、top_p(核采样),以及max_tokens(最大输出长度)。
    • get_tongyi_embed_model():此函数返回一个配置好的DashScopeEmbeddings实例,专门用于将文本转换成向量表示,这里指定了使用的模型为text-embedding-v3
  4. 测试功能
    if __name__ == "__main__":块中,首先调用get_tongyi_chat_model()来初始化聊天模型,然后通过chat.invoke("你好")发送一条消息给模型,并打印出模型的响应结果。

三、引入模型

新建一个文件,把上面保存的models.py 代码引入。

from models import get_tongyi_chat_model
model = get_tongyi_chat_model()
model.invoke(input="你好")

四、阅读理解

这段代码使用langchain_core库来构建一个基于文本的问答系统,具体来说是利用预定义的提示模板和语言模型来回答关于给定文章的问题。给一个段落,按照段落的描述来回答问题!

from langchain_core.messages import SystemMessage
from langchain_core.messages import HumanMessage
from langchain_core.prompts import SystemMessagePromptTemplate
from langchain_core.prompts import HumanMessagePromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParsersys_msg = SystemMessage(content="""
你是一个阅读理解机器人!
请认真阅读用户提供的文章,并根据文章的内容来回答用户的问题!、
请注意:如果问题没有在文章中出现,请直接使用你自己的知识来回答!
""")
user_msg = HumanMessage(content="""
文章为:孙中山(1866年11月12日-1925年3月12日),名文,字载之,号日新,又号逸仙,又名帝象,化名中山樵,伟大的民族英雄、伟大的爱国主义者、中国民主革命的伟大先驱 [1],中华民国和中国国民党的缔造者,三民主义的倡导者,创立了《五权宪法》。他首举彻底反帝反封建的旗帜,“起共和而终两千年封建帝制”。 [2]
孙中山1866年11月12日生于广东省广州府香山县(今中山市)翠亨村。孙中山原在香港学医,并成为西医医师。孙中山目睹中华民族有被西方列强瓜分的危险,决定抛弃“医人生涯”,进行“医国事业”。孙中山早期受郑观应的改良思想影响,后看清了清政府的腐败,决心推翻清王朝,建立民主共和国。 [3-4] [44]
1894年11月24日,孙中山在檀香山创立兴中会 [4]。1905年(光绪三十一年)成立中国同盟会。1911年10月10日(宣统三年)新军中的革命党人暗中联络,决定当天晚上起义。辛亥革命后被推举为中华民国临时大总统(任期1912年1月1日——1912年4月1日)。1925年3月12日,孙中山因癌症在北京逝世。1929年6月1日,根据其生前遗愿,葬于南京紫金山中山陵。1940年,国民政府通令全国,尊称其为“中华民国国父”。
孙中山著有《建国方略》、《建国大纲》、《三民主义》等。其著述在逝世后多次被结集出版,有中华书局1986年出版的十一卷本《孙中山全集》,台北1969、1973、1985年出版的《国父全集》等。问题为:孙中山跟毛泽东是什么关系?答案为:
""")
messages = [sys_msg, user_msg]
model.invoke(input=messages)

输出内容:

AIMessage(content='文章中没有提及孙中山与毛泽东的关系。根据我自己的知识,孙中山是中国近代民主革命的先行者,而毛泽东是中华人民共和国的主要缔造者之一。两人都是中国历史上的重要人物,但他们在不同的时代活跃,孙中山是毛泽东早年的革命导师之一,对中国共产党的成立和发展有着重要的影响。', 
additional_kwargs={}, 
response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': '7fc32746-ab86-9a82-a95b-a059a6d30c74', 'token_usage': {'input_tokens': 550, 'output_tokens': 69, 'total_tokens': 619}}, id='run-b2e9813c-daba-4c88-a564-6844fba0d82b-0')

让用户传过一篇文章和一个问题,我们根据用户的文章来回答用户的问题

sys_prompt = SystemMessagePromptTemplate.from_template(template="""
你是一个阅读理解机器人!
请认真阅读用户提供的文章,并根据文章的内容来回答用户的问题!
请注意:1, 如果问题没有在文章中出现,请直接使用你自己的知识来回答!2, 不需要做任何的解释,直接回答问题的结果即可!
""")
user_prompt = HumanMessagePromptTemplate.from_template(template="""
文章为:
{passage}
问题为:
{question}
答案为:
""")
prompt = ChatPromptTemplate.from_messages(messages=[sys_prompt, user_prompt])
output_parser = StrOutputParser()
chain = prompt | model | output_parser
passage = """
孙中山,名文,字载之,号日新,又号逸仙,又名帝象,化名中山樵,伟大的民族英雄、伟大的爱国主义者、中国民主革命的伟大先驱 [1],中华民国和中国国民党的缔造者,三民主义的倡导者,创立了《五权宪法》。他首举彻底反帝反封建的旗帜,“起共和而终两千年封建帝制”。 [2]
孙中山生于广东省广州府香山县(今中山市)翠亨村。孙中山原在香港学医,并成为西医医师。孙中山目睹中华民族有被西方列强瓜分的危险,决定抛弃“医人生涯”,进行“医国事业”。孙中山早期受郑观应的改良思想影响,后看清了清政府的腐败,决心推翻清王朝,建立民主共和国。 [3-4] [44]
1894年11月24日,孙中山在檀香山创立兴中会 [4]。1905年(光绪三十一年)成立中国同盟会。1911年10月10日(宣统三年)新军中的革命党人暗中联络,决定当天晚上起义。辛亥革命后被推举为中华民国临时大总统(任期1912年1月1日——1912年4月1日)。1925年3月12日,孙中山因癌症在北京逝世。1929年6月1日,根据其生前遗愿,葬于南京紫金山中山陵。1940年,国民政府通令全国,尊称其为“中华民国国父”。
孙中山著有《建国方略》、《建国大纲》、《三民主义》等。其著述在逝世后多次被结集出版,有中华书局1986年出版的十一卷本《孙中山全集》,台北1969、1973、1985年出版的《国父全集》等。
"""question = """
Please list 孙中山's other names!
"""
chain.invoke(input=dict(passage=passage, question=question))

输出结果:

孙中山的其他名字包括:日新、逸仙、帝象、中山樵。

代码解释

  1. 导入必要的模块

    • from langchain_core.messages import SystemMessage, HumanMessage:用于创建系统消息和用户消息对象。
    • from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate:用于创建提示模板,这些模板定义了模型应该如何理解和响应输入。
    • from langchain_core.output_parsers import StrOutputParser:用于解析模型输出为字符串格式。
  2. 初始化系统和用户消息

    • 定义了一个系统消息sys_msg,告诉模型它应该扮演的角色(即阅读理解机器人)以及如何处理用户的提问。
    • 创建了一个用户消息user_msg,其中包含了文章内容和问题,但在这个例子中直接在后续部分重新定义了passagequestion
  3. 创建提示模板

    • 使用SystemMessagePromptTemplate.from_template创建系统提示模板,明确说明了模型的行为准则。
    • 使用HumanMessagePromptTemplate.from_template创建用户提示模板,允许动态插入文章内容({passage})和问题({question})。
    • 结合系统提示和用户提示,通过ChatPromptTemplate.from_messages创建完整的聊天提示模板。
  4. 配置链式调用

    • 通过将提示模板、模型和输出解析器链接起来(prompt | model | output_parser),形成一个可以接受输入并产生输出的完整链条。
  5. 执行推理

    • 最后,通过调用chain.invoke(input=dict(passage=passage, question=question)),向模型发送具体的输入(文章和问题),并获取模型的回答。

上面这段代码演示如何使用langchain_core库来搭建一个简单的问答系统。首先定义模型应该如何根据提供的文章内容回答问题的规则,然后通过特定的提示模板和实际的文章及问题实例化这些规则,并最终通过调用语言模型来获得答案。这种方式非常适合需要对特定文档进行问答的应用场景,比如知识库查询、教育辅助等。

五、私有知识库怎么使用

通过上述代码示例,我们可以看到如何使用预定义的提示模板和语言模型来根据给定的文章内容回答问题。然而,在实际应用场景中,尤其是当涉及到公司内部大量私有知识资料时,直接使用这样的方式可能并不高效或有效。这就引出了RAG(检索增强生成, Retrieval-Augmented Generation)的作用。

设想一下,如果我们要让大模型根据公司的私有知识资料(如产品说明、规章制度、对外文案等)来回答员工或客户的问题。这里存在几个挑战:

  1. 私有知识资料数量庞大:如果完全参考所有资料,不仅效率低下,而且可能会导致信息过载。
  2. 只提取相关知识:理想情况下,我们希望仅提供与具体问题相关的那部分知识给大模型,以提高回答的准确性和效率。

如何解决这些问题?

  • 文本相似度检索:一种解决方案是基于文本相似度来筛选出与问题最相关的知识片段。这可以通过两种方式实现:
    • 关键词匹配:虽然简单直接,但需要预先准备大量的关键词,并且在多语言环境下不够灵活。
    • 语义化匹配:这种方法更加智能,它不依赖于具体的词汇,而是试图理解文本的真正含义,从而支持跨语言和表达习惯的理解。

实现步骤

  1. 准备阶段

    • 加载/读取私有知识:首先收集并准备好所有的私有知识资料。
    • 切分私有知识:将这些资料按照逻辑独立的单元进行分割。
    • 向量化:使用类似BERT的模型将每个知识片段转化为向量表示。
    • 入库:将这些向量化的知识片段存储到一个高效的向量数据库中,以便快速检索。
  2. 使用阶段

    • 提问:用户提出一个问题。
    • 检索:利用之前提到的方法,将问题转换为向量,并在向量数据库中查找最相似的知识片段。
    • 增强:在原始提示中整合问题及其相关的上下文信息。
    • 生成:最终由大模型基于增强后的输入生成答案。

这种模式不仅解决了直接处理大量数据的问题,还提高了回答的精准度和相关性。这就是RAG的核心思想——通过结合检索和生成技术,既能够精确地定位相关信息,又能灵活地生成符合用户需求的答案。因此,RAG对于构建更加智能和高效的问答系统具有重要意义。

六、RAG和百度等搜索引擎有什么区别

RAG(Retrieval-Augmented Generation,检索增强生成)和传统的搜索引擎如百度之间存在几个关键的不同点。虽然两者都涉及信息的检索,但它们的目标、方法以及最终的应用场景有所不同。

目标与功能

  • RAG

    • RAG的核心目标是利用外部知识库来增强语言模型的回答能力,使回答更加准确、具体,并且基于最新的信息。
    • 它不仅查找相关信息,还会对找到的信息进行加工处理,并生成一段自然流畅的回答。
    • 更适合于需要深度理解和分析的任务,比如专业咨询、法律建议等。
  • 百度等搜索引擎

    • 搜索引擎的主要任务是根据用户的查询提供一系列可能相关的网页链接。
    • 它们通常不直接生成答案,而是让用户自己去浏览搜索结果中的内容以获取所需信息。
    • 更适用于广泛的搜索需求,包括但不限于新闻、娱乐、教育资料等。

工作流程

  • RAG

    • 首先通过检索组件从外部知识库中寻找相关的信息片段。
    • 然后,这些信息被用作上下文输入给生成模型,帮助其理解问题并生成针对性的答案。
    • 这种方式可以确保答案是基于最新且最相关的数据。
  • 百度等搜索引擎

    • 使用复杂的算法评估网页的相关性和质量,然后按照一定的顺序展示搜索结果。
    • 用户点击感兴趣的链接后,自行阅读页面内容来解答自己的问题。

技术实现

  • RAG

    • 利用了先进的自然语言处理技术,特别是预训练的语言模型和向量检索技术。
    • 依赖于语义理解而非简单的关键词匹配,这使得它能够更好地捕捉查询背后的意图。
  • 百度等搜索引擎

    • 虽然也采用了NLP技术,但更侧重于网页抓取、索引构建以及排序算法等方面。
    • 关键词匹配仍然是一个重要的组成部分,尽管现代搜索引擎也开始采用语义搜索技术来提高准确性。

总的来说,RAG更像是一个智能助手,它可以深入理解和处理复杂的问题,而不仅仅是提供链接列表;相比之下,百度等传统搜索引擎则是为了满足广泛的信息探索需求而设计的,它们提供了海量的信息入口,但不一定直接给出精确的答案。

相关文章:

有了大语言模型还需要 RAG 做什么

一、百炼平台简介 阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据…...

pytest快速入门 - 目录:半天掌握pytest

1 pytest快速入门 - 目录 本系列文章将快速的带领用户进入pytest领域,通过阅读本专栏,用户将可以熟练掌握pytest的基本用法,同时对测试前置条件的构造、后置条件的清理等有较深入的了解,特别是后置条件的执行完备度有一个认识。 …...

2.4 python网络编程

在当今数字化的时代,网络连接着世界的每一个角落。从简单的网页浏览到复杂的分布式系统,网络编程无处不在。Python 作为一种功能强大且易于学习的编程语言,在网络编程领域占据着重要的地位。它丰富的库和简洁的语法使得开发者能够高效地构建各…...

网络变压器的主要电性参数与测试方法(4)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…...

【Springboot知识】开发属于自己的中间件健康监测HealthIndicate

文章目录 **一、技术栈****二、项目结构****三、依赖配置 (pom.xml)****四、配置文件 (application.yml)****五、自定义健康检查实现****1. Redis健康检查****2. Elasticsearch健康检查****3. Kafka健康检查****4. MySQL健康检查** **六、自定义健康检查接口 (可选)****七、测试…...

蓝桥杯备赛-二分-技能升级

问题描述 小蓝最近正在玩一款 RPG 游戏。他的角色一共有 NN 个可以加攻击力的技能。 其中第 ii 个技能首次升级可以提升 AiAi​ 点攻击力, 以后每次升级增加的点数 都会减少 Bi。「AiBi⌉Bi​。「Bi​Ai​​⌉ (上取整) 次之后, 再升级该技能将不会改变攻击力。 现在小蓝可以…...

【GPT入门】第18课 langchain介绍与API初步体验

【GPT入门】langchain第一课 langchain介绍与API初步体验 1. langchain介绍定义特点1. 模块化与灵活性2. 链式调用机制3. 数据连接能力4. 记忆管理功能5. 提示工程支持6. 可扩展性 2.langchain核心组件架构图3. 最简单的helloworld入门 1. langchain介绍 LangChain 是一个用于…...

Django部署Filemanagement

Pycharm搭建项目安装虚拟环境 mysqlclient对mysql的安装,配置有要求 pymsql伪装成mysqlclient,pymysql可以操纵mysql pip install pymysql操作sql5.7 mysql8.0会出现与pycharm不兼容问题,会报错,所以降到5.7 # 进入mysql 需要…...

Python的types库学习记录

types 库是 Python 标准库中的一部分,它提供了与 Python 对象类型相关的工具和常量,有助于在运行时处理和操作不同类型的对象。 以下是对 types 库的详细介绍: 主要用途 • 类型检查:在运行时判断对象的类型。 • 动态创建和操作…...

C# 表达式树详解

总目录 前言 在 C# 中,表达式树(Expression Trees)是一种强大的特性,允许开发者将代码表示为数据结构。这使得我们可以在运行时动态地创建和操作代码逻辑,广泛应用于 LINQ 查询、动态方法生成以及反射等领域。本文将深…...

分别用树型和UML结构展示java集合框架常见接口和类

树型结构展示java集合框架常见接口和类 Java 集合框架中的接口和子类关系可以用树形结构来展示。以下是一个简化的树形结构,展示了主要的接口和一些重要的实现类: java.util.Collection ├── java.util.List │ ├── java.util.ArrayList │ ├…...

蓝桥杯备赛-二分-青蛙过河

问题描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头的高度下降…...

uniapp+微信小程序+最简单局部下拉刷新实现

直接上代码 <scroll-view style"height: 27vh;" :scroll-top"scrollTop" scroll-y"true"scrolltolower"onScrollToLower1" lower-threshold"50"refresher-enabled"true" refresherrefresh"onRefresherR…...

Spring Boot 3.x 中 @NotNull 与 @NonNull 的深度解析

在 Java 开发领域&#xff0c;尤其是在 Spring Boot 生态系统中&#xff0c;空指针异常&#xff08;NPEs&#xff09;始终是一个顽固的挑战。这些运行时错误可能导致应用程序崩溃、数据不一致以及糟糕的用户体验。为了应对这一问题&#xff0c;Java 社区开发了各种空安全机制&a…...

SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入

数据导入导出是应用开发者在平时开发中最常用的操作之一&#xff0c;SQLark 里提供了方便的图形化界面来完成导入导出。本文先和大家分享如何从 Excel、csv、txt 等外部文件导入数据到数据库表中。 &#x1f449; 前往 SQLark 官网&#xff1a;www.sqlark.com 下载全功能免费版…...

MATLAB中envelope函数使用

目录 说明 示例 chirp 的解析包络 使用滤波器计算多通道信号的解析包络 录音信号的移动 RMS 包络 语音信号的峰值包络 不对称序列的包络 envelope函数的功能是提取信号的包络。 语法 [yupper,ylower] envelope(x) [yupper,ylower] envelope(x,fl,analytic) [yupper,…...

ES搭建详细指南+常见错误解决方法

Elasticsearch&#xff08;ES&#xff09;是一款开源的、分布式的、RESTful风格的搜索和数据分析引擎。它用于全文搜索、结构化搜索、分析等场景。以下是Elasticsearch的搭建步骤以及处理常见错误的方法。 Elasticsearch搭建步骤&#xff1a; 1.环境准备&#xff1a; 确保你的…...

Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能

灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发&#xff08;第3版&#xff09; | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…...

PostgreSQL数据库版本支持策略

PostgreSQL数据库版本支持策略 主要版本会进行复杂的更改&#xff0c;因此无法以向后兼容的方式维护数据目录的内容。重大升级需要转储/重新加载数据库或使用pg_upgrade应用程序。我们还建议您阅读您计划升级到的主要版本的升级部分。您可以从一个主要版本升级到另一个&#xf…...

应用层之网络应用模型,HTTP/HTTPS协议

应用层是网络协议栈的最顶层&#xff0c;直接为应用程序提供通信服务&#xff0c;定义了不同主机间应用进程交互的规则&#xff0c;包括报文类型、语法、语义及通信时序 一、网络应用模型 1.定义及特点 模型定义核心特点典型应用场景C/S客户端向服务器发起请求&#xff0c;服…...

(七)Spring Boot学习——Redis使用

有部分内容是常用的&#xff0c;为了避免每次都查询数据库&#xff0c;将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护&#xff0c;你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL&#xff08;Windows Subsystem for Linux&a…...

11 | 给 Gin 服务器添加中间件

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…...

selenium等待

通常代码执行的速度⽐页⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤selenium中提供的三种等待⽅法: 1. 隐式等待(Implicit Wait) 隐式等待适用于全局,它告诉 WebDriver 在查找元素时等待一定的时间,直到元素出现。 如果超时,WebDriver 不…...

为什么List、Set集合无法在遍历的时候修改内部元素

以常用集合ArrayList为例&#xff0c;ArrayList 在遍历过程中无法直接修改内部元素的结构&#xff08;例如通过 remove() 或 add() 方法修改元素&#xff09;&#xff0c;是因为 遍历的过程中修改结构 可能会导致 不一致的行为、并发修改异常 或 逻辑错误。 注意&#xff1a;和…...

使用 Elasticsearch 构建多模式 RAG 系统:哥谭市的故事

作者&#xff1a;来自 Elastic Alex Salgado 学习如何构建一个多模态检索增强生成 (RAG) 系统&#xff0c;该系统集成文本、音频、视频和图像数据&#xff0c;以提供更丰富的、具有上下文的信息检索。 在这篇博客中&#xff0c;你将学习如何使用 Elasticsearch 构建一个多模态 …...

单一责任原则在Java设计模式中的深度解析

在软件开发中&#xff0c;设计模式提供了一种解决特定问题的思路。在众多的设计原则中&#xff0c;单一责任原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;是一个非常重要的概念。它主要强调一个类应该只有一个责任&#xff0c;也就是说&#xf…...

设计模式学习记录

设计模式23种 创建型抽象工厂模式工厂模式生成器模式原型模式单例模式 结构型适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式 行为型责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模版方法模式访问者模式 创建型 与对…...

set_clock_groups

一、命令参数与工具处理逻辑 核心参数定义 参数定义工具行为工具兼容性-asynchronous完全异步时钟组&#xff0c;无任何相位或频率关系&#xff08;如独立晶振、不同时钟树&#xff09;工具完全禁用组间路径的时序分析&#xff0c;但需用户自行处理跨时钟域&#xff08;CDC&a…...

QT创建项目(项目模板、构建系统、选择类、构建套件)

1. 项目模版 项目类型界面技术适用场景核心依赖模块开发语言Qt Widget ApplicationC Widgets传统桌面应用&#xff08;复杂控件&#xff09;Qt WidgetsCQt Console Application无 GUI命令行工具、服务Qt CoreCQt Quick ApplicationQML/Quick现代跨平台应用&#xff08;动画/触…...

麒麟系统利用pycharm生成deb文件

在麒麟系统&#xff08;Kylin OS&#xff09;上使用 PyCharm 进行 Python 开发并生成 .deb 可安装软件包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 准备工作 安装 PyCharm&#xff1a;确保已经在麒麟系统上安装了 PyCharm&#xff0c;可以使用官方提供的安装包进…...

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…...

Qt 信号与槽

目录 Qt信号和槽 connect函数 connect使用方法 自定义信号 与 自定义槽 Qt界面化工具自动生成的槽 自定义信号 带参数的信号和槽 信号与槽的断开 Qt信号和槽 谈到信号&#xff0c;设计3个要素 信号源&#xff1a;谁发出了信号 信号触发条件&#xff1a;哪个控件的哪个…...

卷积神经网络 - 卷积的变种、数学性质

本文我们来学习卷积的变种和相关的数学性质&#xff0c;为后面学习卷积神经网络做准备&#xff0c;有些概念可能不好理解&#xff0c;可以先了解其概念&#xff0c;然后慢慢理解、逐步深入。 在卷积的标准定义基础上&#xff0c;还可以引入卷积核的滑动步长和零填充来增加卷积…...

ubuntu 和 RV1126 交叉编译Mosqutiio-1.6.9

最近需要交叉编译mosquitto&#xff0c;遇到一些小问题记录一下。 1.众所周知使用它自带的Makefile编译的时候&#xff0c;只需要在编译前&#xff0c;指定它config.mk中的变量&#xff1a;CFLAGS头文件路径 和 LDFLAGS库文件路径就ok&#xff0c;例子如下&#xff1a; expor…...

从零开始学习机器人---如何高效学习机械原理

如何高效学习机械原理 1. 理解课程的核心概念2. 结合图形和模型学习3. 掌握公式和计算方法4. 理论与实践相结合5. 总结和复习6. 保持好奇心和探索精神 总结 机械原理是一门理论性和实践性都很强的课程&#xff0c;涉及到机械系统的运动、动力传递、机构设计等内容。快速学习机械…...

STM32 RS232通信开发全解析 | 零基础入门STM32第五十九步

主题内容教学目的/扩展视频RS232串口电路原理&#xff0c;跳线设置&#xff0c;驱动程序。与超级终端通信。了解电路原理和RS232协议。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、RS232通信系统架构二、RS232核心原理与硬件设计2.1 电气特性对比2.2 典型电路…...

文献分享: 对ColBERT段落多向量的剪枝——基于学习的方法

原论文 1. 导论 & \textbf{\&} &方法 1️⃣要干啥&#xff1a;在 ColBERT \text{ColBERT} ColBERT方法中&#xff0c;限制每个段落要保留的 Token \text{Token} Token的数量&#xff0c;或者说对段落 Token \text{Token} Token进行剪枝 2️⃣怎么干&#xff1a;注…...

(已解决)aws 上 部署Splunk 负载均衡unhealthy

在AWS 部署Splunk 服务,instance 是后端的EC2, 我把splunk 服务起好后,发现port : 8000 是listening: #netstat -an | grep 80 tcp 0 0 127.0.0.1:8065 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8089 0.0.0.0:* …...

C# 异步编程

概述 同步&#xff1a;指必须等待前一个操作完成&#xff0c;后续操作才能继续。同步操作会阻塞线程直到任务完成。 异步&#xff1a;异步操作不会阻塞线程&#xff0c;允许程序在等待某个任务完成的同时&#xff0c;继续执行其他任务。 异步编程适用场景&#xff1a; 1、从…...

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理&#xff0c;并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易&#xff0c;我们还是在开篇介绍它的原理&#xff1a; Guava Cache 通过分段&#xff08;…...

Go string 字符串底层逻辑

在 Go 语言中&#xff0c;string 类型的底层结构是一个结构体&#xff0c;包含两个字段&#xff1a;一个指向字节数组的指针和该字节数组的长度。以下是其在 Go 源码中的大致定义&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;这是一个指…...

高效集成聚水潭采购退货数据到MySQL的最佳实践

聚水潭数据集成到MySQL&#xff1a;采购退货单的高效对接方案 在企业的数据管理和分析过程中&#xff0c;数据的准确性和实时性至关重要。本文将分享一个具体的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将聚水潭中的采购退货单数据高效地集成到MyS…...

STM32步进电机S型与T型加减速算法

目录 一、基本原理 二、常见类型 三、算法详解 四、应用场合 五、代码实现 1、main...

centos操作系统上传和下载百度网盘内容

探序基因 整理 进入百度网盘官网百度网盘 客户端下载 下载linux的rpm格式的安装包 在linux命令行中输入&#xff1a;rpm -ivh baidunetdisk_4.17.7_x86_64.rpm 出现报错&#xff1a; 错误&#xff1a;依赖检测失败&#xff1a; libXScrnSaver 被 baidunetdisk-4.17.7-1.x8…...

深入 Python 网络爬虫开发:从入门到实战

一、为什么需要爬虫&#xff1f; 在数据驱动的时代&#xff0c;网络爬虫是获取公开数据的重要工具。它可以帮助我们&#xff1a; 监控电商价格变化抓取学术文献构建数据分析样本自动化信息收集 二、基础环境搭建 1. 核心库安装 pip install requests beautifulsoup4 lxml …...

网络爬虫【简介】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网络蜘蛛、网络机器人等&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它…...

Linux:Ubuntu server 24.02 上搭建 ollama + dify

一、安装Ubuntu 具体的安装过程可以参见此链接&#xff1a;链接&#xff1a;Ubuntu Server 20.04详细安装教程&#xff0c;这里主要记录一下过程中遇到的问题。 安装时subnet如何填写 在Ubuntu中subnet填写255.255.255.0是错误的&#xff0c;其格式为 xx.xx.xx.xx/yy &#…...

【生日蛋糕——DFS剪枝优化】

题目 分析 代码 #include <bits/stdc.h> using namespace std;const int N 24; const int inf 0x3f3f3f3f;int mins[N], minv[N]; int R[N], H[N]; int n, m, ans inf;void dfs(int u, int v, int s) {if(v minv[u] > n) return;if(s mins[u] > ans) return;…...

RabbitMq C++客户端的使用

1.RabbitMq介绍 RabbitMQ 是一款开源的消息队列中间件&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;实现&#xff0c;支持多种编程语言和平台。以下是其核心特点和介绍&#xff1a; 核心特点 多语言支持 提供 Java、Python、C#、Go、JavaScript 等语言的客…...

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …...