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

使用 LlamaIndex Workflows 与 Elasticsearch

作者:来自 Elastic Jeffrey Rengifo

在本文中,你将学习如何利用 LlamaIndex Workflows 与 Elasticsearch 快速构建一个使用 LLM 的自过滤搜索应用程序。

LlamaIndex Workflows 提出了一种不同的方式来处理将任务拆分给不同 agent 的问题,它引入了一个步骤与事件的架构。这种架构相比于基于 DAG(Directed Acyclic Graph - 有向无环图)的方法,例如 LangGraph,简化了设计。如果你想进一步了解关于 agent 的内容,推荐你阅读这篇文章。

Image Source: Introducing workflows beta: a new way to create complex AI applications with LlamaIndex — LlamaIndex - Build Knowledge Assistants over your Enterprise Data

LlamaIndex 的一项主要功能是能够在执行过程中轻松创建循环。循环可以帮助我们完成自动纠错任务,因为我们可以重复某个步骤,直到获得预期结果或达到设定的重试次数。

为了测试这一功能,我们将构建一个流程,使用 LLM 根据用户的问题生成 Elasticsearch 查询,并在生成的查询无效时启用自动纠错机制。如果在设定次数内 LLM 无法生成有效查询,我们将切换模型并继续尝试,直到超时为止。

为了优化资源使用,我们可以先使用更快且更便宜的模型生成初始查询,如果生成仍然失败,则改用更昂贵的模型。

理解步骤与事件

步骤是通过代码函数运行的操作。它接收一个事件以及一个上下文,该上下文可以被所有步骤共享。基础事件有两种类型:

  • StartEvent,是启动流程的事件

  • StopEvent,用于停止事件的执行

一个 Workflow 是一个包含所有步骤与交互的类,用于将它们组合在一起。

我们将创建一个 Workflow 来接收用户请求、展示映射和可筛选字段、生成查询语句,然后通过循环修复无效的查询。对于 Elasticsearch 来说,查询可能无效的原因包括:生成的 JSON 不合法,或语法错误。

为了展示其工作原理,我们将使用一个实际案例:搜索酒店房间。通过 workflow 提取值,根据用户的搜索来构建查询。

完整示例可在这个 Notebook 中查看。

步骤

  • 安装依赖并导入包

  • 准备数据

  • LlamaIndex workflows

  • 执行 workflow 任务

安装依赖并导入包

我们将使用 mistral-saba-24b 和 llama3-70b Groq 模型,因此除了 elasticsearch 和 llama-index,还需要安装 llama-index-llms-groq 包来处理与 LLM 的交互。

Groq 是一个推理服务,允许我们使用来自 Meta、Mistral 和 OpenAI 等提供商的多个开源模型。在本示例中,我们将使用它的免费层。你可以在此处获取稍后使用的 API KEY。

下面是所需依赖项的安装:Elasticsearch、LlamaIndex 核心库以及 LlamaIndex 的 Groq LLM 包。

pip install elasticsearch==8.17 llama-index llama-index-llms-groq

我们首先导入一些依赖项,用于处理环境变量(os)和管理 JSON 数据。

然后,我们导入 Elasticsearch 客户端,并使用 bulk helper 来通过 bulk API 进行索引。最后,我们导入 LlamaIndex 中的 Groq 类,以便与模型交互,并导入创建 workflow 所需的组件。

import os
import json
from getpass import getpassfrom elasticsearch import Elasticsearch
from elasticsearch.helpers import bulkfrom llama_index.llms.groq import Groq
from llama_index.core.workflow import (Event,StartEvent,StopEvent,Workflow,step,
)

2. 准备数据

设置密钥

我们设置 Groq 和 Elasticsearch 所需的环境变量。getpass 库允许我们通过提示输入密钥,并且不会显示输入的内容。

os.environ["GROQ_API_KEY"] = getpass("Groq Api key: ")
os.environ["ELASTIC_ENDPOINT"] = getpass("Elastic Endpoint: ")
os.environ["ELASTIC_API_KEY"] = getpass("Elastic Api key: ")

Elasticsearch 客户端

Elasticsearch 客户端负责与 Elasticsearch 进行连接,并允许我们使用 Python 库与 Elasticsearch 进行交互。

_client = Elasticsearch(os.environ["ELASTIC_ENDPOINT"],api_key=os.environ["ELASTIC_API_KEY"],
)

将数据导入 Elasticsearch

我们将以酒店房间为例创建一个索引:

INDEX_NAME="hotel-rooms"

映射

我们将使用文本类型字段(text)用于需要执行全文搜索的属性;使用 "keyword" 类型用于需要应用筛选或排序的字段,使用 "byte/integer" 类型用于数字。

try:_client.indices.create(index=INDEX_NAME,body={"mappings": {"properties": {"room_name": {"type": "text"},"description": {"type": "text"},"price_per_night": {"type": "integer"},"beds": {"type": "byte"},"features": {"type": "keyword"},}}},)print("index created successfully")
except Exception as e:print(f"Error creating inference endpoint: {e.info['error']['root_cause'][0]['reason'] }")

将文档导入 Elasticsearch

我们将导入一些酒店房间和设施,以便用户可以提问,我们可以将这些问题转化为针对文档的 Elasticsearch 查询。

documents = [{"room_name": "Standard Room","beds": 1,"description": "A cozy room with a comfortable queen-size bed, ideal for solo travelers or couples.","price_per_night": 80,"features": ["air conditioning", "wifi", "flat-screen TV", "mini fridge"]},{"room_name": "Deluxe Room","beds": 1,"description": "Spacious room with a king-size bed and modern amenities for a luxurious stay.","price_per_night": 120,"features": ["air conditioning", "wifi", "smart TV", "mini bar", "city view"]},{"room_name": "Family Room","beds": 2,"description": "A large room with two queen-size beds, perfect for families or small groups.","price_per_night": 150,"features": ["air conditioning", "wifi", "flat-screen TV", "sofa", "bath tub"]},{"room_name": "Suite","beds": 1,"description": "An elegant suite with a separate living area, offering maximum comfort and luxury.","price_per_night": 200,"features": ["air conditioning", "wifi", "smart TV", "jacuzzi", "balcony"]},{"room_name": "Penthouse Suite","beds": 1,"description": "The ultimate luxury experience with a panoramic view and top-notch amenities.","price_per_night": 350,"features": ["air conditioning", "wifi", "private terrace", "jacuzzi", "exclusive lounge access"]},{"room_name": "Single Room","beds": 1,"description": "A compact and comfortable room designed for solo travelers on a budget.","price_per_night": 60,"features": ["wifi", "air conditioning", "desk", "flat-screen TV"]},{"room_name": "Double Room","beds": 1,"description": "A well-furnished room with a queen-size bed, ideal for couples or business travelers.","price_per_night": 100,"features": ["air conditioning", "wifi", "mini fridge", "work desk"]},{"room_name": "Executive Suite","beds": 1,"description": "A high-end suite with premium furnishings and exclusive business amenities.","price_per_night": 250,"features": ["air conditioning", "wifi", "smart TV", "conference table", "city view"]},{"room_name": "Honeymoon Suite","beds": 1,"description": "A romantic suite with a king-size bed, perfect for newlyweds and special occasions.","price_per_night": 220,"features": ["air conditioning", "wifi", "hot tub", "romantic lighting", "balcony"]},{"room_name": "Presidential Suite","beds": 2,"description": "A luxurious suite with separate bedrooms and a living area, offering first-class comfort.","price_per_night": 500,"features": ["air conditioning", "wifi", "private dining area", "personal butler service", "exclusive lounge access"]}
]

我们将 JSON 文档解析为一个 bulk Elasticsearch 请求。

def build_data():for doc in documents:yield {"_index": INDEX_NAME, "_source": doc}try:success, errors = bulk(_client, build_data())print(f"{success} documents indexed successfully")if errors:print("Errors during indexing:", errors)except Exception as e:print(f"Error: {str(e)}")

3. LlamaIndex Workflows

我们需要创建一个类,包含将 Elasticsearch 映射发送到 LLM、运行查询并处理错误所需的函数。

class ElasticsearchRequest:@staticmethoddef get_mappings(_es_client: Elasticsearch):"""Get the mappings of the Elasticsearch index."""return _es_client.indices.get_mapping(index=INDEX_NAME)@staticmethodasync def do_es_query(query: str, _es_client: Elasticsearch):"""Execute an Elasticsearch query and return the results as a JSON string."""try:parsed_query = json.loads(query)if "query" not in parsed_query:return Exception("Error: Query JSON must contain a 'query' key")  # if the query is not a valid JSON return an errorresponse = _es_client.search(index=INDEX_NAME, body=parsed_query)hits = response["hits"]["hits"]if not hits or len(hits) == 0:return Exception("Query has not found any results")  # if the query has no results return an errorreturn json.dumps([hit["_source"] for hit in hits], indent=2)except json.JSONDecodeError:return Exception("Error: Query JSON no valid format")except Exception as e:return Exception(str(e))

Workflow 提示

EXTRACTION_PROMPT 将提供用户的问题,并将索引映射传递给 LLM,以便它返回一个 Elasticsearch 查询。

然后,REFLECTION_PROMPT 将帮助 LLM 在出现错误时进行修正,方法是提供来自 EXTRACTION_PROMPT 的输出以及查询引起的错误。

EXTRACTION_PROMPT = """
Context information is below:
---------------------
{passage}
---------------------Given the context information and not prior knowledge, create a Elasticsearch query from the information in the context.
The query must return the documents that match with query and the context information and the query used for retrieve the results.
{schema}"""REFLECTION_PROMPT = """
You already created this output previously:
---------------------
{wrong_answer}
---------------------This caused the error: {error}Try again; the response must contain only valid Elasticsearch queries. Do not add any sentence before or after the JSON object.
Do not repeat the query.
"""

Workflow 事件

我们创建了类来处理提取和查询验证事件:

class ExtractionDone(Event):output: strpassage: strclass ValidationErrorEvent(Event):error: strwrong_output: strpassage: str

Workflow

现在,让我们把一切结合起来。首先,我们需要将最大尝试次数设置为 3 次,以便更换模型。

接下来,我们将使用在 workflow 中配置的模型进行 extraction。我们验证事件是否为 StartEvent;如果是,我们捕获模型和问题(段落)。

然后,我们运行 validation 步骤,即尝试在 Elasticsearch 中运行提取的查询。如果没有错误,我们生成一个 StopEvent 并停止流程。否则,我们发出 ValidationErrorEvent 并重复第 1 步,提供错误信息以进行修正,然后返回验证步骤。如果在 3 次尝试后仍然没有有效查询,我们更换模型并重复此过程,直到达到 60 秒的超时运行时间参数。

class ReflectionWorkflow(Workflow):model_retries: int = 0max_retries: int = 3@step()async def extract(self, ev: StartEvent | ValidationErrorEvent) -> StopEvent | ExtractionDone:print("\n=== EXTRACT STEP ===\n")if isinstance(ev, StartEvent):model = ev.get("model")passage = ev.get("passage")if not passage:return StopEvent(result="Please provide some text in input")reflection_prompt = ""elif isinstance(ev, ValidationErrorEvent):passage = ev.passagemodel = ev.modelreflection_prompt = REFLECTION_PROMPT.format(wrong_answer=ev.wrong_output, error=ev.error)llm = Groq(model=model, api_key=os.environ["GROQ_API_KEY"])prompt = EXTRACTION_PROMPT.format(passage=passage, schema=ElasticsearchRequest.get_mappings(_client))if reflection_prompt:prompt += reflection_promptoutput = await llm.acomplete(prompt)print(f"MODEL: {model}")print(f"OUTPUT: {output}")print("=================\n")return ExtractionDone(output=str(output), passage=passage, model=model)@step()async def validate(self, ev: ExtractionDone) -> StopEvent | ValidationErrorEvent:print("\n=== VALIDATE STEP ===\n")try:results = await ElasticsearchRequest.do_es_query(ev.output, _client)self.model_retries += 1if self.model_retries > self.max_retries and ev.model != "llama3-70b-8192":print(f"Max retries for model {ev.model} reached, changing model\n")model = "llama3-70b-8192"  # if the some error occurs, the model will be changed to llama3-70b-8192else:model = ev.modelprint(f"Elasticsearch results: {results}")if isinstance(results, Exception):print("STATUS: Validation failed, retrying...\n")print("===================\n")return ValidationErrorEvent(error=str(results),wrong_output=ev.output,passage=ev.passage,model=model,)# print("results: ", results)except Exception as e:print("STATUS: Validation failed, retrying...\n")print("===================\n")return ValidationErrorEvent(error=str(e),wrong_output=ev.output,passage=ev.passage,model=model,)return StopEvent(result=ev.output)

4. 执行 workflow 任务

我们将进行以下搜索:具有智能电视、wifi、按摩浴缸且每晚价格低于 300 的房间。我们将首先使用 mistral-saba-24b 模型,并根据需要按照我们的流程切换到 llama3-70b-8192。

w = ReflectionWorkflow(timeout=60, verbose=True)user_prompt = "Rooms with smart TV, wifi, jacuzzi and price per night less than 300"result = await w.run(passage=f"I need the best possible query for documents that have: {user_prompt}",model="mistral-saba-24b",
)print(result)

结果

(格式化以便于阅读)

=== EXTRACT STEP ===

MODEL: mistral-saba-24b

OUTPUT:

{"query": {"bool": {"must": [{ "match": { "features": "smart TV" }},{ "match": { "features": "wifi" }},{ "match": { "features": "jacuzzi" }},{ "range": { "price_per_night": { "lt": 300 }}}]}}
}

Step extract produced event ExtractionDone

Running step validate

=== VALIDATE STEP ===

Max retries for model mistral-saba-24b reached, changing model

Elasticsearch 结果:

Error: Query JSON no valid format
STATUS: Validation failed, retrying...

Step validate produced event ValidationErrorEvent

Running step extract

=== EXTRACT STEP ===

MODEL: llama3-70b-8192

OUTPUT:

{"query": {"bool": {"filter": [{ "term": { "features": "smart TV" }},{ "term": { "features": "wifi" }},{ "term": { "features": "jacuzzi" }},{ "range": { "price_per_night": { "lt": 300 }}}]}}
}

Step extract produced event ExtractionDone

Running step validate

=== VALIDATE STEP ===

Elasticsearch 结果:

[{"room_name": "Suite","beds": 1,"description": "An elegant suite with a separate living area, offering maximum comfort and luxury.","price_per_night": 200,"features": ["air conditioning","wifi","smart TV","jacuzzi","balcony"]}
]

Step validate produced event StopEvent

{"query": {"bool": {"filter": [{ "term": { "features": "smart TV" }},{ "term": { "features": "wifi" }},{ "term": { "features": "jacuzzi" }},{ "range": { "price_per_night": { "lt": 300 }}}]}}
}

在上面的示例中,查询失败是因为 mistral-saba-24b 模型返回的结果是 Markdown 格式,开始时添加了 json,结尾处有 。而 llama3-70b-8192 模型直接返回了使用 JSON 格式的查询。根据我们的需求,我们可以捕获、验证并测试不同的错误,或在多次尝试后构建回退机制。

结论

LlamaIndex workflows 提供了一种有趣的替代方案,可以通过事件和步骤开发 agentic 流程。通过仅几行代码,我们成功创建了一个能够通过可互换模型进行自动纠错的系统。

我们如何改进这个流程?

  • 除了映射外,我们可以将可能的确切过滤器值发送给 LLM,从而减少由于拼写错误的过滤器导致的无结果查询。为此,我们可以对特性进行 terms 聚合并将结果展示给 LLM。

  • 添加对常见问题的代码修正,例如我们遇到的 Markdown 问题,以提高成功率。

  • 添加处理有效查询但没有结果的方式。例如,移除某个过滤器并重新尝试,向用户提供建议。LLM 可以根据上下文选择要移除的过滤器。

  • 向提示中添加更多上下文信息,如用户偏好或之前的搜索,以便我们可以在 Elasticsearch 结果的基础上提供定制化的建议。

你想尝试其中一个吗?

想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训的时间!

Elasticsearch 拥有许多新特性,帮助你为特定用例构建最佳搜索解决方案。深入探索我们的示例笔记本,了解更多内容,开始免费云试用,或立即在本地机器上尝试 Elastic。

原文:Using LlamaIndex Workflows with Elasticsearch - Elasticsearch Labs

相关文章:

使用 LlamaIndex Workflows 与 Elasticsearch

作者:来自 Elastic Jeffrey Rengifo 在本文中,你将学习如何利用 LlamaIndex Workflows 与 Elasticsearch 快速构建一个使用 LLM 的自过滤搜索应用程序。 LlamaIndex Workflows 提出了一种不同的方式来处理将任务拆分给不同 agent 的问题,它引…...

相对论大师-记录型正负性质BFS/图论-链表/数据结构

看到这一题我的第一个思路就是双向bfs 起点是a,终点还是a,但是flag是相反的(“越”的方向) tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…...

代理设计模式:从底层原理到源代码的详细解释

代理设计模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟…...

EasyRTC音视频实时通话:打造高清低延迟的远程会议新生态

一、项目背景​ 随着数字化办公的普及,远程会议成为企业、教育机构、政府部门等组织跨地域协作沟通的重要方式。传统远程会议系统在音视频质量、低延迟传输、多平台兼容性等方面存在不足,难以满足用户对高清、流畅、稳定会议体验的需求。EasyRTC作为一款…...

零基础上手Python数据分析 (21):图表选择困难症?常用可视化类型详解与应用场景指南

写在前面 —— 告别盲目绘图,理解图表语言,为你的数据找到最佳“代言人” 在前面几篇博客中,我们已经学习了使用 Matplotlib 和 Seaborn 这两大 Python 可视化利器来绘制各种图表。我们掌握了创建折线图、柱状图、散点图、箱线图等常用图表的技术。然而,仅仅知道 如何 绘…...

HarmonyOS Next 编译之如何使用多目标产物不同包名应用

引言 在日常的开发中涉及到多签名和多产物构建输出时手动切换签名文件和包名在开发中是容易出错且费时的一个操作,鸿蒙提供了自定义hvigor插件和多目标产物构建,那我们可以通过hvigor插件来动态修改不同项目配置所需要的代码,保证一套代码在…...

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3,副标题为:Optimizing Oracle Database resou…...

Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介

Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第七篇文章,将重点探讨 Sharding-JDBC 与 Spring Boot 的集成,以及 Sharding-Proxy 的基本概念…...

day30 学习笔记

文章目录 前言一、凸包特征检测1.穷举法2.QuickHull法 二、图像轮廓特征查找1.外接矩形2.最小外接矩形3.最小外接圆 前言 通过今天的学习,我掌握了OpenCV中有关凸包特征检测,图像轮廓特征查找的相关原理和操作 一、凸包特征检测 通俗的讲,凸…...

变更管理 Change Management

以下是关于项目管理中 变更管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述变更管理的理论框架、流程方法及实战应用: 一、变更管理的基本概念 1. 定义 变更管理是对项目范围、进度、成本、质量等基准的修改进行系统性控制的过程,旨在确保变…...

PaddlePaddle线性回归详解:从模型定义到加载,掌握深度学习基础

目录 前言一、paddlepaddle框架的线性回归1.1 paddlepaddle模型的定义方式1.1.1 使用序列的方式 nn.Sequential 组网1.1.2 使用类的方式 class nn.Layer组网1.2 数据加载 1.3 paddlepaddle模型的保存1.3.1 基础API保存1.3.2 高级API模型的保存1.3.2.1 训练fit进行保存1.3.2.2 …...

几种Word转换PDF的常用方法

使用 Word 内置功能 步骤:打开需要转换的 Word 文档,点击左上角的 “文件” 菜单,选择 “另存为”,选择保存位置,在 “保存类型” 下拉菜单中选择 “PDF”,点击 “保存” 按钮即可。适用场景:适…...

【美化vim】

美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...

【git】subtree拆分大的git库到多个独立git库

【git】subtree拆分大的git库到多个独立git库 一、拆分一个子目录为独立仓库 # 这就是那个大仓库 big-project git clone gitgithub.com:tom/big-project.git cd big-project# 把所有 eiyo 目录下的相关提交整理为一个新的分支 eiyo_code git subtree split -P eiyo -b eiyo_…...

Elasticsearch 使用reindex进行数据同步或索引重构

1、批量复制优化 POST _reindex {"source": {"index": "source","size": 5000},"dest": {"index": "dest"} }2、提高scroll的并行度优化 POST _reindex?slices5&refresh {"source": {…...

JDBC对数据的增删改查操作:从Statement到PrepareStatement

目录 一 . Statement简介 二. 通过Statement添加数据 1. 创建表 2. 通过Statement添加数据 a. 获取连接 b. 获取Statement对象 c. 定义SQL语句 d. 执行SQL语句 e. 关闭资源 3. 通过Statement修改数据 4. 通过Statement删除数据 三. PreparedStatement的使用(重点) …...

智体OS上线智体管家:对话式智体应用商店访问

DTNS.OS 更新公告 - 智体管家功能发布 🌟 2024年4月22日重要更新:智体管家正式上线 智体管家是智体OS推出的全新功能,旨在让用户通过自然对话轻松发现和使用智体节点上的所有智体应用,相当于为智体网络打造了一个智能化的应用商…...

vscode flutter 插件, vscode运行安卓项目,.gradle 路径配置

Flutter Flutter Widget Snippets Awesome Flutter Snippets i dart-import Dart Data Class Generator Json to Dart Model Dart Getters And Setter GetX Snippets GetX Generator GetX Generator for Flutter flutter-img-syncvscode运行安卓项目,.gradle 路径配…...

dolphinscheduler实现(oracle-hdfs-doris)数据ETL

dolphinscheduler执行 完整脚本(自行替换相关变量)配置文件conf配置文件解析脚本转base64脚本 完整脚本(自行替换相关变量) user_olsh conf/getInfo.sh Oracle user conf/databases.conf password_olsh conf/getInfo.sh Oracle password conf/databases.conf dblink_olsh conf…...

ViewBS 的工作流程

ViewBS ViewBS 的工作流程 ViewBS 提供多个顶级命令,用于确定所需和最优参数。这些命令可分为两部分:甲基化报告和功能区域的数据可视化。 在甲基化报告部分中,提供多个顶级命令,可以生成关于读取覆盖度、甲基化水平分布、全局甲基化水平等报告。 在功能区域可视化部分…...

qt调用deepseek的API开发(附带源码)

今天讲的是使用qt做一个界面(负责接受deepseek返回的数据和客户发送数据的端口)会用流的方式接受数据提高用户体验 测试效果源码流程配置deepseek调用思路deepseek与qt联合开发界面思路 上一篇文章用的不是流开发,会让客户等待很久&#xff0…...

java中值传递的含义

Java 中的值传递(Pass by Value)详解 在 Java 中,所有参数的传递都是值传递(Pass by Value),但根据传递的数据类型不同(基本类型 vs 引用类型),表现行为会有所不同。 1.…...

【自然语言处理与大模型】如何知道自己部署的模型的最大并行访问数呢?

当你自己在服务器上部署好一个模型后,使用场景会有两种。第一种就是你自己去玩,结合自有的数据做RAG等等,这种情况下一般是不会考虑并发的问题。第二种是将部署好的服务给到别人来使用,这时候就必须知道我的服务到底支持多大的访问…...

基于PHP+MySQL实现(Web)单词助手网站

WordHelper 这是一个学习 PHP 的时候依照课程设计的要求,做的一个简单的单词助手。 系统通过 CDN 引入 Vue.js 和 ElementUI,并用 PHP 搭建了一个十分十分简易的后台。 一、设计要求 1、词汇录入与编辑。提供接口让用户录入英文单词、词义、发音、词…...

Java面试实战:谢飞机的求职记 - Spring Boot、Redis与微服务技术问答解析

场景描述 谢飞机,一位自称为“Java全栈大师”的程序员,参加了某互联网大厂的Java开发岗位面试。面试官严肃而专业,针对Spring Boot、Redis缓存以及微服务架构等核心技术展开提问。以下是谢飞机在面试中的表现。 第一轮提问(基础篇…...

【数字图像处理】立体视觉信息提取

双目立体视觉原理 设一个为参考平面,一个为目标平面。增加了一个摄像头后,P与Q在目标面T上有分别的成像点 双目立体视觉:从两个不同的位置观察同一物体,用三角测量原理计算摄像机到该物体的距离的 方法 原理:三角测量…...

解析芯片低功耗设计的底层逻辑与实现方法

芯片低功耗设计的必要性可以从实际需求和技术优化两方面来探讨: 从需求角度看,工艺进步和应用场景共同驱动低功耗设计。 随着CMOS制程持续微缩,晶体管密度和时钟频率提升导致静态功耗显著增加,漏电流问题在先进工艺中尤为明显。…...

uniapp开发2--uniapp中的条件编译总结

以下是对 uni-app 中条件编译的总结: 概念: 条件编译是一种技术,允许你根据不同的平台或环境,编译不同的代码。 在 uni-app 中,这意味着你可以编写一套代码,然后根据要编译到的平台(例如微信小…...

Netty 异步机制深度解析:Future 与 Promise 的前世今生

引言:异步编程的「糖」与「痛」 在高性能网络编程中,「异步」几乎是必备的设计模式,异步的好处就是可以提升系统吞吐量,提升效率。但很多开发者初入 Netty 时,对它的异步机制总有点模糊: 为什么 ChannelF…...

如何查看MySql主从同步的偏移量

1.Mysql的主从同步方案 mysql为了在实现读写分离,主库写,从库读 mysql的同步方案主要是通过从库读取主库的binlog日志的方式。 binlog就是一个记录mysql的操作的日志记录,从库通过拿到主库的binlog知道主库进行了哪些操作,然后在从…...

短信验证码安全实战:三网API+多语言适配开发指南

在短信服务中,创建自定义签名是发送通知、验证信息和其他类型消息的重要步骤。万维易源提供的“三网短信验证码”API为开发者和企业提供了高效、便捷的自定义签名创建服务,可以通过简单的接口调用提交签名给运营商审核。本文将详细介绍如何使用该API&…...

护眼-科学使用显示器

一 显示色温对眼睛的影响 显示器的色温设置对护眼效果至关重要,合适的色温可减少蓝光伤害并缓解视疲劳。最护眼的色温并非固定值,需根据环境光、使用时间和场景动态调整。白天推荐6500K左右,夜晚降至3000K-4000K,并借助自动调节工…...

HarmonyOS:1.7

判断题 1.订阅网络状态变化事件时,通过NetConnection类型的对象调用on方法,传入具体事件类型即可: 错误(False) 2.若使用HTTP发起一个GET请求,直接调用get方法,传入请求资源的URL,即可发起请求&#xff…...

物联网赋能玻璃制造业:实现设备智能管理与生产协同

在当今数字化时代,物联网技术正深刻改变着传统制造业的发展模式,玻璃制造业也不例外。物联网的赋能,为玻璃制造业带来了设备智能管理与生产协同的新机遇,推动其向智能化、高效化迈进。 在设备智能管理方面,物联网通过…...

【我的创作纪念日】 --- 与CSDN走过的第365天

个人主页:夜晚中的人海 不积跬步,无以至千里;不积小流,无以成江海。-《荀子》 文章目录 🎉一、机缘🚀二、收获🎡三、 日常⭐四、成就🏠五、憧憬 🎉一、机缘 光阴似箭&am…...

路由器转发规则设置方法步骤,内网服务器端口怎么让异地连接访问的实现

在路由器上设置端口转发(Port Forwarding)可以将外部网络流量引导到特定的局域网设备,这对于需要远程访问服务器、摄像头、游戏主机等设备非常有用。 登录路由器管理界面,添加端口转发规则让外网访问内网的实现教程分享。以下是设…...

Kotlin 的 suspend 关键字

更多相关知识 Kotlin 的 suspend 关键字是 Kotlin 协程的核心组成部分,它用于标记一个函数可以被挂起(暂停执行)并在稍后恢复执行,而不会阻塞线程。 理解 suspend 的作用需要从以下几个方面入手: 1. 允许非阻塞的异步…...

Java面试实战:从Spring Boot到微服务的深入探讨

Java面试实战:从Spring Boot到微服务的深入探讨 场景:电商场景的面试之旅 在某互联网大厂的面试间,面试官李老师正襟危坐,而对面坐着的是传说中的“水货程序员”赵大宝。 第一轮:核心Java与构建工具 面试官&#x…...

文件操作和IO(上)

绝对路径和相对路径 文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。 绝对路径…...

【Dify(v1.2) 核心源码深入解析】Apps 模块

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容&#xff…...

小测验——根据调整好的参数进行批量输出

文章目录 一、前言与目的二、思考坐标系怎么生成2.1 补2.2 对于自己投影代码中对数据集参数的情况(取负)总结三、代码2.1 用这套代码可视化 pytorch3d能跑通的例子2.2 gshell的例子2.3 直接手写投影的例子四、思路4.1 确定牛和衣服方向4.2 推测牛的视角4.3 教程学习4.3.1 fov…...

蓝耘平台介绍:算力赋能AI创新的智算云平台

一、蓝耘平台是什么 蓝耘智算云(LY Cloud)是蓝耘科技打造的现代化GPU算力云服务平台,深度整合自研DS满血版大模型技术与分布式算力调度能力,形成"模型算力"双轮驱动的技术生态。平台核心优势如下: 平台定位…...

23种设计模式-结构型模式之桥接模式(Java版本)

Java 桥接模式(Bridge Pattern)详解 🌉 什么是桥接模式? 桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。 通过在两个独立变化的维度之间建立“桥”,避免因多维度扩展导致的类爆炸。 &#x…...

Python常用的第三方模块之数据分析【pdfplumber库、Numpy库、Pandas库、Matplotlib库】

【pdfplumber库】从PDF文件中读取内容 import pdfplumber #打开PDF文件 with pdfplumber.open(DeepSeek从入门到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍历页print(i.extract_text()) #extract_text()方法提取内容print(f----------------第{i.page_number}页结束…...

PerfettoSQL

​​​​# Device State: Top App # select id, ts, dur, name from (__query_slice_track__long_battery_tracing_Device_State_Top_app) --> 简便方法 """ INCLUDE PERFETTO MODULE android.battery_stats; select * from android_battery_stats_event_s…...

【Python笔记 03 】运算符

一、算数运算符 1、加减乘除 #加法 print (11) #减法 print (1-1) #乘法 print (1*1) #除法,注:商一定是float浮点数,不管是否能整数,且除数不能为0,如下图: print (1/1) 如果除数为0即报错提示。 …...

组网技术-BGP技术,IS-IS协议,VRRP技术

1.BGP在不同自治系统AS进行路由转发 EBGP外部边界网关协议 IBGP内部边界网关协议 2.AS指的是同一个组织管理下,使用统一选路策略的设备集合 3.AS直接需要直连链路,或者通过VPN协议构造逻辑直连进行邻居建立 4.使用IGP可能存在暴露AS内部的网络信息的…...

Word处理控件Spire.Doc系列教程:C# 为 Word 文档设置背景颜色或背景图片

在 Word 文档中,白色是默认的背景设置。一般情况下,简洁的白色背景足以满足绝大多数场景的使用需求。但是,如果您需要创建简历、宣传册或其他创意文档,设置独特的背景颜色或图片能够极大地增强文档的视觉冲击力。本文将演示如何使…...

极狐GitLab 中如何自定义角色?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 自定义角色 (ULTIMATE ALL) 引入于极狐GitLab 15.7,功能标志为 customizable_roles。默认启用于极狐GitLab 15.9…...

JAVA:Web安全防御

目录 一、Web安全基础与常见威胁 OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露 Java后端常见攻击场景 • 通过HttpServletRequest…...