使用 Jina Embeddings v5 和 Elasticsearch 构建“与你的网站数据聊天”的 agent

作者:来自 Elastic Ugo SangiorgiLily Adler

学习如何在一小时内,使用 Elasticsearch Serverless、Jina Embeddings v5、Elastic Open Web Crawler 和 Elastic Agent Builder,构建一个可用且有事实依据的"与你的网站聊天"体验。

Agent Builder 现已正式发布。通过 Elastic Cloud Trial 开始使用,并在此查看 Agent Builder 的文档。


使用 Elasticsearch Serverless、Jina Embeddings v5、Elastic Open Web Crawler 和 Elastic Agent Builder,在一小时内构建一个 "与你的网站聊天" 的体验。

完成后,你将拥有一个可用的 agent,能够搜索你抓取的页面,引用相关段落,并基于你的内容回答问题,无需自定义分块或 embedding 管道。

在本指南中,你将:

  1. 启动一个 Elasticsearch Serverless 项目
  2. 使用由 Jina Embeddings v5 驱动的新 semantic_text 字段创建索引
  3. 使用 Elastic Crawler Control(又名 Crawly)(围绕 Elastic Open Web Crawler 的开源 UI + API 封装)抓取任意网站
  4. 在 Kibana 中使用 Elastic Agent Builder 与这些数据聊天

你将获得:

  • 一个可复用的模式,可指向任意网站或 docs 数据源
  • 始终基于你内容的聊天体验

先决条件:

  • 一个 Elasticsearch Serverless( Search ) 项目,以及一个具有写权限的 API key
  • Docker + Docker Compose(用于运行 crawler UI)
  • git(用于克隆 repo)

1)启动一个 Elasticsearch Serverless 项目

首先,我们需要一个 serverless 项目来托管我们的数据。

  1. 登录你的 Elastic Cloud Console
  2. 点击 Create project
  3. 选择 Search 作为项目类型。(该类型针对向量搜索和检索进行了优化。)
  4. 为项目命名(例如 es-labs-jina-guide),然后点击 Create
  5. 重要 :保存项目创建时提供的 Elasticsearch endpointAPI Key。你将在 crawler 中用到它们。

2)创建索引

Elasticsearch Serverless 支持 semantic_text,它会自动处理分块和 embedding 生成。我们将使用托管在 Elastic Inference Service GPU 上的 .jina-embeddings-v5-text-small 模型。

使用 semantic_text 字段创建索引。这会告诉 Elastic 使用我们刚刚创建的 inference endpoint,对写入该字段属性的内容自动进行向量化。

在 Kibana Dev tools 中运行:

复制代码
PUT furnirem-website
{
  "mappings": {
    "_meta": {
      "description": "Each document represents a web page with the following schema: 'title' and 'meta_description' provide high-level summaries; 'body' contains the full text content; 'headings' preserves the page hierarchy for semantic weighting. URL metadata is decomposed into 'url_host', 'url_path', and 'url_path_dir1/2/3' to allow for granular filtering by site section (e.g., 'blog' or 'tutorials'). 'links' contains extracted outbound URLs for discovery. Crawl timestamp: 2026-01-26T12:54:16.347907."
    },
    "properties": {
      "body_content": { 
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          },
          "semantic_multilingual": {
            "type": "semantic_text",
            "inference_id": ".jina-embeddings-v5-text-small" 
          }
        }
      },
      "headings": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          },
          "semantic_multilingual": {
            "type": "semantic_text",
            "inference_id": ".jina-embeddings-v5-text-small"
          }
        }
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          },
          "semantic_multilingual": {
            "type": "semantic_text",
            "inference_id": ".jina-embeddings-v5-text-small"
          }
        }
      }
    }
  }
}

3)运行 Elastic Open Crawler

Crawly 是一个示例,展示了如何围绕 Open Web Crawler 提供的功能构建应用。

该应用将 Elastic Open Crawler 封装在一个 FastAPI 服务中,用于管理 crawler 进程并持久化执行数据。一个 React 前端提供用于配置和监控 crawl 的界面。

在底层,crawler 服务(查看 crawler.py)通过 subprocess.Popen 生成 JRuby 进程,从而支持多个并发 crawl。每次执行的配置、状态和日志目前都会持久化到磁盘中。

克隆该仓库:

复制代码
git clone https://github.com/ugosan/elastic-crawler-control

创建一个 env.local 文件,并填写你的 Elasticsearch 凭证:

复制代码
ES_URL=https://your-elasticsearch-endpoint.es.cloud
ES_API_KEY=your_api_key_here

启动服务:

复制代码
docker-compose up

在浏览器访问 UI:http://localhost:16700

除非你想指定特定 URL,否则不一定需要 seed_urls,因此你的配置可以像下面这样简单:

复制代码
{
  "domains": [
    {
      "url": "https://furnirem.com"
    }
  ],
  "max_crawl_depth": 3,
  "max_unique_url_count": 500,
  "output_index": "furnirem-website"
}

从这里,你可以开始抓取任意网站,并查看其进度:

一旦抓取完成,我们就可以直接在 Elasticsearch 中查询内容,或者使用刚抓取的页面在 Agent Builder 上进行网站聊天。

4)在 Kibana 中与数据聊天

现在数据已被索引并向量化,我们可以使用 Elastic Agent Builder 开始与数据聊天。

  • 打开 Kibana ,导航到 Agents(在 "Search" 部分下)。

  • 测试 agent

    在聊天窗口中提出一个问题,例如,"What is the difference between sparse and dense vectors?"

Agent 将搜索你 Jina 嵌入的数据,从 Search Labs 博客文章中检索相关片段,并生成回答。

你也可以通过 Kibana API 直接与数据聊天:

复制代码
POST kbn://api/agent_builder/converse/async
{
  "input": "What is the difference between sparse and dense vectors?",
  "agent_id": "elastic-ai-agent",
  "conversation_id": "<CONVERSATION_ID>"
}

使用 conversation_id 可以在 Elastic Agent Builder 中与 agent 恢复已有对话。如果在初始请求中未提供,API 会启动一个新对话,并在流式响应中返回一个新生成的 ID。

总结

你现在已经拥有一个可用的 "与你的网站聊天" 堆栈:你的网站被抓取、索引,并通过 semantic_text + Jina v5 自动嵌入,最后通过 Kibana 中的 agent 展示,能够基于页面内容回答问题。

从这里开始,你可以将相同的设置应用于文档、支持内容或内部 wiki,并在几分钟内迭代提升相关性。

原文:https://www.elastic.co/search-labs/blog/chat-website-data-elasticsearch-jina-ai

相关推荐
青主创享阁24 分钟前
玄晶引擎XgenCore Works V2.8.1升级解析 技术迭代赋能场景 代理模式全新落地
大数据·人工智能·代理模式
大写-凌祁1 小时前
OpenClaw 腾讯云服务本地访问配置指南
人工智能·云计算·腾讯云·agi
计算机科研狗@OUC1 小时前
(cvpr25) MP-HSIR: 面向通用高光谱图像复原的多提示框架
人工智能·深度学习·图像修复·高光谱图像
桃花猿1 小时前
大模型Token入门详解:概念、原理、换算与核心作用【AI基础】
人工智能·chatgpt
uesowys1 小时前
腾讯云使用OpenClaw搭建企业微信AI助手
人工智能·企业微信·腾讯云·openclaw
irpywp1 小时前
OpenShell:安全沙箱隔离的沙箱隔离技术
人工智能·安全
勾股导航5 小时前
大模型Skill
人工智能·python·机器学习
卷福同学7 小时前
【养虾日记】Openclaw操作浏览器自动化发文
人工智能·后端·算法
春日见7 小时前
如何入门端到端自动驾驶?
linux·人工智能·算法·机器学习·自动驾驶
光锥智能8 小时前
从自动驾驶到 AI 能力体系,元戎启行 GTC 发布基座模型新进展
人工智能