重新审视 ChatGPT 和 Elasticsearch:RAG 真正将应用程序紧密结合在一起

news2024/9/25 21:22:36

作者:来自 Elastic Jeff Vestal

关注博客 ChatGPT 和 Elasticsearch:OpenAI 遇到私人数据。

在此博客中,你将了解如何:

  • 创建 Elasticsearch Serverless 项目
  • 创建推理端点以使用 ELSER 生成嵌入
  • 使用语义文本字段进行自动分块并调用 Inference Endpoint
  • 使用 Open Crawler 抓取博客
  • 使用 Elastic 的 Playground 连接到 LLM 以测试 RAG 聊天应用程序的提示和上下文设置。

如果你想直接进入代码,可以在此处查看随附的 Jupyter Notebook。

2023 年 4 月

自从我编写最初的《ChatGPT 和 Elasticsearch:OpenAI 遇到了私人数据》 以来,很多事情都发生了变化:。大多数人只是在玩 ChatGPT,如果他们真的尝试过的话。而且每个技术会议的每个展位都没有出现 “AI” 字母(无论它是否有用)。

2024 年 8 月

从那时起,Elastic 就致力于成为一个功能齐全的向量数据库,并投入了大量的工程努力,使其成为任何构建搜索应用程序的人的最佳向量数据库选项。为了避免花几页纸来谈论 Elasticsearch 的所有增强功能,下面是一个不分先后顺序的非详尽列表:

  • ELSER - Elastic Learned Sparse Encoder
  • Elastic Serverless Service 已构建并处于公开测试阶段
  • Elasticsearch 开放推理 API
    • Embeddings
    • Chat completion
    • Semantic rerankers
  • Semantic_text 类型 - 简化语义搜索
    • 自动分块
  • Playground - 在 Elasticsearch 中直观地尝试 RAG 应用程序构建
  • Retrievers - 检索器
  • Open Web Crawler - 开放网络爬虫

随着所有这些变化以及更多变化,原始博客需要重写。让我们开始吧。

更新流程

此更新流程的计划如下:

  1. 设置
    1. 创建一个新的 Elasticsearch Serverless 搜索项目
    2. 使用 ELSER 创建嵌入推理 API
    3. 使用 semantic_text 字段配置索引模板
    4. 创建一个新的 LLM 连接器
    5. 使用我们的 LLM 连接器配置chat completion 推理服务
  2. 提取和测试
    1. 使用 Elastic Open Web Crawler 爬取 Elastic Labs 网站(搜索、可观察性、安全性)。
    2. 使用 Playground 使用我们索引的 Labs 内容测试提示
  3. 配置和部署我们的应用程序
    1. 将生成的代码从 Playground 导出到使用 FastAPI 作为后端并使用 React 作为前端的应用程序。
    2. 在本​​地运行
    3. 可选择将我们的聊天机器人部署到 Google Cloud Run

设置

Elasticsearch Serverless 项目

我们将为我们的聊天机器人使用 Elastic Serverless 项目。Serverless 消除了运行 Elasticsearch 集群的大部分复杂性,让你专注于实际使用和从数据中获取价值。在此处阅读有关 serverless 架构的更多信息。

如果你没有 Elastic Cloud 帐户,你可以在 elastic.co 创建为期两周的免费试用版(Serverless 定价在此处提供)。如果你已经有一个,你只需登录即可。

登录后,你需要创建一个云 API 密钥。

注意:在下面的步骤中,我将展示 Python 代码的相关部分。为了简洁起见,我不会展示导入所需库、等待步骤完成、捕获错误等的完整代码。

如需运行更强大的代码,请参阅随附的 Jypyter 笔记本!

创建 serverless 项目

我们将使用新创建的 API 密钥执行接下来的设置步骤。

首先,创建一个新的 Elasticsearch 项目。

url = "https://api.elastic-cloud.com/api/v1/serverless/projects/elasticsearch" 

project_data = {
    "name": "The RAG Really Tied the App Together",
    "region_id": "aws-us-east-1",
    "optimized_for": "vector"
}

auth_header = f"ApiKey {api_key}"  # seeing what a comment lokos like with pound
headers = {
    "Content-Type": "application/json",
    "Authorization": auth_header
}

es_project = requests.post(url, json=project_data, headers=headers)  :four:
  • url - 这是 Elastic Cloud 的标准 Serverless 端点
  • project_data - 你的 Elasticsearch Serverless 项目设置
    • name - 我们想要的项目名称
    • region_id - 要部署的区域
    • optimized_for - 配置类型 - 我们使用的向量对于 ELSER 模型来说并不是严格要求的,但如果你选择密集向量模型(例如 e5),它可能很合适。

创建 Elasticsearch Python 客户端

创建程序化项目的一大好处是,你将获得与其交互所需的连接信息和凭据!

es = Elasticsearch(es_project_keys['endpoints']['elasticsearch'],
                   basic_auth=(es_project_keys['credentials']['username'],
                              es_project_keys['credentials']['password']
                              )
                   )

ELSER 嵌入 API

项目创建完成后(通常只需几分钟),我们就可以准备处理实验室的数据。

第一步是配置用于嵌入的推理 API。我们将使用 Elastic Learned Sparse Encoder (ELSER)。

  • 创建推理端点的命令
  • 指定此端点将用于生成稀疏嵌入
model_config = {
    "service": "elser",
    "service_settings": {
        "num_allocations": 8,
        "num_threads": 1
    }
}

inference_id = "my-elser-model"

create_endpoint = es.inference.put_model(
    inference_id=inference_id,
    task_type="sparse_embedding",
    body=model_config
)
  • model_config - 我们要用于部署语义重新排序模型的设置
    • service - 使用预定义的 elser 推理服务
    • service_settings.num_allocations - 使用 8 个分配部署模型
    • service_settings.num_threads - 每个分配使用一个线程部署
  • inference_id - 你要赋予推理端点的名称
  • task_type- 指定此端点将用于生成稀疏嵌入

此单个命令将触发 Elasticsearch 执行几个任务:

  • 它将下载 ELSER 模型。
  • 它将部署(启动)具有八个分配和每个分配一个线程的 ELSER 模型。
  • 它将创建我们在下一步的字段映射中使用的推理 API。

索引映射

创建 ELSER API 后,我们将创建索引模板。

template_body = {
    "index_patterns": ["elastic-labs*"],
    "template": {
        "mappings": {
            "properties": {
                "body": {
                    "type": "text",
                    "copy_to": "semantic_body"
                },
                "semantic_body": {
                    "type": "semantic_text",
                    "inference_id": "my-elser-model"
                },
                "headings": {
                    "type": "text"
                },
                "id": {
                    "type": "keyword"
                },
                "meta_description": {
                    "type": "text"
                },
                "title": {
                    "type": "text"
                }
            }
        }
    }
}

template_resp = es.indices.put_index_template(  :eight:
    name="labs_template",
    body=template_body
)
  • index_patterns - 我们希望此模板应用到的索引模式。
  • body - 爬虫收集的网页的主要内容将被写入
    • type - 它是一个文本字段
    • copy_to - 我们需要将该文本复制到我们的语义文本字段进行语义处理
  • semantic_body 是我们的 semantic text 字段
    • 此字段将自动处理长文本的分块并生成嵌入,我们稍后将使用它进行语义搜索
    • inference_id 指定我们上面创建的推理端点的名称,允许我们从我们的 ELSER 模型生成嵌入
  • headers - 来自 html 的标题标签
  • id - 此文档的抓取 id
  • meta_description - 来自 html 的描述元标记的值
  • title 是内容来自的网页的标题

其他字段将被索引但自动映射。我们重点在模板中预定义的字段不需要同时是关键字和文本类型,否则会自动定义。

最重要的是,对于本指南,我们必须定义我们的 semantic_text 字段并使用 copy_to 设置要从中复制的源字段。在这种情况下,我们有兴趣对文本正文执行语义搜索,爬虫会将其索引到 body 中。

爬取所有实验室!

我们现在可以安装和配置爬虫程序来爬取 Elastic * 实验室。我们将大致遵循 Open Crawler 发布的优秀指南,该指南发布于技术预览版 Search Labs 博客。

以下步骤将使用 docker 并在 MacBook Pro 上运行。要使用不同的设置运行此程序,请查阅 Open Crawler Github readme。

克隆 repo

打开你选择的命令行工具。我将使用 Iterm2。将 crawler repo 克隆到你的机器上。

~/repos
❯ git clone git@github.com:elastic/crawler.git
Cloning into 'crawler'...
remote: Enumerating objects: 1944, done.
remote: Counting objects: 100% (418/418), done.
remote: Compressing objects: 100% (243/243), done.
remote: Total 1944 (delta 237), reused 238 (delta 170), pack-reused 1526
Receiving objects: 100% (1944/1944), 84.85 MiB | 31.32 MiB/s, done.
Resolving deltas: 100% (727/727), done.

构建爬虫容器

运行以下命令来构建并运行爬虫。

docker build -t crawler-image . && docker run -i -d --name crawler crawler-image
~/repos
 ❯ cd crawler
~/repos/crawler main
 ❯ docker build -t crawler-image . && docker run -i -d --name crawler crawler-image

[+] Building 66.9s (6/10)                                                                                                                                                                docker:desktop-linux
 => [internal] load build definition from Dockerfile					0.0s
 => => transferring dockerfile: 333B							0.0s
 => [internal] load .dockerignore							0.0s
 => => transferring context: 2B								0.0s
 => [internal] load metadata for docker.io/library/jruby:9.4.7.0-jdk21		1.7s
 => [auth] library/jruby:pull token for registry-1.docker.io			0.0s
...
...
 => [5/5] RUN make clean install								50.7s
 => exporting to image									0.9s
 => => exporting layers									0.9s
 => => writing image sha256:6b3f4000a121e76aba76fdbbf11b53f53a3fabba61c0b7cf3fdcdb21e244f1d8	0.0s
 => => naming to docker.io/library/crawler-image					0.0s
cc6c16941de04355c050ef5f5fd0041ee7f3505b8cf8448c7223f0d2e80b5498

配置爬虫

在你最喜欢的编辑器(vim)中创建一个新的 YAML:

~/repos/crawler main
 ❯ vim config/elastic-labs.yml

我们想要抓取这三个实验室网站上的所有文档,但由于这些网站上的博客和教程往往会链接到 elastic.co 的其他部分,因此我们需要设置几次运行来限制范围。我们将允许抓取我们网站的三个路径,然后拒绝其他任何路径。

将以下内容粘贴到文件中并保存

domains:
  - url: https://www.elastic.co
    seed_urls:
      - https://www.elastic.co/search-labs
      - https://www.elastic.co/observability-labs
      - https://www.elastic.co/security-labs
    crawl_rules:
      - policy: allow
        type: begins
        pattern: /search-labs
      - policy: allow
        type: begins
        pattern: /observability-labs
      - policy: allow
        type: begins
        pattern: /security-labs
      - policy:deny
        type: regex
        pattern: .*/author/.*
      - policy: deny
        type: regex
        pattern: .*

output_sink: elasticsearch
output_index: elastic-labs
max_crawl_depth: 2

elasticsearch:
  host: "https://<your_serverless_project>.es.<region>.aws.elastic.cloud"
  port: "443"
  api_key: "<API Key generated above>"

将配置复制到 Docker 容器中:

~/repos/crawler main ⇣
 ❯ docker cp config/elastic-labs.yml crawler:/app/config/elastic-labs.yml

Successfully copied 2.05kB to crawler:/app/config/elastic-labs.yml

验证域

通过运行以下命令确保配置文件没有问题:

 ❯ docker exec -it crawler bin/crawler validate config/elastic-labs.yml
Domain https://www.elastic.co is valid

启动爬虫

首次运行爬虫时,处理三个实验室网站上的所有文章可能需要几分钟。

docker exec -it crawler bin/crawler crawl config/elastic-labs.yml
~/repos/crawler/config main ⇣
 ❯ docker exec -it crawler bin/crawler crawl config/elastic-labs.yml
[crawl:6692c3b584f98612e3a465ce] [primary] Initialized an in-memory URL queue for up to 10000 URLs
[crawl:6692c3b584f98612e3a465ce] [primary] ES connections will be authorized with configured API key
[crawl:6692c3b584f98612e3a465ce] [primary] ES connections will use SSL without ca_fingerprint
[crawl:6692c3b584f98612e3a465ce] [primary] Elasticsearch sink initialized for index [elastic-labs] with pipeline [ent-search-generic-ingestion]
[crawl:6692c3b584f98612e3a465ce] [primary] Starting the crawl with up to 10 parallel thread(s)...
[crawl:6692c3b584f98612e3a465ce] [primary] Crawl status: queue_size=11, pages_visited=1, urls_allowed=12, urls_denied={}, crawl_duration_msec=847, crawling_time_msec=635.0, avg_response_time_msec=635.0, active_threads=1, http_client={:max_connections=>100, :used_connections=>1}, status_codes={"200"=>1}

确认文章已被索引

我们将通过两种方式进行确认。

首先,我们将查看示例文档以确保已生成 ELSER 嵌入。我们只想查看任何文档,这样我们就可以在没有任何参数的情况下进行搜索:

GET elastic-labs/_search

确保你获得结果,然后检查字段 body 是否包含文本以及 semantic_body.inference.chunks.0.embeddings 是否包含标记。

    "hits": [
      {
        "_index": "elastic-labs",
...
        "_source": {
          "body": "Tutorials Integrations Blog Start Free Trial Contact Sales Open navigation menu Overview ...
          "semantic_body": {
            "inference": {
              "inference_id": "my-elser-model",
              "model_settings": {
                "task_type": "sparse_embedding"
              },
              "chunks": [
                {
                  "text": "Tutorials Integrations Blog Start Free Trial Contact Sales Open navigation menu Overview ...
                  "embeddings": {
                    "##her": 2.1016746,
                    "elastic": 2.084594,
                    "##ai": 1.6336359,
                    "dock": 1.5765089,
                    ...

我们可以通过 terms 聚合来检查我们是否从三个站点分别收集数据:

GET elastic-labs/_search
{
  "size": 0,
  "aggs": {
    "url_path_dir1": {
      "terms": {
        "field": "url_path_dir1.keyword"
      }
    }
  }
}

你应该会看到以我们的三个站点路径之一开头的结果。

      "buckets": [
        {
          "key": "security-labs",
          "doc_count": 37
        },
        {
          "key": "observability-labs",
          "doc_count": 30
        },
        {
          "key": "search-labs",
          "doc_count": 6
        }
      ]

前往 Playground!

通过提取、分块和推理数据,我们可以开始编写将与 RAG 应用程序的 LLM 交互的后端应用程序代码。

LLM 连接

我们需要为 Playground 配置一个连接,以便对 LLM 进行 API 调用。截至撰写本文时,Playground 支持与 OpenAI、AWS Bedrock 和 Google Gemini 的聊天完成连接。计划提供更多连接,因此请查看文档以获取最新列表。

首次进入 Playground UI 时,单击 “Connect to an LLM

由于我在原始博客中使用了 OpenAI,因此我们将坚持使用它。Playground 的优点在于,你可以将连接切换到其他服务,并且 Playground 代码将专门针对该服务的 API 规范生成代码。你只需要选择今天要使用哪一个。

在此步骤中,你必须根据要使用的 LLM 填写字段。如上所述,由于 Playground 将抽象出 API 差异,因此你可以使用任何适合你的受支持的 LLM 服务,本指南中的其余步骤将以相同的方式工作。

如果你没有 Azure OpenAI 帐户或 OpenAI API 帐户,你可以在此处获取一个(OpenAI 现在要求至少 5 美元来资助 API 帐户)。

完成后,点击 “Save”,你将收到连接器已添加的确认信息。之后,你只需选择我们将在应用中使用的索引。你可以选择多个,但由于我们所有的爬虫数据都将进入 elastic-labs,因此你可以选择一个。

单击 “Add data sources”,你就可以开始使用 Playground 了!

选择之前创建的 “restaurant_reviews ”索引。

在 Playground 中尝试

添加数据源后,你将进入 Playground UI。

为了尽可能简化入门过程,我们将坚持使用除提示之外的所有默认设置。但是,有关 Playground 组件及其使用方法的更多详细信息,请查看 Playground:在几分钟内使用 Elasticsearch 尝试 RAG 应用程序博客和 Playground 文档。

试验不同的设置以满足你的特定数据和应用程序需求是设置 RAG 支持的应用程序的重要部分。

我们将使用的默认值是:

  • 查询 semantic_body 块
  • 使用三个最近的语义块作为上下文传递给 LLM

创建更详细的提示

Playground 中的默认提示只是一个占位符。随着 LLM 功能越来越强大,提示工程也不断发展。探索不断变化的提示工程世界是一个博客,但在创建系统提示时需要记住一些基本概念:

  • 在描述 LLM 响应所属的应用程序或服务时要详细说明。这包括将提供哪些数据以及谁将使用响应。
  • 提供示例问题和响应。这种称为少发提示的技术可帮助 LLM 构建其响应。
  • 清楚地说明 LLM 应如何表现。
  • 指定所需的输出格式。
  • 测试并迭代提示。

考虑到这一点,我们可以创建一个更详细的系统提示:

You are a helpful and knowledgeable assistant designed to assist users in querying information related to Search, Observability, and Security. Your primary goal is to provide clear, concise, and accurate responses based on semantically relevant documents retrieved using Elasticsearch.

Guidelines:

Audience:
Assume the user could be of any experience level but lean towards a technical slant in your explanations.
Avoid overly complex jargon unless it is common in the context of Elasticsearch, Search, Observability, or Security.

Response Structure:
Clarity: Responses should be clear and concise, avoiding unnecessary verbosity.
Conciseness: Provide information in the most direct way possible, using bullet points when appropriate.

Formatting: Use Markdown formatting for:
Bullet points to organize information
Code blocks for any code snippets, configurations, or commands
Relevance: Ensure the information provided is directly relevant to the user's query, prioritizing accuracy.

Content:
Technical Depth: Offer sufficient technical depth while remaining accessible. Tailor the complexity based on the user's apparent knowledge level inferred from their query.

Examples: Where appropriate, provide examples or scenarios to clarify concepts or illustrate use cases.
Documentation Links: When applicable, suggest additional resources or documentation from Elastic.co that can further assist the user.

Tone and Style:
Maintain a professional yet approachable tone.
Encourage curiosity by being supportive and patient with all user queries, regardless of complexity.

Example Queries:
"How can I optimize my Elasticsearch cluster for large-scale data?"
"What are the best practices for implementing observability in a microservices architecture?"
"How can I secure sensitive data in Elasticsearch?"

你可以随意测试不同的提示和上下文设置,看看你认为最适合特定数据的结果。有关高级技术的更多示例,请查看提示部分两部分博客:高级 RAG 技术中。同样,请参阅 Playground 博客文章,了解有关你可以调整的各种设置的更多详细信息。

导出代码

在后台,Playground 会生成我们执行语义搜索、解析相关上下文字段以及向 LLM 发出聊天完成调用所需的所有后端聊天代码。我们无需进行任何编码工作!

在右上角单击 “View Code” 按钮以展开代码弹出窗口

你将看到生成的 Python 代码,其中包含你配置的所有设置以及对 Elasticsearch 进行语义调用、解析结果、构建完整提示、调用 LLM 和解析这些结果的函数。

单击复制图标以复制代码。

你现在可以将代码合并到你自己的聊天应用程序中!

总结

自一年多前第一次发布此博客以来,发生了很多变化,我们在本博客中涵盖了很多内容。你从云 API 密钥开始,创建了 Elasticsearch Serverless 项目,生成了云 API 密钥,配置了 Open Web Crawler,爬取了三个 Elastic Lab 站点,对长文本进行了分块,生成了嵌入,测试了 RAG 应用程序的最佳聊天设置,并导出了代码!

UI 在哪里,Vestal?

请关注第二部分,我们将在其中将操场代码集成到具有 React 前端的 Python 后端中。我们还将研究部署完整的聊天应用程序。

有关上述所有内容的完整代码集,请参阅随附的 Jypyter 笔记本

准备好自己尝试一下了吗?开始免费试用。

Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的 Beyond RAG Basics 网络研讨会,构建你的下一个 GenAI 应用程序!

原文:ChatGPT and Elasticsearch integration: RAG enhancements for chatbots — Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot如何进行全局异常处理?

1.为什么需要全局异常处理&#xff1f; 在日常开发中&#xff0c;为了不抛出异常堆栈信息给前端页面&#xff0c;每次编写Controller层代码都要尽可能的catch住所有service层、dao层等异常&#xff0c;代码耦合性较高&#xff0c;且不美观&#xff0c;不利于后期维护。 应用场…

基于java的少儿编程网上报名系统+vue

TOC ssm006基于java的少儿编程网上报名系统vue 研究背景 近年来&#xff0c;随着网络技术的不断发展&#xff0c;越来越多人在网站查询各种信息&#xff0c;少儿编程网上报名系统对用户和管理员都有很大帮助&#xff0c;少儿编程网上报名系统通过和数据库管理系软件协作来实…

基于STM32开发的智能安防报警系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理报警控制与通知Wi-Fi通信与远程监控应用场景 家庭安防管理商铺和办公室的智能安防常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居和物联网技…

拟合的置信区间

目标图: 图片来源:Fig. 4e from Arwani, Ruth Theresia, et al. "Stretchable ionic–electronic bilayer hydrogel electronics enable in situ detection of solid-state epidermal biomarkers." Nature Materials (2024): 1-8. 1. 数据输入 假设原始数据如下:…

书生大模型实战营第三期基础岛第二课——8G 显存玩转书生大模型 Demo

8G 显存玩转书生大模型 Demo 基础任务进阶作业一&#xff1a;进阶作业二&#xff1a; 基础任务 使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署&#xff0c;并生成 300 字小故事&#xff0c;记录复现过程并截图。 创建conda环境 # 创建环境 conda create -n demo pytho…

协作新选择:即时白板在线白板软件分享

在团队合作中&#xff0c;产品经理扮演着至关重要的角色&#xff0c;他们不仅是产品与用户之间的纽带&#xff0c;更是产品性能和用户需求的桥梁。他们需要深入参与产品的研发过程&#xff0c;并与研发团队保持紧密的沟通。因此&#xff0c;产品经理需要一款高效的协作工具来提…

纯电SUV挑花眼了?看看这两款十多万的家用SUV谁更香

文/王俣祺 导语&#xff1a;随着新能源技术的日益成熟&#xff0c;现如今纯电汽车已经在市场上卖得风生水起。早些时候人们可能还会对纯电汽车抱有“续航焦虑”&#xff0c;但随着各个车型在电池容量以及能耗方面都迎来了进步&#xff0c;充电网络也日渐完善&#xff0c;选择一…

多商户多套部署需修改注意事项

同一台服务器上部署多个多商户项目&#xff0c;需要修改和调整的地方等。 一、修改代码中的端口号&#xff0c;需要两个项目不能使用同一个端口号&#xff0c;例如&#xff1a;A项目用&#xff1a;8324&#xff0c;B项目用&#xff1a;8325&#xff1b; 二、修改反向代理&…

认识泛型VS包装类

1.包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了 一个包装类型。 ps:为什么需要包装类&#xff1f;说白了java就是面向对象编程的 比如&#xff1a;Java 的集合框架&am…

笔记整理—uboot启动过程(3)栈的二次设置以及常用名词解析,BL1部分完

前文说到了uboot的lowlevel_init都干了些什么&#xff0c;也就是经过了这项初期的低级启动&#xff0c;使得我们能在串口监视器上看见机器打印出的第一句话“OK”。当lowlevel_init结束后&#xff0c;uboot去做了另一件事情&#xff0c;那就是栈的再次设置。 第一次栈设置发生在…

昂科烧录器支持Analogix硅谷数模的USB-C端口控制器ANX7406

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Analogix硅谷数模的USB-C端口控制器ANX7406已经被昂科的通用烧录平台AP8000所支持。 ANX7406是一款USB Type-C™&#xff08;USB-C&#xff09;端口控制器&#xff0c;符合最新…

网络 通信

一、客户端接收(也可以bind) 1. socket socket 函数 用于创建一个套接字&#xff08;socket&#xff09;&#xff0c;这是网络通信的基础。 它的原型如下&#xff1a;int socket(int domain, int type, int protocol); 参数&#xff1a; domain&#xff1a;指定协议族&…

go-zero接入skywalking链路追踪

文章目录 Skywalking本地测试搭建项目引入dockerfile打包引入最后效果图 Skywalking本地测试搭建 这里用Docker搭建 #数据存储用ES&#xff0c;搭建ES docker run -d -p 9200:9200 -p 9300:9300 --name es -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-X…

【C++】12.智能指针

在上一篇博客【C】11.异常中我们知道有些时候会造成内存空间的未释放从而导致内存泄漏&#xff0c;因此本篇博客的内容就是如何减少内存泄漏——智能指针。 一、RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用对象生命周期来控制程序资…

基于单片机的指纹识别考勤系统设计

本设计基于STC89C52为主控的指纹考勤系统&#xff0c;主要分为光学AS608指纹识别模块、LCD12864液晶模块、AT24C02存储芯片、DS1302时钟芯片模块、矩阵按键模块。AS608指纹模块进行指纹的采集&#xff1b;矩阵按键能实现对指纹的录入、删除、编号&#xff1b;AT24C02存储模块对…

如何使用ssm实现网上服装销售系统

TOC ssm047网上服装销售系统jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于网上服装销售系统系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商品信息管…

[Meachines] [Easy] Optimum HFS文件管理2.3.x-RCE+MS16-032

信息收集 IP AddressOpening Ports10.10.10.8TCP:80 $ nmap -p- 10.10.10.8 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http HttpFileServer httpd 2.3 |_http-server-header: HFS 2.3 |_http-title: HFS / Service Info: OS: Windows; CP…

Python计算机视觉 第2章-局部图像描述子

Python计算机视觉 第2章-局部图像描述子 2.1 Harris角点检测器 Harris角点检测算法&#xff08;也称Harris & Stephens角点检测器&#xff09;是一个极为简单的角点检测算法。该算法的主要思想是&#xff0c;如果像素周围显示存在多于一个方向的边&#xff0c;我们认为该…

滥用 DHCP 管理员组来提升 Windows 域中的权限

介绍 从 Google Docs 到 Active Directory,访问管理几乎影响到组织中的每个角色。在讨论权限和访问控制时,如何最大限度地减少员工的挫败感而不增加不必要的风险是一个微妙的平衡——安全团队痛苦地意识到了这一点。 因此,“刚好足够的访问权限”是任何访问策略的关键要素…

鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上)

快锁上下篇 鸿蒙内核实现了Futex&#xff0c;系列篇将用两篇来介绍快锁&#xff0c;主要两个原因: 网上介绍Futex的文章很少&#xff0c;全面深入内核介绍的就更少&#xff0c;所以来一次详细整理和挖透。涉及用户态和内核态打配合&#xff0c;共同作用&#xff0c;既要说用户…