使用 Elastic Agent Builder 和 GPT-OSS 构建一个用于 HR 的 AI agent

122 阅读10分钟

作者:来自 Elastic Tomás Murúa

发现如何使用 Elastic Agent Builder 和 GPT-OSS 构建一个可以回答关于你员工 HR 数据的自然语言查询的 AI agent。

Agent Builder 现在作为技术预览提供。通过 Elastic Cloud Trial 开始使用,并在此查看 Agent Builder 的文档。


介绍

这篇文章将向你展示如何使用 GPT-OSS 和 Elastic Agent Builder 构建一个用于 HR 的 AI agent。这个 agent 可以在不将数据发送到 OpenAI、Anthropic 或任何外部服务的情况下回答你的问题。

我们将使用 LM Studio 在本地运行 GPT-OSS,并将其连接到 Elastic Agent Builder。

在本文结束时,你将拥有一个自定义的 AI agent,它可以回答关于你员工数据的自然语言问题,同时保持对你的信息和模型的完全控制。

先决条件

本文章你需要:

为什么使用 GPT-OSS?

使用本地 LLM,你可以控制将其部署在自己的基础设施里,并微调它以符合你的需求。所有这些都能保持你与模型共享的数据的控制权,而且当然,你不需要向外部提供商支付许可费用。

OpenAI 在 2025 年 8 月 5 日发布了 GPT-OSS,作为其对开放模型生态系统承诺的一部分。

这个拥有 20B 参数的模型提供:

  • 工具使用能力
  • 高效推理
  • 兼容 OpenAI SDK
  • 兼容 agentic workflows

基准比较

Benchmark source.

解决方案架构

整个架构完全在你的本地机器上运行。Elastic(运行在 Docker 中)通过 LM Studio 直接与你的本地 LLM 通信,Elastic Agent Builder 使用这个连接来创建可以查询你员工数据的自定义 AI agent。

更多详情请参考这个文档。

为 HR 构建 AI agent:步骤

我们将把实现分成 5 个步骤:

  1. 配置 LM studio 使用本地模型
  2. 使用 Docker 部署本地 Elastic
  3. 在 Elastic 中创建 OpenAI connector
  4. 把员工数据上传到 Elasticsearch
  5. 构建并测试你的 AI Agent

步骤 1:使用 GPT-OSS 20B 配置 LM Studio

LM Studio 是一个用户友好的应用程序,允许你在本地电脑上运行大型语言模型。它提供一个兼容 OpenAI 的 API 服务器,使它能轻松集成到 Elastic 等工具中,而不需要复杂的设置过程。更多细节请参考 LM Studio Docs

首先,从官方网站下载并安装 LM Studio。安装完成后,打开应用程序。

在 LM Studio 界面中:

  1. 进入搜索标签并搜索 “GPT-OSS”
  2. 选择来自 OpenAI 的 openai/gpt-oss-20b
  3. 点击下载

这个模型的大小大约为 12.10GB。下载时间取决于你的网络速度,可能需要几分钟。

模型下载完成后:

  1. 进入本地服务器(local server)标签
  2. 选择 openai/gpt-oss-20b
  3. 使用默认端口 1234
  4. 在右侧面板进入 Load 并将 Context Length 设置为 40K 或更高                             
  5. 点击 Start Server

如果服务器正在运行,你应该会看到这个。

`

1.  [LM STUDIO SERVER] Success! HTTP server listening on port 1234
2.  [LM STUDIO SERVER] Supported endpoints:
3.  [LM STUDIO SERVER] ->	GET  http://localhost:1234/v1/models
4.  [LM STUDIO SERVER] ->	POST http://localhost:1234/v1/responses
5.  [LM STUDIO SERVER] ->	POST http://localhost:1234/v1/chat/completions
6.  [LM STUDIO SERVER] ->	POST http://localhost:1234/v1/completions
7.  [LM STUDIO SERVER] ->	POST http://localhost:1234/v1/embeddings
8.  Server started.

`AI写代码

步骤 2:使用 Docker 部署本地 Elastic

现在我们将使用 Docker 在本地设置 Elasticsearch 和 Kibana。Elastic 提供了一个方便的脚本来处理整个设置过程。更多详情请参考官方文档

运行 start-local 脚本

在终端中执行以下命令:

`curl -fsSL https://elastic.co/start-local | sh`AI写代码

这个脚本将会:

  • 下载并配置 Elasticsearch 和 Kibana
  • 使用 Docker Compose 启动两个服务
  • 自动激活 30 天 Platinum 试用许可

预期输出

等待以下消息出现,并保存显示的密码和 API key;你将需要它们来访问 Kibana:

`

1.  🎉 Congrats, Elasticsearch and Kibana are installed and running in Docker!
2.  🌐 Open your browser at http://localhost:5601
3.     Username: elastic
4.     Password: KSUlOMNr
5.  🔌 Elasticsearch API endpoint: http://localhost:9200
6.  🔑 API key: cnJGX0pwb0JhOG00cmNJVklUNXg6cnNJdXZWMnM4bncwMllpQlFlUTlWdw==
7.  Learn more at https://github.com/elastic/start-local

`AI写代码

访问 Kibana

打开你的浏览器并访问:

`http://localhost:5601`AI写代码

使用终端输出中获得的凭据登录。

启用 Agent Builder

登录 Kibana 后,导航到 Management > AI > Agent Builder 并激活 Agent Builder。

步骤 3:在 Elastic 中创建 OpenAI connector

现在我们将配置 Elastic 使用你的本地 LLM。

访问 Connectors

  1. 在 Kibana 中:
  2. 进入 Project Settings > Management
  3. 在 Alerts and Insights 下,选择 Connectors
  4. 点击 Create Connector

配置 connector

从 connector 列表中选择 OpenAI。LM Studio 使用 OpenAI SDK,因此兼容。

填写以下字段:

  • Connector name:LM Studio - GPT-OSS 20B
  • Select an OpenAI provider:Other (OpenAI Compatible Service)
  • URL:host.docker.internal:1234/v1/chat/com…
  • Default model:openai/gpt-oss-20b
  • API Key:testkey-123(任意文本都可以,因为 LM Studio Server 不需要认证)

完成配置后,点击 Save & test

重要提示:打开 “Enable native function calling”;这是 Agent Builder 正常工作的必要条件。如果不启用,你会收到 No tool calls found in the response 错误。

测试连接

Elastic 会自动测试连接。如果配置正确,你会看到如下成功消息:

响应:

`

1.  {
2.    "status": "ok",
3.    "data": {
4.      "id": "chatcmpl-flj9h0hy4wcx4bfson00an",
5.      "object": "chat.completion",
6.      "created": 1761189456,
7.      "model": "openai/gpt-oss-20b",
8.      "choices": [
9.        {
10.          "index": 0,
11.          "message": {
12.            "role": "assistant",
13.            "content": "Hello! 👋 How can I assist you today?",
14.            "reasoning": "Just greet.",
15.            "tool_calls": []
16.          },
17.          "logprobs": null,
18.          "finish_reason": "stop"
19.        }
20.      ],
21.      "usage": {
22.        "prompt_tokens": 69,
23.        "completion_tokens": 23,
24.        "total_tokens": 92
25.      },
26.      "stats": {},
27.      "system_fingerprint": "openai/gpt-oss-20b"
28.    },
29.    "actionId": "ee1c3aaf-bad0-4ada-8149-118f52dad757"
30.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

步骤 4:将员工数据上传到 Elasticsearch

现在我们将上传 HR 员工数据集,以演示 agent 如何处理敏感数据。我生成了一个具有以下结构的虚拟数据集。

数据集结构

`

1.  {
2.    "employee_id": "0f4dce68-2a09-4cb1-b2af-6bcb4821539b",
3.    "full_name": "Daffi Stiebler",
4.    "email": "lscutchings0@huffingtonpost.com",
5.    "date_of_birth": "1975-06-20T15:39:36Z",
6.    "hire_date": "2025-07-28T00:10:45Z",
7.    "job_title": "Physical Therapy Assistant",
8.    "department": "HR",
9.    "salary": "108455",
10.    "performance_rating": "Needs Improvement",
11.    "years_of_experience": 2,
12.    "skills": "Java",
13.    "education_level": "Master's Degree",
14.    "manager": "Carl MacGibbon",
15.    "emergency_contact": "Leigha Scutchings",
16.    "home_address": "5571 6th Park"
17.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

创建带映射的索引

首先,创建一个带有正确映射的索引。注意,我们在一些关键字段中使用了 semantic_text 字段;这使我们的索引具备语义搜索能力。

`

1.  ​​PUT hr-employees
2.  {
3.    "mappings": {
4.      "properties": {
5.        "@timestamp": {
6.          "type": "date"
7.        },
8.        "employee_id": {
9.          "type": "keyword"
10.        },
11.        "full_name": {
12.          "type": "text",
13.          "copy_to": "employee_semantic"
14.        },
15.        "email": {
16.          "type": "keyword"
17.        },
18.        "date_of_birth": {
19.          "type": "date",
20.          "format": "iso8601"
21.        },
22.        "hire_date": {
23.          "type": "date",
24.          "format": "iso8601"
25.        },
26.        "job_title": {
27.          "type": "text",
28.          "copy_to": "employee_semantic"
29.        },
30.        "department": {
31.          "type": "text",
32.          "copy_to": "employee_semantic"
33.        },
34.        "salary": {
35.          "type": "double"
36.        },
37.        "performance_rating": {
38.          "type": "text",
39.          "copy_to": "employee_semantic"
40.        },
41.        "years_of_experience": {
42.          "type": "long"
43.        },
44.        "skills": {
45.          "type": "text",
46.          "copy_to": "employee_semantic"
47.        },
48.        "education_level": {
49.          "type": "text",
50.          "copy_to": "employee_semantic"
51.        },
52.        "manager": {
53.          "type": "text",
54.          "copy_to": "employee_semantic"
55.        },
56.        "emergency_contact": {
57.          "type": "keyword"
58.        },
59.        "home_address": {
60.          "type": "keyword"
61.        },
62.        "employee_semantic": {
63.          "type": "semantic_text"
64.        }
65.      }
66.    }
67.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)收起代码块![](https://csdnimg.cn/release/blogv2/dist/pc/img/arrowup-line-top-White.png)

使用 Bulk API 创建索引

数据集复制并粘贴到 Kibana 的 Dev Tools 中,然后执行:

`

1.  POST hr-employees/_bulk
2.  {"index": {}}
3.  {"employee_id": "57728b91-e5d7-4fa8-954a-2384040d3886", "full_name": "Filide Gane", "email": "vhallahan1@booking.com", "job_title": "Business Systems Development Analyst", "department": "Marketing", "salary": "$52330.27", "performance_rating": "Meets Expectations", "years_of_experience": 12, "skills": "Java", "education_level": "Bachelor's Degree", "date_of_birth": "2000-02-07T16:49:32Z", "hire_date": "2023-11-07T13:03:16Z", "manager": "Freedman Kings", "emergency_contact": "Vilhelmina Hallahan", "home_address": "75 Dennis Junction"}
4.  {"index": {}}
5.  {"employee_id": "...", ...}

`AI写代码

验证数据

运行查询以验证:

`GET hr-employees/_search`AI写代码

步骤 5:构建并测试你的 AI agent

配置完成后,是时候使用 Elastic Agent Builder 构建自定义 AI agent 了。更多详情请参考 Elastic 文档

添加 connector

在创建新 agent 之前,我们必须将 Agent Builder 设置为使用我们自定义的 connector,即 LM Studio - GPT-OSS 20B,因为默认的是 Elastic Managed LLM。为此,进入 Project Setting > Management > GenAI Settings,选择我们创建的 connector,然后点击 Save。

访问 Agent Builder

  1. 进入 Agents
  2. 点击 Create a new agent

配置 agent

创建新 agent 时,必填字段有 Agent ID、Display Name 和 Display Instructions。

但还有更多自定义选项,比如 Custom Instructions,用于指导你的 agent 如何行为和与工具交互,类似于系统提示,但针对我们的自定义 agent。Labels 用于组织 agent,Avatar color 和 Avatar symbol。

基于数据集,我为我们的 agent 选择的设置如下:

  • Agent ID: hr_assistant
  • Custom instructions:
`

1.  You are an HR Analytics Assistant that helps answer questions about employee data.
2.  When responding to queries:
3.  - Provide clear, concise answers
4.  - Include relevant employee details (name, department, salary, skills)
5.  - Format monetary values with currency symbols
6.  - Be professional and maintain data confidentiality

`AI写代码
  • LabelsHuman Resources and GPT-OSS
  • Display nameHR Analytics Assistant
  • Display description:
`A specialized AI assistant for Human Resources that helps analyze employee data, compensation, performance metrics, and talent management. Ask questions about employees, departments, salaries, or performance analytics.`AI写代码

数据全部配置好后,我们可以点击 Save 保存新 agent。

测试 agent

现在你可以用自然语言提问关于员工数据的问题,GPT-OSS 20B 会理解意图并生成相应的回答。

Prompt:
`Which employee is the one with the highest salary in the hr-employees index?`AI写代码
Answer:

Agent 流程如下:

  1. 使用 GPT-OSS connector 理解你的问题

  2. 生成相应的 Elasticsearch 查询(使用内置工具或自定义 ES|QL

  3. 检索匹配的员工记录

  4. 以自然语言和合适的格式呈现结果

与传统的词汇搜索不同,由 GPT-OSS 驱动的 agent 能理解意图和上下文,使得查找信息无需知道精确字段名或查询语法更容易。有关 agent 思考过程的更多详情,请参考本文

结论

在本文中,我们使用 Elastic 的 Agent Builder 构建了一个自定义 AI agent,连接到本地运行的 OpenAI GPT-OSS 模型。通过在本地部署 Elastic 和 LLM,这种架构允许你利用生成式 AI 功能,同时完全控制你的数据,而无需将信息发送到外部服务。

我们以 GPT-OSS 20B 进行实验,但 Elastic Agent Builder 官方推荐的模型请参考此处。如果需要更高级的推理能力,还有 120B 参数版本,在复杂场景下表现更好,但需要更高配置的本地机器运行。更多详情请参考官方 OpenAI 文档

原文:www.elastic.co/search-labs…