Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent

引言:为什么需要个人 AI Agent?

在 AI 技术飞速发展的今天,大语言模型(LLM)的能力已从简单的对话扩展到复杂的任务规划与执行。然而,直接使用云端 API 往往面临成本、延迟、隐私和定制化程度的限制。构建一个部署在本地的、可持续运行的 个人 AI Agent,正成为开发者、研究者和技术爱好者的新追求。

Hermes Agent 是一个基于开源大语言模型(如 Llama、Qwen 等)构建的智能体框架,它允许你将强大的 AI 助手"养"在自己的电脑或服务器上,实现:

  • 完全的数据隐私:所有对话与任务处理均在本地完成。
  • 极致的定制化:你可以为它安装专属的"技能"(工具),处理你的日历、邮件、代码库或智能家居。
  • 7x24 小时可持续运行:部署为后台服务,随时待命。
  • 可控的成本:一次性的硬件投入,无需为每次 API 调用付费。

本文将带你完成从零开始搭建 Hermes Agent 的全流程,涵盖环境准备、模型选择、基础功能实现、技能扩展,最终部署为可持续运行的服务。

第一部分:环境准备与模型选择

1.1 基础开发环境

确保你的系统已安装以下基础软件:

  • Python 3.10+:Hermes Agent 通常基于 Python 生态。
  • Git:用于克隆代码仓库。
  • CUDA(可选但推荐):如果你拥有 NVIDIA GPU,安装对应版本的 CUDA 和 cuDNN 可以极大加速推理。

使用以下命令检查环境:

bash 复制代码
python --version
git --version
nvidia-smi # 检查 GPU 状态(如有)

1.2 安装 Hermes Agent 核心框架

目前,名为"Hermes"的 AI Agent 项目可能有多个。这里我们以一个典型的、基于 langchainlitellm 的 Hermes 风格框架为例。你可以通过 pip 安装核心依赖,或直接克隆社区活跃的仓库。

bash 复制代码
# 创建并进入项目目录
mkdir my-hermes-agent && cd my-hermes-agent
python -m venv venv
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate  # Windows

# 安装核心依赖
pip install langchain langchain-community litellm
# 安装可能的 Web 界面或工具依赖
pip install fastapi uvicorn pydantic

1.3 选择与下载本地大语言模型

Agent 的"大脑"是关键。你可以从 Hugging Face 或 ModelScope 等平台下载开源模型。

推荐初学者入门的模型

  • Qwen2.5-7B-Instruct:综合能力强,对中文友好,7B 参数在消费级 GPU(如 RTX 4060 16G)上可流畅运行。
  • Llama 3.2-3B-Instruct:体积小,速度快,适合快速验证和低资源环境。
  • DeepSeek-Coder-7B-Instruct:如果你的 Agent 主要面向编程辅助。

使用 huggingface-climodelscope 下载模型。以 Qwen2.5-7B 为例:

bash 复制代码
pip install transformers
# 使用 Hugging Face Hub(需登录或有权限)
huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./models/Qwen2.5-7B-Instruct

第二部分:构建你的第一个 Hermes Agent

2.1 初始化 Agent 核心

创建一个 main.py 文件,初始化一个能够调用本地模型的 LLM,并封装成最简单的 Agent。

python 复制代码
# main.py
import os
from langchain.llms import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory

# 1. 加载本地模型
model_path = "./models/Qwen2.5-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    device_map="auto",  # 自动分配至 GPU/CPU
    trust_remote_code=True
)

# 2. 创建文本生成管道
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    max_new_tokens=512,
    temperature=0.7,
    do_sample=True
)

# 3. 封装为 LangChain LLM
llm = HuggingFacePipeline(pipeline=pipe)

# 4. 创建记忆和基础 Agent
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 这是一个最简单的零样本(zero-shot)Agent,尚无工具
agent = initialize_agent(
    tools=[],  # 工具列表暂时为空
    llm=llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True  # 打印详细推理过程
)

# 5. 运行一次测试对话
if __name__ == "__main__":
    response = agent.run("你好,请介绍一下你自己。")
    print("Agent 回复:", response)

运行 python main.py,你应该能看到模型加载过程以及 Agent 的自我介绍。恭喜,你的第一个本地 AI Agent 已经"活"了!

2.2 为 Agent 添加"技能"(工具)

没有工具的 Agent 只是一个聊天机器人。LangChain 提供了大量内置工具,你也可以自定义。

示例:添加一个获取天气和计算器的工具。

python 复制代码
# tools.py
from langchain.tools import Tool, tool
from langchain.utilities import DuckDuckGoSearchAPIWrapper
import math

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """计算一个数学表达式的值。例如:`calculator(\"3 * 7 + 5\")`"""
    try:
        # 警告:使用 eval 有安全风险,此处仅作演示。生产环境应使用安全库如 `asteval`。
        result = eval(expression, {"__builtins__": {}}, {"math": math})
        return f"计算结果:{result}"
    except Exception as e:
        return f"计算错误:{e}"

# 使用 DuckDuckGo 搜索(需要网络)
search = DuckDuckGoSearchAPIWrapper()
search_tool = Tool(
    name="Web Search",
    func=search.run,
    description="使用此工具在互联网上搜索最新信息。"
)

# 工具列表
tools = [calculator, search_tool]

更新 main.py,将 tools 列表传递给 Agent:

python 复制代码
# 在 main.py 中更新 agent 初始化部分
from tools import tools

agent = initialize_agent(
    tools=tools,  # 传入工具
    llm=llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True,
    handle_parsing_errors=True  # 更好地处理解析错误
)

现在,你可以问 Agent:"今天北京的天气怎么样?" 或 "计算一下 125 的平方根。" 它将尝试调用相应的工具来回答你。

第三部分:从脚本到可持续运行的服务

3.1 构建 Web API 接口

为了让 Agent 能够被其他应用(如手机 App、浏览器插件)调用,我们需要将其封装成 API。使用 FastAPI 创建一个简单的 Web 服务。

python 复制代码
# api.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from main import agent  # 导入之前创建的 agent 实例

app = FastAPI(title="My Hermes Agent API")

class QueryRequest(BaseModel):
    message: str
    session_id: str = "default"  # 用于区分不同对话会话

@app.post("/chat")
async def chat_with_agent(request: QueryRequest):
    """与 Agent 对话的端点"""
    try:
        # 注意:这里简化了会话管理。生产环境需要根据 session_id 维护独立的 memory。
        response = agent.run(request.message)
        return {"response": response, "session_id": request.session_id}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/health")
async def health_check():
    return {"status": "alive"}

3.2 使用 Uvicorn 运行服务

在终端运行:

bash 复制代码
uvicorn api:app --host 0.0.0.0 --port 8000 --reload

现在,你的 Agent 服务已在 http://localhost:8000 运行。访问 http://localhost:8000/docs 可以看到自动生成的 API 文档。

你可以使用 curl 进行测试:

bash 复制代码
curl -X POST "http://localhost:8000/chat" \
  -H "Content-Type: application/json" \
  -d '{"message": "你好,你是谁?", "session_id": "user_123"}'

3.3 使用 Systemd 或 Docker 实现后台运行与自启动

方案一:Systemd(Linux)

创建一个服务文件 /etc/systemd/system/hermes-agent.service

ini 复制代码
[Unit]
Description=My Hermes Agent Service
After=network.target

[Service]
Type=simple
User=your_username
WorkingDirectory=/path/to/your/my-hermes-agent
Environment="PATH=/path/to/your/my-hermes-agent/venv/bin"
ExecStart=/path/to/your/my-hermes-agent/venv/bin/uvicorn api:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

然后启用并启动服务:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable hermes-agent
sudo systemctl start hermes-agent
sudo systemctl status hermes-agent

方案二:Docker(跨平台)

创建 Dockerfile

dockerfile 复制代码
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 假设你的模型已下载在 ./models 目录,需要一并 COPY 或使用数据卷
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000"]

构建并运行:

bash 复制代码
docker build -t my-hermes-agent .
docker run -d -p 8000:8000 --name hermes-agent my-hermes-agent

3.4 安全加固指南

将 Agent 部署为公开可访问的服务后,安全是必须考虑的重要环节。本节将介绍如何为你的 Hermes Agent 添加基础安全防护。

1. API Key 认证

为 FastAPI 接口添加简单的 API Key 认证,防止未授权访问。

python 复制代码
# api_with_auth.py
from fastapi import FastAPI, HTTPException, Depends, Header
from pydantic import BaseModel
from typing import Optional
import os
from dotenv import load_dotenv

load_dotenv()  # 从 .env 文件加载环境变量

API_KEY = os.getenv("API_KEY", "your-secret-key-here")  # 建议通过环境变量配置

def verify_api_key(api_key: Optional[str] = Header(None, alias="X-API-Key")):
    """验证 API Key 的依赖函数"""
    if api_key is None or api_key != API_KEY:
        raise HTTPException(status_code=401, detail="Invalid or missing API Key")
    return True

app = FastAPI(title="My Hermes Agent API (Secure)")

class QueryRequest(BaseModel):
    message: str
    session_id: str = "default"

@app.post("/chat")
async def chat_with_agent(
    request: QueryRequest,
    authorized: bool = Depends(verify_api_key)  # 添加认证依赖
):
    """需要 API Key 认证的对话端点"""
    try:
        from main import agent
        response = agent.run(request.message)
        return {"response": response, "session_id": request.session_id}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/health")
async def health_check(authorized: bool = Depends(verify_api_key)):
    return {"status": "alive"}

使用带认证的请求:

bash 复制代码
curl -X POST "http://localhost:8000/chat" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-secret-key-here" \
  -d '{"message": "你好,你是谁?", "session_id": "user_123"}'
2. 速率限制(Rate Limiting)

使用 slowapifastapi-limiter 限制 API 调用频率,防止滥用。

bash 复制代码
# 安装 slowapi
pip install slowapi
python 复制代码
# api_with_rate_limit.py
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from fastapi import FastAPI, Request

limiter = Limiter(key_func=get_remote_address)
app = FastAPI(title="My Hermes Agent API (Rate Limited)")
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

@app.post("/chat")
@limiter.limit("5/minute")  # 限制每分钟最多5次调用
async def chat_with_agent(request: Request, query: QueryRequest):
    # ... 原有逻辑
    pass
3. 防范 Prompt 注入攻击

Prompt 注入攻击可能让恶意用户绕过你的系统指令。以下是一些防御策略:

python 复制代码
# prompt_safety.py
import re

def sanitize_input(user_input: str) -> str:
    """基础输入清洗"""
    # 移除潜在的恶意指令关键词
    malicious_patterns = [
        r"ignore.*previous",
        r"forget.*instructions",
        r"system.*prompt",
        r"role.*play",
        r"you are now",
        r"disregard",
        # 可根据需要添加更多模式
    ]
    
    cleaned = user_input
    for pattern in malicious_patterns:
        cleaned = re.sub(pattern, "[REDACTED]", cleaned, flags=re.IGNORECASE)
    
    # 限制输入长度
    if len(cleaned) > 1000:
        cleaned = cleaned[:1000] + "...[输入过长已截断]"
    
    return cleaned

def validate_input_structure(user_input: str) -> bool:
    """验证输入是否符合预期结构(示例)"""
    # 检查是否包含过多特殊字符(可能是指令注入)
    special_char_count = sum(1 for c in user_input if c in '{}[]<>|&;$')
    if special_char_count > 10:  # 阈值可调整
        return False
    
    # 检查是否尝试伪装成系统指令
    if user_input.lower().startswith("system:"):
        return False
        
    return True

# 在 API 中使用
@app.post("/chat")
async def chat_with_agent(request: QueryRequest, authorized: bool = Depends(verify_api_key)):
    # 输入清洗和验证
    sanitized_message = sanitize_input(request.message)
    if not validate_input_structure(sanitized_message):
        raise HTTPException(status_code=400, detail="输入包含可疑内容,请重新输入")
    
    try:
        from main import agent
        response = agent.run(sanitized_message)
        return {"response": response, "session_id": request.session_id}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
4. Docker 容器安全配置建议

如果使用 Docker 部署,请遵循以下安全最佳实践:

  1. 使用非 root 用户运行容器
dockerfile 复制代码
FROM python:3.10-slim

# 创建非 root 用户
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
USER appuser

WORKDIR /app
# ... 其余配置
  1. 最小化镜像层和依赖
dockerfile 复制代码
# 使用多阶段构建减少最终镜像大小
FROM python:3.10-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.10-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
# ... 使用非 root 用户
  1. 设置资源限制
bash 复制代码
docker run -d \
  --name hermes-agent \
  --memory="1g" \
  --cpus="1.0" \
  --pids-limit 100 \
  -p 8000:8000 \
  my-hermes-agent
  1. 定期更新基础镜像和依赖
dockerfile 复制代码
# 定期更新以获取安全补丁
FROM python:3.10-slim@sha256:最新安全哈希值
  1. 使用只读文件系统(如可能)
bash 复制代码
docker run -d \
  --read-only \
  --tmpfs /tmp \
  -p 8000:8000 \
  my-hermes-agent
5. 其他安全建议
  • 环境变量管理:敏感信息(API Key、数据库密码)通过环境变量或 secrets 管理工具传递,不要硬编码在代码中。
  • HTTPS 加密:生产环境务必使用 HTTPS,可通过 Nginx 反向代理配置 SSL/TLS。
  • 日志脱敏:确保日志中不记录敏感信息(如完整的 API Key、用户隐私数据)。
  • 定期安全审计 :使用 safetybandit 等工具检查 Python 依赖和代码中的安全漏洞。
bash 复制代码
# 安装安全扫描工具
pip install safety bandit

# 检查依赖漏洞
safety check

# 扫描代码安全
bandit -r ./

通过实施这些安全措施,你的 Hermes Agent 将更加健壮,能够抵御常见的网络攻击和滥用行为。

第四部分:进阶优化与扩展

4.1 性能优化

  • 模型量化 :使用 bitsandbytes 进行 4-bit/8-bit 量化,大幅减少显存占用。
  • 推理后端 :考虑使用 vLLMTGI (Text Generation Inference) 或 llama.cpp 作为推理后端,获得更高的吞吐量和更低的延迟。
  • 缓存:为频繁的、确定性的查询结果添加缓存层。

4.2 能力扩展

  • RAG(检索增强生成):为 Agent 连接你的个人知识库(如 Obsidian、Notion 文档),让它能基于你的私人资料回答问题。
  • 多模态:集成视觉模型,让 Agent 可以"看"图片并描述或分析。
  • 自动化工作流 :结合 n8nZapier 等工具,让 Agent 触发复杂的自动化任务。

4.3 监控与日志

  • 使用 prometheusgrafana 监控 API 调用次数、响应延迟、模型负载。
  • 记录完整的 Thought -> Action -> Observation 链到日志文件或数据库,用于分析和调试 Agent 的决策过程。

结语:开启你的个人 AI 助手时代

通过以上步骤,你已经成功搭建了一个从本地试跑到可持续运行的 Hermes Agent。这只是一个起点。接下来,你可以:

  1. 探索更强大的模型:尝试 14B、70B 参数的模型以获得更强的能力。
  2. 开发专属工具:让它学习操作你的专属软件或硬件。
  3. 设计交互界面:开发一个漂亮的 Web 或移动端聊天界面。
  4. 连接现实世界:通过 IoT 平台,让你的 Agent 控制灯光、空调,甚至为你煮咖啡。

个人 AI Agent 的意义在于,它不再是遥不可及的科技产品,而是你可以完全掌控、深度定制、伴随成长的数字伙伴。开始构建,并享受它带来的效率与乐趣吧!


下一步建议

  • 「第二部分:构建你的第一个 Hermes Agent」 之后,可以插入一个 「常见问题与故障排查」 章节,帮助读者解决模型加载失败、显存不足等典型问题。
  • 「第三部分:从脚本到可持续运行的服务」 之后,可以补充一个 「安全加固指南」,讲解如何为 API 添加认证、限制访问频率、防范 Prompt 注入攻击。
相关推荐
Database_Cool_1 小时前
记忆张量MemOS + 阿里云PolarDB一站式记忆管理方案发布:给AI装上不断片的记忆
数据库·人工智能·阿里云
2401_859506241 小时前
大漆工艺的工程化转型:温湿度PID控制、纳米改性技术与批次一致性方案
大数据·人工智能·物联网
春卷同学1 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
再吃一根胡萝卜1 小时前
DIFY 祛魅:它究竟是 AI 应用的“银弹”,还是昂贵的“玩具”?
人工智能
再吃一根胡萝卜1 小时前
面试手记:高级 AI 工程师的备战与思考
人工智能
再吃一根胡萝卜1 小时前
数据基石:AI 系统中的 ETL 与调度,远比模型更重要
人工智能
再吃一根胡萝卜1 小时前
别再只谈 Prompt 了,2026 年 AI 落地拼的是 Harness Engineering
人工智能·面试
再吃一根胡萝卜1 小时前
实战复盘:我是如何用代码实现 Harness 的
人工智能
不平衡的叉叉树1 小时前
Springboot+Mockito简单使用单元测试
java·spring boot·单元测试