使用REST API进行网络连接测试的LLM代理(基于LangChain)

作者:API传播员 · 2025-12-10 · 阅读时间:4分钟

使用LangChain代理、OpenAI API和NetBox API,服务器管理员可以构建一个功能强大的LLM应用程序,用于自动化网络连接测试和服务器管理任务。本文将展示如何在家庭实验室环境中应用这一技术,帮助管理员简化操作并提高效率。


系统架构

为了实现自动化网络连接测试,我设计了一个本地LLM系统,其架构由以下组件组成:

  • 图形用户界面(GUI)
    提供一个直观的界面和输入框,方便管理员操作。

  • LangChain
    作为编排器,负责为LLM模型和功能设计系统提示,并调用API或执行Bash命令。

  • OpenAI(GPT-4o)
    提供核心AI能力,处理输入并生成响应。

  • NetBox
    作为IP地址管理(IPAM)工具,通过REST API提供目标服务器的IP地址。

  • 目标服务器(VM)
    这些虚拟机运行在与LangChain相同的本地网络中。


提示与工具设计

为了实现网络连接测试,我设计了以下功能和提示:

  1. 功能设计

    • 调用NetBox API以检索目标服务器的IP地址。
    • 使用Bash命令向目标服务器发送Ping请求。
  2. 提示设计

    • 采用ReAct提示技术为系统提供指导。
    • 使用逐步提示确保操作的准确性。

关键挑战与解决方案

在实现过程中,我发现以下问题需要解决:

  • OpenAI模型无法直接访问NetBox的本地API。
  • 模型在服务器管理领域并非专家。
  • 需要多步操作来完成任务。

为此,我设计了以下解决方案:

  • 创建调用NetBox API的专用函数。
  • 使用ReAct提示技术优化系统提示。
  • 通过逐步提示引导模型完成复杂任务。

实现代码示例

以下是实现上述系统的核心代码片段:

import subprocess
import os
from langchain.pydantic_v1 import BaseModel, Field
from langchain.tools import BaseTool, StructuredTool, tool
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain_core.prompts import PromptTemplate

os.environ["OPENAI_API_KEY"] = "your-key-here"
llm = ChatOpenAI(model_name="gpt-4o", temperature=0, verbose=True)

# 替换API路径中的重复斜杠
def replace_duplicate_pattern(string, pattern):
    import re
    regex = re.compile(re.escape(pattern) + r'(?:/[^/]*)?' + re.escape(pattern))
    return re.sub(regex, pattern, string)

# 执行Bash命令的工具
@tool("bashTool")
def bashTool(command) -> str:
    command = command.replace('"', '').replace('`', '')
    ret = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
    return ret

# 调用NetBox REST API的工具
@tool("netboxTool")
def netboxTool(input) -> str:
    import requests
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Authorization': 'Token 0123456789abcdef0123456789abcdef01234567'
    }
    input = input.replace('n', '')
    if input.startswith('/'):
        input = replace_duplicate_pattern(input, '/api')
    else:
        input = '/' + input
    url = "http://localhost:8000" + input
    response = requests.get(url, headers=headers)
    if response.status_code != 200:
        return f"Error: {response.status_code}"
    return response.json()

# 定义工具和提示模板
tools = [bashTool, netboxTool]
template = '''
Assistant is a large language model trained by OpenAI.

TOOLS:
------
{tools}

To use a tool, please use the following format:
Thought: Do I need to use a tool? Yes
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action

When you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:
Thought: Do I need to use a tool? No
Final Answer: [your response here]

Begin!
New input: {input}
{agent_scratchpad}
'''
prompt = PromptTemplate.from_template(template)
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True, return_intermediate_steps=True)

实践经验与注意事项

通过上述系统,我成功实现了对指定虚拟机(如“服务器001”)的网络连接测试。然而,在实际使用中需要注意以下几点:

  • 输入提示必须遵循逐步提示的格式,否则可能导致错误的API路径。
  • 同样的提示可能会因模型的随机性而产生不同的结果。

总结

本文展示了如何使用LangChain、OpenAI API和NetBox API构建一个本地LLM系统,以自动化网络连接测试。尽管LLM模型功能强大,但它并非万能,因此需要结合工具和提示设计来实现特定任务。通过这种方式,管理员可以显著提高服务器管理和网络维护的效率。


原文链接: https://blog.devops.dev/ai-buddy-for-server-admin-for-homelab-langchain-gpt-4o-4d8b9c41d57c