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

【Trulens框架】用TruLens 自动化 RAG 应用项目评估测试

  前言: 什么是Trulens

        TruLens是面向神经网络应用的质量评估工具,它可以帮助你使用反馈函数来客观地评估你的基于LLM(语言模型)的应用的质量和效果。反馈函数可以帮助你以编程的方式评估输入、输出和中间结果的质量,从而加快和扩大实验评估的范围。你可以将它用于各种各样的用例,包括问答、检索增强生成和基于代理的应用。

        TruLens的核心思想是,你可以为你的应用定义一些反馈函数,这些函数可以根据你的应用的目标和期望,对你的应用的表现进行打分或分类。例如:

  • 定义一个反馈函数来评估你的问答应用的输出是否与问题相关,是否有依据,是否有用。

  • 定义一个反馈函数来评估你的检索增强生成应用的输出是否符合语法规则,是否有创造性,是否有逻辑性。

  • 定义一个反馈函数来评估你的基于代理的应用的输出是否符合道德标准,是否有友好性,是否有诚实性。

一、 RAG应用项目质量评估现状

         随着 RAG 项目的逐渐丰富和成熟,越来越多的工作会深入到各种细节的打磨,例如 Prompt 模板调优,更换更新的模型,各类阈值或者参数的调整等。然而 RAG 项目普遍缺乏比较客观的、系统化的测试工具来衡量性能和质量指标。 

     我们需要从人工手动构造数据用例来靠人为对输出内容进行肉眼比对评估,转变为通过工具客观的对输出的数据进行精准评估,Trulens就是我们需要依赖的工具之一。

      TruLens 的出现给我们提供了一种简单的、系统化的方法来评估 LLM 应用。TruLens 使用 Query,Response,Context 三个核心要素,可以做以下几方面的自动化评估:

  • Response 是否跟 query 相关
  • Context(召回的知识)是否跟 query 相关
  • Response 是否严格基于 Context 作答
  • 如有提供标准答案,还可以跟标准答案做对比

二、Trulens原理介绍      

        下面我们通过介绍如何用 TruLens 框架,做自动化 RAG 项目评估测试,以及跟踪每次迭代后指标的改善情况。

        TruLens 框架通过引入一种称为“反馈函数(Feedback Function)”的功能,帮助我们以编程方式评估 LLM 应用的输入、输出和中间结果的质量。这些反馈函数就像是一个个的打分器,分别告诉我们 LLM 应用在哪些方面做得好,哪些方面需要改进。比如,它们可以帮助我们检查回答问题的准确性、是否存在有害的语言、用户的情感反馈等等。我们还可以根据自己的需求自定义这些反馈函数。

我们以 Groundedness 评估为例:

  1. 我们把测试器 TrulensApp 通过 API 连接到 LLM 应用
  2. TrulensApp 开始追踪并记录 query,response,context
  3. Groundedness Feedback 函数(context,response)加载到该评估器的提示词模板中,拼成一个 prompt 给 AWS Bedrock Claude v2 模型进行打分,并把打分记录下来,并可以在 dashboard 中查看

三、主要评估方式介绍 

以 RAG 知识问答项目为例, 主要使用以下四种官方预置的评估方式:

  • groundedness – 主要用于检测 LLM 幻觉,使用 COT(思维链)方式,找出 response 中的句子在 context 中的存在证据,评估回复是否是基于知识生成。

打分标准:Supporting Evidence: <Choose the exact unchanged sentences 
in the source that can answer the statement, 
if nothing matches, say NOTHING FOUND>
支持证据: <选择与陈述完全相同且未改变的句子,
如果没有匹配项,请说“NOTHING FOUND”>Score: <Output a number between 0-10 where 0 
is no information overlap and 10 is all information 
is overlapping>
分数:<输出一个介于 0 到 10 之间的数字,
其中 0 表示没有信息重叠,10 表示所有信息都重叠>。

比如:我们对 LLM 应用提问:AWS MSK 可以用于什么应用?

得到的 Response 是:

Response[ Select.Recordoutput 
用于数据集成、流处理、数据管道等各种应用。它提供了基础设施稳定运行的保障,
例如底层的EC2.EBS卷等,分别有其对应的SLA保障。AWSMSK与AWs ldentity and Access Management (lAM)和AWS certificate Manager集成以实现安全性;
与AWs Glue Schema Registry集成用于schema管理:
与Amazon Kinesis Data Analytics和AWS Lambda集成用于流式传输处理。
所以AWS MSK可以用于数据集成、流处理、数据管道等各种应用。"

    Trulens 会把本次 LLM 召回的 context 和 response 填充到 groundedness 评估的提示词模板中。如下所示,提示词要求评估模型把 response 中的每个句子跟 context 中的内容进行对比,找出引用依据,并对引用是否一致进行打分。

LLM_GROUNDEDNESS_FULL_SYSTEM = """You are a INFORMATION OVERLAP classifier 
providing the overlap of information between a SOURCE and STATEMENT.
For every sentence in the statement, please answer with this template:TEMPLATE: 
Statement Sentence: <Sentence>, 
Supporting Evidence: <Choose the exact unchanged sentences in the source that can 
answer the statement, if nothing matches, say NOTHING FOUND>
Score: <Output a number between 0-10 where 0 is no information overlap and 10 is 
all information is overlapping>SOURCE:{context}STATEMENT:{response}
"""

其中 SOURCE:{context} 填充我们 RAG 召回的知识内容 context,STATEMENT:{Response} 填充答复。

Prompt 中会要求评估模型按照以下格式输出结论:

GROUNDEDNESS_REASON_TEMPLATE = """
Statement Sentence: {statement_sentence}
Supporting Evidence: {supporting_evidence}
Score: {score} 

实际发给评估模型的完整 Prompt 如下图所示:

You are a INFORMATION OVERLAp classifier providing the overlap of information 
between a SOURCE and STATEMENTFor every sentence in the statement, please answer 
with this template:
TEMPLATE:Statement Sentence: <Sentence>,Suporting Evidence: <Choose the exact 
unchanged sentences in the source that can answer the statement, if nothing 
matches, say NOTHING FOUND>Score: <output a number between 0-18 where a is no 
information overlap and 10 is all information is overlappina>Give me the 
INFORMATION OVERLAP of this SOURCE and STATEMENTSOURCE:[['Question:AWS MSK提供了哪些优势?\nAnswer: AWS MSK提供了基础设施稳定运行的保障,,
例如底层的EC2,EBS卷等,分别有其对应的SLA保障。","Question:AWS MSK与哪些AWS服务紧密集
STATEHMENT:用于数据集成、流处理、数据管道等各种应用。它提供了基础设施稳定运行的保障,例如底层的
EC2,E8S卷等,分别有其对应的SLA保障、AWS MsK与Aws Identitv and Acess Manaement (IA)来

得到模型打分的回复如下:

一共有 3 个句子,前 2 个找到对应的原句,而最后一个没有找到。

用于数据集成、流处理、、数据管道等各种应用它提供了基础设施稳定分开有厂KSupporting Evidence:什么是
AWS MSK?\nAnswer: AWS MSK是亚马逊云科技推出的ApacheKafka的云托管版本,用于数据集成、流处理、
数据管道等各种应用,例如底层的EC2,EBS卷等,分别有其对应的SLA保障,AWS MSK提供了基础设施稳定运行的
保障Score: 10
Score: 10
Statenent senteule: Ms K与As Jdentity and Aaces MmeIt (IlNws certificate(iamB0etc成
以字现安全性:与Ns Gue sihena Reouistrv售寸用Fs(beme;营理:与amn37om Kinesis ata 
&malvtircs型ywslamnbda售或用于资式传外理Suporting vidence: Ms isK5s Identity and Aces lenagetnent(Ixmis certificate emager集
*以实现安全t;与Ms Giue schene Ragistng成用于schen营型:5Amngz0n Kinesis Data 
mnalyticspHms lanbda集成用于流式传物处理,等等。所以AWS MSK可以用于数据集成、流处理、数据管道等各种应用。,Supporting Evidence: NOTHING 
FOUND,
Score: 0

所以平均分是 20/3 = 6.67 分,最后除以 10 归一化到 0-1,则最终本条得分是 0.67分。

  • answer_relevance – 用于 response 相关性评估,使用 COT(思维链)方式,找出相关性证据并打分,评估 response 是否跟问题相关。具体流程跟上面类似,因此我们不再重复。
  • 打分标准:

    • Long RESPONSES should score equally well as short RESPONSES.
      长答案和短答案应该得到同样高的分数。
    • Answers that intentionally do not answer the question, such as ‘I don’t know’ and model refusals, should also be counted as the most RELEVANT.
      明确不回答问题的答案,如“我不知道”和模型拒绝应该也被视为最相关的答案。
    • RESPONSE must be relevant to the entire PROMPT to get a score of 10.
      答案必须与整个问题描述相关才能得到 10 分。
    • RELEVANCE score should increase as the RESPONSE provides RELEVANT context to more parts of the PROMPT.
      相关性分数应随答案提供更多问题描述相关内容而增加。
    • RESPONSE that is RELEVANT to none of the PROMPT should get a score of 0.
      与问题描述完全无关的答案应得到 0 分。
    • RESPONSE that is RELEVANT to some of the PROMPT should get as score of 2, 3, or 4. Higher score indicates more RELEVANCE.
      与问题描述部分相关的答案应得到 2、3 或 4 分,分数越高表示相关性越强。
    • RESPONSE that is RELEVANT to most of the PROMPT should get a score between a 5, 6, 7 or 8. Higher score indicates more RELEVANCE.
      与问题描述大部分相关的答案应得到 5-8 分,分数越高表示相关性越强。
    • RESPONSE that is RELEVANT to the entire PROMPT should get a score of 9 or 10.
      与问题描述完全相关的答案应得到 9 或 10 分。
    • RESPONSE that is RELEVANT and answers the entire PROMPT completely should get a score of 10.
      完全回答问题描述的答案应得到 10 分。
    • RESPONSE that confidently FALSE should get a score of 0.
      明确错误的答案应得到 0 分。
    • RESPONSE that is only seemingly RELEVANT should get a score of 0.
      仅表面似是而非的相关答案应得到 0 分。
打分标准:
Long RESPONSES should score equally well as short RESPONSES.
长答案和短答案应该得到同样高的分数。
Answers that intentionally do not answer the question, 
such as ‘I don’t know’ and model refusals, 
should also be counted as the most RELEVANT.
明确不回答问题的答案,如“我不知道”和模型拒绝应该也被视为最相关的答案。
RESPONSE must be relevant to the entire PROMPT to 
get a score of 10.
答案必须与整个问题描述相关才能得到 10 分。
RELEVANCE score should increase as the RESPONSE provides 
RELEVANT context to more parts of the PROMPT.
相关性分数应随答案提供更多问题描述相关内容而增加。
RESPONSE that is RELEVANT to none of the PROMPT should get a score of 0.
与问题描述完全无关的答案应得到 0 分。
RESPONSE that is RELEVANT to some of the PROMPT should 
get as score of 2, 3, or 4. Higher score indicates more RELEVANCE.
与问题描述部分相关的答案应得到 2、3 或 4 分,分数越高表示相关性越强。
RESPONSE that is RELEVANT to most of the PROMPT should 
get a score between a 5, 6, 7 or 8. Higher score indicates more RELEVANCE.
与问题描述大部分相关的答案应得到 5-8 分,分数越高表示相关性越强。
RESPONSE that is RELEVANT to the entire PROMPT should 
get a score of 9 or 10.
与问题描述完全相关的答案应得到 9 或 10 分。
RESPONSE that is RELEVANT and answers the entire PROMPT 
completely should get a score of 10.
完全回答问题描述的答案应得到 10 分。
RESPONSE that confidently FALSE should get a score of 0.
明确错误的答案应得到 0 分。
RESPONSE that is only seemingly RELEVANT should get a score of 0.
仅表面似是而非的相关答案应得到 0 分。
  • context_relevance -主要用于知识召回相关性评估,使用 COT(思维链)方式,找出相关性证据并打分,评估召回知识是否跟问题相关。

打分标准:

Respond only as a number from 0 to 10 where 0 is the least relevant and 10 is the most relevant.
将 0 到 10 之间的数字作为回答,0 表示最不相关,10 表示最相关。

A few additional scoring guidelines:

  • Long STATEMENTS should score equally well as short STATEMENTS.
    长语句应该与短语句得分相当。
  • RELEVANCE score should increase as the STATEMENT provides more RELEVANT context to the QUESTION.
    相关性得分应随语句为问题提供的相关上下文的增加而提高。
  • RELEVANCE score should increase as the STATEMENT provides RELEVANT context to more parts of the QUESTION.
    相关性得分应随语句为问题的更多部分提供相关上下文而提高。
  • STATEMENT that is RELEVANT to some of the QUESTION should score of 2, 3 or 4. Higher score indicates more RELEVANCE.
    对问题的某些部分相关的语句应该得 2、3 或 4 分。更高的分数表示更高的相关性。
  • STATEMENT that is RELEVANT to most of the QUESTION should get a score of 5, 6, 7 or 8. Higher score indicates more RELEVANCE.
    对问题的大部分相关的语句应该得 5、6、7 或 8 分。更高的分数表示更高的相关性。
  • STATEMENT that is RELEVANT to the entire QUESTION should get a score of 9 or 10. Higher score indicates more RELEVANCE.
    对问题的全部相关的语句应该得 9 或 10 分。更高的分数表示更高的相关性。
  • STATEMENT must be relevant and helpful for answering the entire QUESTION to get a score of 10.
    语句必须与整个问题相关和有帮助才能得到 10 分。
  • Answers that intentionally do not answer the question, such as ‘I don’t know’, should also be counted as the most relevant.
    故意不回答问题的答案,如“我不知道”,也应计为最相关的。
  • Groundtruth – 用于 response 准确性评估,使用已有的测试集标准答案进行对比评估,并打分。

打分标准:

Answer only with an integer from 1 to 10 based on how close the responses are to the right answer.
根据与正确答案的接近程度,回答只能使用 1 到 10 之间的整数。

四、使用方法

      使用 TruLens 非常简单, 我们只需要按照它的一些步骤,构建一个测试器和反馈函数来连接我们的 LLM 应用,然后,我们用一些测试问题对 LLM 应用进行调用,TruLens 会自动记录下 LLM 应用的输入和输出,反馈函数会对输入和输出进行评估打分,并生成一个仪表板。以 RAG 知识问答项目为例,我们将使用上面提到的四种评估方式,对系统进行整体评估。

环境准备(学习项目使用的是AWS的RAG)

1. 如果还没有部署我们的 RAG 知识问答项目,请参考 https://github.com/aws-samples/private-llm-qa-bot 说明文档,在 AWS 海外 region(中国区无法使用 Bedrock)上部署一套 RAG 项目。

2. 在本地机器环境中运行测试脚本,需要在本地环境中安装 aws cli 命令行工具,配置并配置 AWS IAM 用户的 aws credentials,且这个用户需要配置 lambda invoke 和 bedrock 权限。

3. 安装 jupter notebook,下载 trulength.ipynb 到本地机器运行。

解释

##使用 aws cli 配置 aws credentials aws configure 
##安装 notebook pip3 install notebook##启动 jupyter notebook jupyter notebook --ip=0.0.0.0

4. jupyter notebook 启动后,点击控制台输出的链接,登录 notebook server,打开 private-llm-qa-bot/notebooks/model_eval/trulength.ipynb,按说明进行执行。

5. 准备好一个测试集列表 xlsx 文件,第一列是 query 列表,如果用到 Groundtruth 评估,则还需要再第 2 列放对应的标准答案。

6. 执行测试代码,根据实际部署情况在代码中修改对应的账号和测试文件路径。

7. 一个 app_id 代表一次测试结果,可以通过 get_leaderboard() 查看所有测试的汇总结果。

8. 启动仪表盘 run_dashboard(), 会产生一个 http://xxx:8501 的链接,浏览器访问,可以查看更细维度的结果。

五、实现简介

1. 首先定义一个 RAG_from_scratch 类,用于连接 RAG 应用。我们是直接连接 RAG 项目的主 Lambda 函数。

为 retrieve 和 query 函数加上装饰器@instrument,这样 trulens 框架会对这 2 个函数的输入输出进行记录存储。

解释

class RAG_from_scratch:@instrumentdef retrieve(self, query: str) -> list:results = self.call_remote_service(query, retrieve_only=True)ret = [result['doc'] for result in results]return retdef call_remote_service(self,query:str,retrieve_only:bool = False, max_token :int =1024):## 构建pay loadpayload={"msgid":str(uuid.uuid4()),"chat_name":"OnlyForDEBUG","prompt":query,"use_qa":True,"multi_rounds":False,"hide_ref":True,"use_stream":False,"max_tokens":max_token,"retrieve_only":retrieve_only,"temperature": 0.01,"use_trace": False,"system_role": "","system_role_prompt": "","model_name": MODEL_NAME,"template_id": "1702434088941-4073e3","username": "test"}start = time.time()response = lambda_client.invoke(FunctionName = main_func,InvocationType='RequestResponse',Payload=json.dumps(payload))print(f'time cost:{time.time()-start}')payload_json = json.loads(response.get('Payload').read())     body = payload_json['body']# print(body)if retrieve_only:extra_info =  body[0]['extra_info']return extra_info['recall_knowledge']else:answer = body[0]['choices'][0]['text']return answer@instrumentdef query(self, query: str) -> str:context_str = self.retrieve(query)completion = self.call_remote_service(query)return completion

Python

2. 使用 Claude 作为评估器的基础模型。当前 trulens-eval-0.18.3 版本不支持 claude v2,因此需要对 trulens_eval.feedback.provider.bedrock 进行重载实现。

3. 定义四个 feedback 函数,分别用于评估回复准确性,模型幻觉,回复相关性,召回相关性。

解释

from trulens_eval.feedback.provider.bedrock import Bedrock as fBedrock
from typing import Dict, Optional, Sequence
class NewBedrock(fBedrock):model_id :str = "anthropic.claude-v2"def __init__(self,*args,model_id,**kwargs):super().__init__(*args,model_id=model_id,**kwargs)  def convert_messages(self,messages:list) ->str: prompt = ''for msg in messages:if msg['role'] == 'system':prompt += msg['content'] + '\\n'elif msg['role'] == 'user':prompt += msg['content'] + '\\n'return prompt# LLMProvider requirementdef _create_chat_completion(self,prompt: Optional[str] = None,messages: Optional[Sequence[Dict]] = None,**kwargs) -> str:assert self.endpoint is not Noneif not prompt and messages:prompt = self.convert_messages(messages)print('*********** prompt to claude:***********\n',prompt)import jsonbody = json.dumps({"prompt": f"\n\nHuman: {prompt}\n\nAssistant:","max_tokens_to_sample": 2000,"temperature": 0.1,"top_p": 0.9,})modelId = self.model_idresponse = self.endpoint.client.invoke_model(body=body, modelId=modelId)response_body = json.loads(response.get('body').read()).get('completion')print('*********** claude response:***********\n',response_body)return response_body

4. 使用 golden_set 测试集进行评估

解释

# Define a groundtruth feedback function
f_groundtruth = (Feedback(GroundTruthAgreement(golden_set,provider=llm_provider).agreement_measure, name = "Ground Truth").on_input_output()
)grounded = Groundedness(groundedness_provider=llm_provider)
# Define a groundedness feedback function
f_groundedness = (Feedback(grounded.groundedness_measure_with_cot_reasons, name = "Groundedness").on(Select.RecordCalls.retrieve.rets.collect()).on_output().aggregate(grounded.grounded_statements_aggregator)
)# Question/answer relevance between overall question and answer.
f_qa_relevance = (Feedback(llm_provider.relevance_with_cot_reasons, name = "Answer Relevance").on(Select.RecordCalls.retrieve.args.query).on_output()
)# Question/statement relevance between question and each context chunk.
f_context_relevance = (Feedback(llm_provider.qs_relevance_with_cot_reasons, name = "Context Relevance").on(Select.RecordCalls.retrieve.args.query).on(Select.RecordCalls.retrieve.rets.collect()).aggregate(np.mean)
)

六、应用案例

例如我们要测试一下新的提示词模板的是否对效果有帮助。我们做了两次对比测试。Leaderboard 里有 2 次测试结果,分别对应的是我们 RAG 应用的提示词模板 Template v2 和 Template v1 效果对比。

从平均分以及测试问题的得分明细探查,可以我们看出 v2 的改动比 v1 表现更差。

Template v1 vs v2

七、总结与结论

        随着 LLM 的兴起,越来越多的开发人员开始构建各种基于 LLM 的应用 App,如问答系统、聊天机器人、文档摘要、写作等。TruLens 给我们提供了一种简单的,系统化的方法来评估的 LLM 应用,衡量性能和质量指标,以及跟踪每次迭代后指标的改善情况。本文介绍了 Trulens 的基本原理和使用方法,并以一个实际的 RAG 项目为例,介绍了如何用 Trulens 框架和 Bedrock Claude v2 进行项目评测。

        在实际的运用中,由于 Trulens 仍然是依靠 LLM 对结果进行评估,因此可能出现某些单个问题的评估结果有较大偏差的情况,但是如果测试集问题数量足够丰富(>=30 个以上),我们仍然能从总评分上得到参考意义。

注:本文是参考AWS的一篇文章,如有问题,请及时告知,谢谢

相关文章:

【Trulens框架】用TruLens 自动化 RAG 应用项目评估测试

前言&#xff1a; 什么是Trulens TruLens是面向神经网络应用的质量评估工具&#xff0c;它可以帮助你使用反馈函数来客观地评估你的基于LLM&#xff08;语言模型&#xff09;的应用的质量和效果。反馈函数可以帮助你以编程的方式评估输入、输出和中间结果的质量&#xff0c;从而…...

互联网线上融合上门洗衣洗鞋小程序,让洗衣洗鞋像点外卖一样简单

随着服务创新的风潮&#xff0c;众多商家已巧妙融入预约上门洗鞋新风尚&#xff0c;并携手洗鞋小程序&#xff0c;开辟线上蓝海。那么&#xff0c;这不仅仅是一个小程序&#xff0c;它究竟蕴含着哪些诱人好处呢&#xff1f; 1. 无缝融合&#xff0c;双线共赢&#xff1a;小程序…...

R语言绘制三维散点图

之前我们绘制的属于二维散点图&#xff0c;具有两个维度通常是 x 轴和 y 轴&#xff09;上展示数据点的分布。只能呈现两个变量之间的关系。而三维散点图则具有三个维度&#xff08;x 轴、y 轴和 z 轴&#xff09;上展示数据点的分布。可以同时呈现三个变量之间的关系&#xff…...

2014年国赛高教杯数学建模A题嫦娥三号软着陆轨道设计与控制策略解题全过程文档及程序

2014年国赛高教杯数学建模 A题 嫦娥三号软着陆轨道设计与控制策略 嫦娥三号于2013年12月2日1时30分成功发射&#xff0c;12月6日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为2.4t&#xff0c;其安装在下部的主减速发动机能够产生1500N到7500N的可调节推力&#xff0c;…...

QD1-P25 CSS 背景

本节学习&#xff1a;CSS 背景属性 本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p25 背景颜色 ​​ 背景图片 不重复 ​​ 横向重复 ​​ 纵向重复 ​​ 双向重复 ​​ 背景图片大小 400px ​​ 600px ​​ 原图大小 ​​ 显示器宽度不够时&…...

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版分片集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…...

Java利用ChromeDriver插件网页截图(Wondows版+Linux版)

chromedriver是谷歌浏览器驱动,用来模拟谷歌运行操作的一个工具&#xff0c;此处主要讲解Java后端利用此插件进行网页截图&#xff0c;并且适配Linux部署。 环境准备 Wondows服务器或电脑 本机需安装Chrome谷歌浏览器&#xff0c;根据本机浏览器版本&#xff0c;下载对应的chr…...

无人机之交互系统篇

一、系统构成 无人机交互系统通常由多个子系统组成&#xff0c;包括但不限于&#xff1a; 多模式人机交互装置&#xff1a;这是人机交互系统的基础层&#xff0c;通常包括计算机、局域网、传感器等设备&#xff0c;用于实现操作员与无人机之间的数据交互和指令传递。例如&…...

MarsCode--找出数字比例超过n/2的【简单】

问题描述 给定一个长度为n的整型数组&#xff0c;已知其中一个数字的出现次数超过数组长度的一半&#xff0c;找出这个元素 输入格式 一个长度为n的数组&#xff0c;其中某个元素的出现次数大于n/2 输出格式 一个整数 输入样例 [1,3,8,2,3,1,3,3,3] 输出样例 3 数据范…...

Python网络爬虫快速入门指南

Python网络爬虫快速入门指南 网络爬虫&#xff0c;也称为网络蜘蛛&#xff0c;是一种自动访问互联网并提取信息的程序。Python因其简洁明了的语法和丰富的库支持&#xff0c;成为开发网络爬虫的理想选择。在这篇博客中&#xff0c;我们将探讨如何快速入门Python网络爬虫技术&a…...

C86 架构一键离线安装 docker 和 docker-compose 实战指南

C86 架构一键离线安装 docker 和 docker-compose 实战指南 文章目录 C86 架构一键离线安装 docker 和 docker-compose 实战指南一 磁盘挂载二 docker 部署1 上传安装包2 解压安装包3 安装包 docker 三 验证安装四 清除安装包五 安装包下载地址 本文提供了在 C86 架构环境下&…...

【LwIP源码学习2】调试输出相关宏

前言 本文对lwip中debug.h文件里的调试相关宏进行分析。 正文 debug.h中有3个重要的调试相关宏&#xff1a; LWIP_ASSERT(message, assertion) LWIP_ERROR(message, expression, handler) LWIP_DEBUGF(debug, message) 断言 LWIP_ASSERT(message, assertion) 源代码为&…...

Python 列表专题:删除元素

Python 是一种强大的编程语言,广泛应用于数据分析、Web 开发、人工智能等多个领域。而列表(List)作为 Python 中最基本的数据结构之一,扮演着非常重要的角色。列表不仅可以存储各种类型的数据,还提供了丰富的操作接口,方便我们进行数据的增删改查。本篇博文将深入探讨 Py…...

Spring Boot 快速入门与核心原理详解

引言 在上一篇文章中&#xff0c;我们详细探讨了 Spring 框架中的事件监听与发布机制。本文将转向 Spring Boot&#xff0c;介绍如何快速入门 Spring Boot&#xff0c;并深入探讨其核心原理。Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;旨在简化 Spring 应用的初…...

UniApp 与微信小程序详细对比

UniApp 与微信小程序详细对比 1. 开发环境 微信小程序&#xff1a; 主要使用微信开发者工具提供模拟器、调试工具和性能监控只能开发微信小程序 UniApp&#xff1a; 主要使用 HBuilderX&#xff0c;但也支持 VS Code 等其他编辑器HBuilderX 提供可视化界面、代码提示、调试工…...

【用大模型提示工程处理NLP任务】

Batch API Prompt 工程 任务一&#xff1a;文本分类 任务二&#xff1a;情感分析 任务三&#xff1a;文档处理 任务四&#xff1a;信息抽取 任务五&#xff1a;机器翻译 任务六&#xff1a;生成任务 任务七&#xff1a;文本纠错 Batch API Prompt 工程 Batch API 适用于…...

适配器模式、代理模式(C++)

适配器模式&#xff1a; 定义&#xff1a;适配器模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类一起工作。它通过将一个类的接口转换成客户端期望的另一个接口&#xff0c;使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 代理模式&#xff1a; 定义&a…...

unity 2d 近战攻击判定的三种方式以及精确获取碰撞点

精确获取碰撞点 核心是获取武器碰撞盒最顶点&#xff0c;然后获取敌人碰撞盒距离该点最近的点 /// <summary>/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// </summary>/// <param name"collider"></param>/// <param name"…...

矩形函数的傅里叶变换——从一维到二维,从连续到离散

一维连续矩形函数的傅里叶变换 二维连续矩形函数的傅里叶变换 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》P109 2D DFT 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系…...

潜水打捞系统助力,破解汽车打捞难题

随着人类活动的不断扩展&#xff0c;汽车落水事故频发&#xff0c;成为救援工作中的一大难题。汽车因其重量和结构特性&#xff0c;一旦沉入水体&#xff0c;打捞工作将面临巨大挑战。传统的打捞方法往往效率低下&#xff0c;且在操作过程中可能会对汽车造成进一步的损害&#…...

【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5

【深度学习】经典的深度学习模型-01 开山之作&#xff1a;CNN卷积神经网络LeNet-5 Note: 草稿状态&#xff0c;持续更新中&#xff0c;如果有感兴趣&#xff0c;欢迎关注。。。 0. 论文信息 article{lecun1998gradient, title{Gradient-based learning applied to document r…...

LeetCode 每日一题 2024/10/7-2024/10/13

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/7 871. 最低加油次数10/8 1436. 旅行终点站10/9 3171. 找到按位或最接近 K 的子数组10/10 3162. 优质数对的总数 I10/11 3164. 优质数对的总数 II10/12 3158. 求出出现两…...

ZYNQ使用XGPIO驱动外设模块(前半部分)

目录 目录 一、新建BD文档&#xff0c;添加ZYNQ处理器 1.BD文档: 2.在Vivado中&#xff0c;BD文件的生成过程通常包括以下步骤&#xff1a; 1)什么是Tcl Console: 3.PL部分是FPGA可编程逻辑部分&#xff0c;它提供了丰富的IO资源&#xff0c;可以用于实现各种硬件接口和功…...

【FastAdmin】全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架

全栈视角下的页面跳转实现&#xff1a;从原生html、javascrpt、php技术到jQuery、FastAdmin框架 1 引言 页面跳转是Web开发中的基本操作&#xff0c;不同的技术栈提供了不同的实现方法。本文将详细介绍在原生JavaScript、原生HTML、原生PHP、jQuery以及FastAdmin框架中实现页…...

从零开始搭建一个node.js后端服务项目

目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon&#xff0c;实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程&#xff0c;此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…...

自定义注解和组件扫描在Spring Boot中动态注册Bean(一)

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;自定义注解和组件扫描是两种强大的机制&#xff0c;它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性&#xff0c;还使得Spring Boot应用的…...

如何在 IDEA 中导入 Java 项目的 Git 仓库并启动

目录 前言1. 从 Git 仓库导入 Java 项目2. 配置 Maven2.1 配置 Maven 仓库和设置文件2.2 加载依赖 3. 配置 Tomcat 并运行项目3.1 配置 Tomcat3.2 配置 Server URL3.3 启动项目 4. 常见问题与解决方法4.1 Maven 依赖无法下载4.2 Tomcat 部署失败4.3 项目启动后无法访问 结语 前…...

BIO与NIO学习

BIO&#xff1a;同步阻塞IO&#xff0c;客户端一个连接请求&#xff08;socket&#xff09;对应一个线程。阻塞体现在: 程序在执行I/O操作时会阻塞当前线程&#xff0c;直到I/O操作完成。在线程空闲的时候也无法释放用于别的服务只能等当前绑定的客户端的消息。 BIO的代码实现 …...

麒麟操作系统:解决umount命令卸载USB存储设备时报“device is busy”错误

麒麟操作系统&#xff1a;解决umount命令卸载USB存储设备时报“device is busy”错误 1、问题描述2、问题解决方法步骤1&#xff1a;尝试强制卸载步骤2&#xff1a;查找占用设备的进程步骤3&#xff1a;终止占用进程步骤4&#xff1a;卸载USB设备 &#x1f490;The Begin&#…...

Git客户端使用之TortoiseGit和Git

git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的)&#xff0c;安…...