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

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...