Advanced RAG 03:运用 RAGAs 与 LlamaIndex 评估 RAG 应用
编者按:目前,检索增强生成(Retrieval Augmented Generation,RAG)技术已经广泛使用于各种大模型应用场景。然而,如何准确评估 RAG 系统的性能和效果,一直是业界和学界共同关注的重点问题。若无法对 RAG 系统进行全面、客观的评估,也难以针对性地优化和改进它。因此,开发一套科学、可靠的 RAG 系统评估指标体系,对于推动RAG技术的进一步发展具有重要意义。
本文是Advanced RAG系列的第三篇,介绍了由 RAGAs(Retrieval Augmented Generation Assessment) 提出的 RAG 评估指标框架,并阐述了如何使用 RAGAs 与 LlamaIndex 实现整个评估流程。
作者 | Florian June
编译 | 岳扬
🚢🚢🚢欢迎小伙伴们加入AI技术软件及技术交流群,追踪前沿热点,共探技术难题~
如果你已经为某个真实业务系统开发了检索增强生成(RAG)应用程序,可能会想了解该 RAG 应用的效果如何。换句话说,您可能想评估该 RAG App 的性能。
另外,如果发现现有的 RAG 应用效果不佳,可能还需要验证使用的 RAG 性能优化方法是否有效。换句话说,需要进行评估,确定这些性能优化方法是否起了作用。
在本文,我们首先介绍了由 RAGAs(Retrieval Augmented Generation Assessment)[1] 提出的 RAG 评估指标,RAGAs 是一个用于评估 RAG pipelines 的框架。然后,我们将解释如何使用 RAGAs + LlamaIndex 实现整个评估流程。
01 RAG 评估指标
简单来说,RAG 流程涉及三个步骤:输入用户提供给系统的问题或者需要解决的任务(input query) 、检索上下文(retrieved context)和根据用户提供的问题和检索到的上下文,由语言模型生成回答或者解决方案(the response generated by the LLM)。这三个步骤构成了 RAG 过程中最重要的三要素,并且相互依存。
因此,如图 1 所示,可以通过衡量这三者之间的相关程度来评估 RAG 的效果如何。
图 1:可以通过衡量这些三要素之间的相关程度来评估 RAG 的效果如何。Image by author。
这篇论文[1]提到了 3 个指标:Faithfulness(译者注:生成的内容是否忠实于用户输入的问题和检索到的上下文)、Answer Relevance(译者注:生成的回答是否与用户提出的问题相关)和 Context Relevance(译者注:生成的回答是否与用户提供的背景信息相符),这些指标无需访问人工标注的数据集或参考答案。
此外,RAGAs 网站[2]还介绍了另外两个指标:Context Precision(译者注:上下文精确度,即生成的模型响应中有多少是与上下文相关的)和 Context Recall(译者注:上下文召回率,生成的模型响应中有多少能够涵盖上下文相关的信息)。
1.1 Faithfulness/Groundedness
Faithfulness 指标用于评估模型回答是否基于给定的上下文,有助于开发人员判断、避免 RAG 系统产生错觉,并确保检索到的上下文可以有效地用于 RAG 系统输出的生成。
如果该指标分数较低,则表示 LLM 的响应不符合检索到的知识,提供带有幻觉的答案可能性就会增加。 例如:
图 2:Faithfulness 分数高和 Faithfulness 分数低的模型回答对比示例
资料来源:https://docs.ragas.io/en/latest/concepts/metrics/faithfulness.html
为了预估 Faithfulness 的数值大小,我们首先使用 LLM 提取一组语句 S(a(q))。具体方法如下:
Given a question and answer, create one or more statements from each sentence in the given answer.
question: [question]
answer: [answer]
生成 S(a(q)) 后,LLM 会判断每条语句 Si 是否都能从 c(q) 中推理出来。这一验证步骤通过以下 prompt 进行:
Consider the given context and following statements, then determine whether they are supported by the information present in the context. Provide a brief explan ation for each statement before arriving at the verdict (Yes/No). Provide a final verdict for each statement in order at the end in the given format. Do not deviate from the specified format.statement: [statement 1]
...
statement: [statement n]考虑给定的上下文和以下陈述,然后确定它们是否得到上下文中存在的信息的支持。在做出结论(是/否)之前,为每个陈述提供一个简短的解释。最后,按照给定的格式对每个陈述做出最终的判决。请不要偏离指定的格式。陈述:[陈述1]...陈述:[陈述n]。
最终的 Faithfulness 指标分数 F 计算公式为 F = |V| / |S|,其中 |V| 表示在验证过程中,LLM(大语言模型)认为能够根据输入的问题和检索到的上下文推导出来的语句数量,而 |S| 表示总语句数量。
1.2 Answer Relevance
该指标衡量生成的答案与用户输入的 query 之间的相关程度。分数越高,相关程度越高。 例如:
图 3:相关程度高的答案和相关程度低的模型回答对比示例
资料来源:https://docs.ragas.io/en/latest/concepts/metrics/answer_relevance.html
为了估计模型回答与用户输入的 query 之间的相关程度,我们让 LLM 根据给定的答案 a(q),生成 n 个潜在问题 qi,如下所示:
Generate a question for the given answer.answer: [answer]
然后,我们使用文本嵌入模型(text embedding model)获取所有问题的嵌入(embeddings)。
对于每个 qi,都要计算与问题 q 的相似度 sim(q,qi),对应于嵌入之间的余弦相似度。问题 q 的答案相关程度得分 AR 计算如下:
1.3 Context Relevance
这是一个用于衡量检索质量的指标,主要评估检索到的上下文对用户提供给系统的问题的支持程度。 得分低表示检索到的内容中存在大量不相关的内容,可能会影响 LLM 生成的最终答案。例如:
图 4:高上下文相关性和低上下文相关性
资料来源:https://docs.ragas.io/en/latest/concepts/metrics/context_relevancy.html
为了评估上下文的相关性,我们需要使用 LLM 从上下文 (c(q)) 中提取一组关键句子 (Sext) 。这些句子对于帮助 LLM 正确回答问题至关重要。prompt 如下:
Please extract relevant sentences from the provided context that can potentially help answer the following question.
If no relevant sentences are found, or if you believe the question cannot be answered from the given context,
return the phrase "Insufficient Information". While extracting candidate sentences you’re not allowed to make any changes to sentences from given context.请从提供的上下文中提取与以下问题潜在相关的句子。如果找不到相关的句子,或者您认为该问题无法从给定的上下文中得到答案,请返回短语“信息不足”。在提取候选句子时,不得对给定上下文中的句子进行任何更改。
在 RAGAs 中,对于上下文中的每个句子,可以使用以下公式在句子层面计算其与 query 的相关性:
1.4 Context Recall
该指标衡量的是检索到的上下文与标注的答案之间的一致性程度。 它使用基准答案和检索到的上下文进行计算,数值越高,表示性能越强。例如:
图 5:高上下文召回率和低上下文召回率
资料来源:https://docs.ragas.io/en/latest/concepts/metrics/context_recall.html
在实施评估流程时,需要提供人工标注的基准数据。
计算公式如下:
1.5 Context Precision
这一指标相对复杂,它用于衡量检索到的包含真实信息的所有相关上下文是否都排在前列。得分越高,表示精确度越高。
该指标的计算公式如下:
上下文精确度(Context Precision)的优点在于其能够感知 ranking effect (译者注:指的是在检索结果中,相关的内容是否能够在排名中被正确地放置在顶部)。但它的缺点是,如果相关的检索结果很少,但排名都很靠前,得分也会很高。因此,有必要通过结合其他几个指标来考虑整体效果。
02 使用 RAGAs + LlamaIndex 对 RAG App 进行评估
主要流程如图 6 所示:
图 6:Main process. Image by author.
2.1 评估系统运行环境配置
安装 ragas:使用以下命令通过 pip 安装 ragas。
pip install ragas
然后,检查 ragas 的当前版本。
(py) Florian:~ Florian$ pip list | grep ragas
ragas 0.0.22
值得一提的是,
使用pip install git+https://github.com/explodinggradients/ragas.git
安装最新版本(v0.1.0rc1)的ragas,则不支持 LlamaIndex。
然后,导入相关库,设置环境变量和全局变量。
import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"
dir_path = "YOUR_DIR_PATH"from llama_index import VectorStoreIndex, SimpleDirectoryReaderfrom ragas.metrics import (faithfulness,answer_relevancy,context_relevancy,context_recall,context_precision
)from ragas.llama_index import evaluate
目录中只有一个 PDF 文件,即 “TinyLlama: An Open Source Small Language Model”[3]。
(py) Florian:~ Florian$ ls /Users/Florian/Downloads/pdf_test/
tinyllama.pdf
2.2 用 LlamaIndex 构建简单的 RAG 查询引擎
documents = SimpleDirectoryReader(dir_path).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
默认情况下,LlamaIndex 使用 OpenAI 模型,但可以使用 ServiceContext 轻松配置 LLM 和嵌入模型(embedding model)。
2.3 构建评估数据集
由于有些评估指标需要使用人工标注数据集,我自己编写了一些问题,并标注有相应的答案。
eval_questions = ["Can you provide a concise description of the TinyLlama model?","I would like to know the speed optimizations that TinyLlama has made.","Why TinyLlama uses Grouped-query Attention?","Is the TinyLlama model open source?","Tell me about starcoderdata dataset",
]
eval_answers = ["TinyLlama is a compact 1.1B language model pretrained on around 1 trillion tokens for approximately 3 epochs. Building on the architecture and tokenizer of Llama 2, TinyLlama leverages various advances contributed by the open-source community (e.g., FlashAttention), achieving better computational efficiency. Despite its relatively small size, TinyLlama demonstrates remarkable performance in a series of downstream tasks. It significantly outperforms existing open-source language models with comparable sizes.","During training, our codebase has integrated FSDP to leverage multi-GPU and multi-node setups efficiently. Another critical improvement is the integration of Flash Attention, an optimized attention mechanism. We have replaced the fused SwiGLU module from the xFormers (Lefaudeux et al., 2022) repository with the original SwiGLU module, further enhancing the efficiency of our codebase. With these features, we can reduce the memory footprint, enabling the 1.1B model to fit within 40GB of GPU RAM.", "To reduce memory bandwidth overhead and speed up inference, we use grouped-query attention in our model. We have 32 heads for query attention and use 4 groups of key-value heads. With this technique, the model can share key and value representations across multiple heads without sacrificing much performance","Yes, TinyLlama is open-source","This dataset was collected to train StarCoder (Li et al., 2023), a powerful opensource large code language model. It comprises approximately 250 billion tokens across 86 programming languages. In addition to code, it also includes GitHub issues and text-code pairs that involve natural languages.",
]
eval_answers = [[a] for a in eval_answers]
2.4 评估指标的选择和使用 RAGAs 进行评估
metrics = [faithfulness,answer_relevancy,context_relevancy,context_precision,context_recall,
]result = evaluate(query_engine, metrics, eval_questions, eval_answers)
result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',')
请注意,默认情况下,在 RAGAs 中使用的是 OpenAI 模型。
在 RAGAs 中,如果想要使用其他 LLM(如 Gemini)与 LlamaIndex 一起对 RAG 系统进行评估,我在 RAGAs 0.0.22 版本中没有找到任何能够实现这个想法的方法,即便在调试了 RAGAs 的源代码后也没有找到。
2.5 Final code
import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"
dir_path = "YOUR_DIR_PATH"from llama_index import VectorStoreIndex, SimpleDirectoryReaderfrom ragas.metrics import (faithfulness,answer_relevancy,context_relevancy,context_recall,context_precision
)from ragas.llama_index import evaluatedocuments = SimpleDirectoryReader(dir_path).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()eval_questions = ["Can you provide a concise description of the TinyLlama model?","I would like to know the speed optimizations that TinyLlama has made.","Why TinyLlama uses Grouped-query Attention?","Is the TinyLlama model open source?","Tell me about starcoderdata dataset",
]
eval_answers = ["TinyLlama is a compact 1.1B language model pretrained on around 1 trillion tokens for approximately 3 epochs. Building on the architecture and tokenizer of Llama 2, TinyLlama leverages various advances contributed by the open-source community (e.g., FlashAttention), achieving better computational efficiency. Despite its relatively small size, TinyLlama demonstrates remarkable performance in a series of downstream tasks. It significantly outperforms existing open-source language models with comparable sizes.","During training, our codebase has integrated FSDP to leverage multi-GPU and multi-node setups efficiently. Another critical improvement is the integration of Flash Attention, an optimized attention mechanism. We have replaced the fused SwiGLU module from the xFormers (Lefaudeux et al., 2022) repository with the original SwiGLU module, further enhancing the efficiency of our codebase. With these features, we can reduce the memory footprint, enabling the 1.1B model to fit within 40GB of GPU RAM.", "To reduce memory bandwidth overhead and speed up inference, we use grouped-query attention in our model. We have 32 heads for query attention and use 4 groups of key-value heads. With this technique, the model can share key and value representations across multiple heads without sacrificing much performance","Yes, TinyLlama is open-source","This dataset was collected to train StarCoder (Li et al., 2023), a powerful opensource large code language model. It comprises approximately 250 billion tokens across 86 programming languages. In addition to code, it also includes GitHub issues and text-code pairs that involve natural languages.",
]
eval_answers = [[a] for a in eval_answers]metrics = [faithfulness,answer_relevancy,context_relevancy,context_precision,context_recall,
]result = evaluate(query_engine, metrics, eval_questions, eval_answers)
result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',')
请注意,在终端(terminal)运行程序时,pandas 数据框可能无法完全显示。如图 6 所示,我们可以将其导出为 CSV 文件来查看。
图 6:Final result. Image by author.
从图 6 中可以明显看出,第四个问题 “Tell me about starcoderdata dataset, ” 所有指标全部是 0 。这是因为 LLM 无法为这个问题提供回答。第二和第三个问题的上下文精确率(context precision)为0,这表明检索到的上下文中相关的上下文没有排在最前面。第二个问题的上下文召回率(context recall)为 0,表明检索到的上下文与人工标注的答案不匹配。
现在,再来看看 0 到 3 号问题的相关评估情况。模型对这些问题的回答相关性得分都很高,表明模型回答与问题之间相关程度很高。此外,Faithfulness 指标的分数并不低,这表明答案主要是从上下文中得出或总结出来的,因此可以得出结论,这些答案并非由 LLM 产生的幻觉。
此外,我们发现,尽管上下文相关程度(Context Relevance)得分较低,但 gpt-3.5-turbo-16k(RAGAs 使用的默认模型)仍然能够从中推导出答案。
从这些结果来看,显然这个基础的 RAG 系统还有很大的改进空间。
03 Conclusion
RAGAs 能够提供多样、全面的评估指标帮助开发者评估 RAG App,并且调用方便。目前,市场上的 RAG 评估框架都还不够完善,RAGAs 是一个效果比较好的 RAG App 评估工具。
在调试 RAGAs 的内部源代码时,我们发现 RAGAs 仍处于早期开发阶段。我们对其未来的更新和进一步改进持乐观态度。
最后,如果您对本文有任何疑问,请在评论区留言指出!
Thanks for reading!
——
Florian June
An artificial intelligence researcher, mainly write articles about Large Language Models, data structures and algorithms, and NLP.
END
参考资料
[1]https://arxiv.org/pdf/2309.15217.pdf
[2]https://docs.ragas.io/en/latest/concepts/metrics/index.html
[3]https://arxiv.org/pdf/2401.02385.pdf
本文经原作者授权,由 Baihai IDP 编译。如需转载译文,请联系获取授权。
原文链接:
https://ai.plainenglish.io/advanced-rag-03-using-ragas-llamaindex-for-rag-evaluation-84756b82dca7
相关文章:

Advanced RAG 03:运用 RAGAs 与 LlamaIndex 评估 RAG 应用
编者按:目前,检索增强生成(Retrieval Augmented Generation,RAG)技术已经广泛使用于各种大模型应用场景。然而,如何准确评估 RAG 系统的性能和效果,一直是业界和学界共同关注的重点问题。若无法…...
leetcode
找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串) 示例 1: 输入: s "…...

Unity DOTS《群体战斗弹幕游戏》核心技术分析之3D角色动画
最近DOTS发布了正式的版本, 我们来分享现在流行基于群体战斗的弹幕类游戏,实现的核心原理。今天给大家介绍大规模战斗群体3D角色的动画如何来实现。 DOTS 对角色动画支持的局限性 截止到Unity DOTS发布的版本1.0.16,目前还是无法很好的支持3D角色动画。在DOTS 的ba…...
react异步组件如何定义使用 标准使用方法
目录 默认导出和命名导出的格式 默认导出的组件 使用方式 命名导出的组件 使用方式 默认导出和命名导出的格式 默认导出: // person.js const person {name: Alice,age: 30 };export default person;命名导出: // math.js export const add (a, b) > a b; exp…...

React + Ts + Vite + Antd 项目搭建
1、创建项目 npm create vite 项目名称 选择 react 选择 typescript 关闭严格模式 建议关闭严格模式,因为不能自动检测副作用,有意双重调用。将严格模式注释即可。 2、配置sass npm install sass 更换所有后缀css为sass vite.config.ts中注册全局样式 /…...

js爬虫puppeteer库 解决网页动态渲染无法爬取
我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来,是因为这个网页这里是实时渲染的,我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …...

代码随想录:二叉树5
目录 102.二叉树的层序遍历 题目 代码(队列实现) 107.二叉树的层序遍历II 题目 代码 199.二叉树的右视图 题目 代码 637.二叉树的层平均值 题目 代码 102.二叉树的层序遍历 题目 给你二叉树的根节点 root ,返回其节点值的 层序遍…...

Tomcat 获取客户端真实IP X-Forwarded-For
Tomcat 获取客户端真实IP X-Forwarded-For 代码实现: 在Host标签下面添加代码: <Valve className"org.apache.catalina.valves.RemoteIpValve" remoteIpHeader"x-forwarded-for" remoteIpProxiesHeader"x-forwarded-by&q…...

记录PS学习查漏补缺
PS学习 PS学习理论快捷键抠图PS专属多软件通用快捷键 PS学习 理论 JPEG (不带透明通道) PNG (带透明通道) 快捷键 抠图 抠图方式 魔棒工具 反选选中区域 CtrlShiftI(反选) 钢笔抠图注意事项 按着Ctrl单击节点 会出现当前节…...

Kafka 架构深入探索
目录 一、Kafka 工作流程及文件存储机制 二、数据可靠性保证 三 、数据一致性问题 3.1follower 故障 3.2leader 故障 四、ack 应答机制 五、部署FilebeatKafkaELK 5.1环境准备 5.2部署ELK 5.2.1部署 Elasticsearch 软件 5.2.1.1修改elasticsearch主配置文件 5.2…...

k-means聚类算法的MATLAB实现及可视化
K-means算法是一种无监督学习算法,主要用于数据聚类。其工作原理基于迭代优化,将数据点划分为K个集群,使得每个数据点都属于最近的集群,并且每个集群的中心(质心)是所有属于该集群的数据点的平均值。以下是…...
Excel文件转Asc文件
单个转换 import os import pandas as pdfilename (10)result01-1.xlsx df pd.read_excel(filename) # 读取Excel文件# 将数据保存为ASC格式 asc_filename os.path.splitext(filename)[0] .asc # 获取文件名并替换扩展名 with open(asc_filename, w) as file:# 写入文件…...

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7
【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书,赛题,解析等资料,知识点培训服务 添加博主wx:liuliu548…...

Webrtc 信令服务器实现
webrtc建联流程图 由上图可知,所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了,目前普遍的方式HTTP/HTTPS,WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…...

【Blockchain】连接智能合约与现实世界的桥梁Chainlink
去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果,即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统,去中心化的预言机网络有可能为智能合…...

解决EasyPoi导入Excel获取不到第一列的问题
文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …...

Vue 阶段练习:记事本
将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中(如该练习 记事本),我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…...
JavaScript判断受访域名,调用不同的js文件
比如:我有三个域名: ① dengoo.net ② jfzm.cc ③ ceeha.com 如果当前访问的是 dengoo.net 域名及域名下页面,则调用 a.js 如果当前访问的是 jfzm.cc 域名及域名下页面,则调用 b.js 如果当前访问的是 ceeha.com 域名及域名下…...
下载软件时的Ubuntu x86_64-v2、skylake、aarch64版本分别代表什么?
Ubuntu-x86_64-v2、Ubuntu-x86_64-skylake和Ubuntu-aarch64都是Ubuntu的不同版本或变种,它们之间的主要区别在于所支持的硬件架构和针对特定硬件的优化。 Ubuntu-x86_64-v2: 这是基于x86_64(也称为AMD64或Intel 64)架构的Ubuntu版…...

数字化社交的引擎:解析Facebook的影响力
Facebook,作为全球最大的社交媒体平台,已经深深地融入了我们的日常生活和文化中。它不仅仅是一个简单的社交工具,更是一个复杂的数字生态系统,影响着我们的社交模式、文化认同以及信息获取方式。在这篇文章中,我们将深…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...