手把手教你构建一个能自主思考、调用工具、执行任务的智能代理,让你的工作效率提升10倍
在信息爆炸的时代,重复性工作占据了我们大量时间——邮件分类、数据整理、信息检索、报表生成……这些任务虽然重要,却耗费创意精力。OpenClaw Agent 是一个基于大语言模型(LLM)的智能代理框架,它能够理解自然语言指令,自主规划任务步骤,并调用外部工具(如搜索引擎、计算器、数据库、API等)完成复杂操作,就像一个24小时在线的数字员工。
本文将带你从零开始,构建一个完整的OpenClaw Agent,并最终部署到腾讯云上,实现云端自动化服务。
组件 | 选型 | 说明 |
|---|---|---|
语言 | Python 3.10+ | 生态丰富,AI支持好 |
LLM | OpenAI GPT-4 / 腾讯混元 | 推荐使用腾讯混元大模型(国内合规) |
框架 | LangChain | 提供Agent、Tool、Memory等抽象 |
工具库 | Requests, BeautifulSoup, PyPDF2, etc. | 具体工具依赖 |
Web框架 | FastAPI | 高性能,自动生成API文档 |
部署 | 腾讯云轻量应用服务器 | 简单易用,成本低 |
注意:若使用OpenAI API需外网访问,建议优先使用腾讯混元大模型(通过腾讯云API),本文示例将兼容OpenAI格式,你可自由切换。
mkdir openclaw-agent
cd openclaw-agent
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate创建 requirements.txt:
langchain>=0.1.0
langchain-openai>=0.0.5
openai>=1.0.0
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
fastapi>=0.104.0
uvicorn>=0.24.0
python-dotenv>=1.0.0
pypdf2>=3.0.0安装:
pip install -r requirements.txt创建 .env 文件:
# 使用腾讯混元(推荐)
OPENAI_API_BASE=https://api.hunyuan.cloud.tencent.com/v1
OPENAI_API_KEY=your-hunyuan-api-key
OPENAI_API_MODEL=hunyuan-lite
# 或使用 OpenAI
# OPENAI_API_KEY=sk-xxx
# OPENAI_API_MODEL=gpt-4o-mini用户指令 → Agent(规划器) → 思考(ReAct) → 调用工具 → 观察结果 → 最终答案
↑ │
└──────── 记忆(Memory) ←───────────────┘我们将实现以下内置工具:
search_web:使用DuckDuckGo或自定义搜索APIcalculator:执行数学表达式read_file / write_file:本地文件操作get_current_time:获取时间call_rest_api:调用任意HTTP接口tools.py)import requests
import json
import datetime
from bs4 import BeautifulSoup
from typing import Optional
def get_current_time() -> str:
"""返回当前日期和时间"""
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def calculator(expression: str) -> str:
"""安全计算数学表达式"""
try:
# 只允许数字和运算符
allowed = set("0123456789+-*/().% ")
if not all(c in allowed for c in expression):
return "错误:表达式包含非法字符"
result = eval(expression)
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{str(e)}"
def search_web(query: str, max_results: int = 3) -> str:
"""
使用DuckDuckGo Lite进行简单搜索(无需API密钥)
实际生产建议使用SerpAPI或腾讯云搜索
"""
try:
url = f"https://lite.duckduckgo.com/lite/?q={query}"
headers = {"User-Agent": "Mozilla/5.0"}
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, "html.parser")
results = []
for item in soup.select(".result")[:max_results]:
title = item.select_one(".result__title")
link = item.select_one(".result__url")
snippet = item.select_one(".result__snippet")
if title and link:
results.append({
"title": title.get_text(strip=True),
"link": link.get_text(strip=True),
"snippet": snippet.get_text(strip=True) if snippet else ""
})
if not results:
return "未找到相关结果"
return json.dumps(results, ensure_ascii=False, indent=2)
except Exception as e:
return f"搜索失败:{str(e)}"
def read_file(filepath: str) -> str:
"""读取文本文件内容"""
try:
with open(filepath, "r", encoding="utf-8") as f:
return f.read()[:2000] # 限制长度
except FileNotFoundError:
return f"文件 {filepath} 不存在"
except Exception as e:
return f"读取错误:{str(e)}"
def write_file(filepath: str, content: str) -> str:
"""将内容写入文件"""
try:
with open(filepath, "w", encoding="utf-8") as f:
f.write(content)
return f"成功写入 {filepath}"
except Exception as e:
return f"写入错误:{str(e)}"
def call_rest_api(url: str, method: str = "GET", payload: Optional[dict] = None) -> str:
"""调用任意REST API"""
try:
method = method.upper()
if method == "GET":
resp = requests.get(url, timeout=10)
elif method == "POST":
resp = requests.post(url, json=payload, timeout=10)
else:
return "不支持的HTTP方法"
resp.raise_for_status()
return resp.text[:1000] # 截断
except Exception as e:
return f"API调用失败:{str(e)}"agent.py)我们将使用LangChain的 create_react_agent 和 AgentExecutor,结合上述工具。
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from tools import (
get_current_time, calculator, search_web,
read_file, write_file, call_rest_api
)
load_dotenv()
# 初始化LLM(支持腾讯混元/OpenAI)
llm = ChatOpenAI(
base_url=os.getenv("OPENAI_API_BASE"),
api_key=os.getenv("OPENAI_API_KEY"),
model=os.getenv("OPENAI_API_MODEL", "gpt-4o-mini"),
temperature=0.2,
)
# 定义工具列表
tools = [
Tool(name="当前时间", func=get_current_time, description="获取当前日期时间,无需参数"),
Tool(name="计算器", func=calculator, description="计算数学表达式,如 '2+3*4'"),
Tool(name="网络搜索", func=search_web, description="搜索互联网信息,输入关键词"),
Tool(name="读取文件", func=read_file, description="读取本地文件内容,输入文件路径"),
Tool(name="写入文件", func=write_file, description="写入内容到本地文件,输入格式 '文件路径|内容'"),
Tool(name="调用API", func=call_rest_api, description="调用HTTP API,输入格式 'URL|方法|JSON参数(可选)'"),
]
# 自定义提示模板(中文,让代理更符合使用习惯)
template = """你是一个名为OpenClaw的智能助理,能够使用工具完成用户任务。
你有以下工具可用:
{tools}
工具名称: {tool_names}
请使用以下格式回答:
Question: 用户的问题
Thought: 思考下一步该做什么
Action: 要使用的工具名称,必须为 {tool_names} 之一
Action Input: 工具的输入参数
Observation: 工具返回的结果
... (这个 Thought/Action/Action Input/Observation 可以重复多次)
Thought: 我现在知道最终答案了
Final Answer: 对用户问题的最终回答
开始!
Question: {input}
Thought: {agent_scratchpad}
"""
prompt = PromptTemplate.from_template(template)
# 构建代理
agent = create_react_agent(llm, tools, prompt)
# 添加记忆(对话缓存)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 代理执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 打印思考过程
max_iterations=10, # 防止死循环
handle_parsing_errors=True,
)
def run_agent(query: str) -> str:
"""同步运行代理"""
result = agent_executor.invoke({"input": query})
return result["output"]创建 test.py:
from agent import run_agent
if __name__ == "__main__":
questions = [
"现在几点了?",
"计算 1234 * 5678",
"搜索一下腾讯云的最新动态",
"把'Hello OpenClaw'写入到 test.txt 文件",
"读取 test.txt 文件内容"
]
for q in questions:
print(f"\n>>> 用户: {q}")
answer = run_agent(q)
print(f"<<< OpenClaw: {answer}")运行测试:python test.py,观察代理的思考链和工具调用。
为了方便远程调用,我们构建一个HTTP服务。
创建 main.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent import run_agent
import uvicorn
app = FastAPI(title="OpenClaw Agent API", version="1.0")
class QueryRequest(BaseModel):
query: str
class QueryResponse(BaseModel):
answer: str
status: str = "success"
@app.post("/ask", response_model=QueryResponse)
async def ask(request: QueryRequest):
try:
result = run_agent(request.query)
return QueryResponse(answer=result)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health():
return {"status": "ok"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)启动服务:python main.py。
测试API:
curl -X POST "http://localhost:8000/ask" \
-H "Content-Type: application/json" \
-d '{"query": "搜索腾讯云AI产品"}'本文以轻量应用服务器(Ubuntu 20.04)为例。
sudo apt update
sudo apt install python3-pip python3-venv -yscp -r ./openclaw-agent root@你的IP:/opt/cd /opt/openclaw-agent
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt.env 文件放入目录。/etc/systemd/system/openclaw.service:[Unit]
Description=OpenClaw Agent Service
After=network.target
[Service]
User=root
WorkingDirectory=/opt/openclaw-agent
ExecStart=/opt/openclaw-agent/venv/bin/python main.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl enable openclaw
systemctl start openclaw
systemctl status openclawcurl http://你的IP:8000/health现在你就拥有了一个云端AI员工API,可集成到任何业务系统。
retry 装饰器处理工具调用失败腾讯混元大模型支持OpenAI兼容接口,只需修改 OPENAI_API_BASE 和 API_KEY。也可使用 langchain_community.llms.Hunyuan 原生集成。
FastAPI支持 StreamingResponse,可让代理边思考边输出,提升用户体验。
通过本文,你从零构建了一个功能完整的数字AI员工——OpenClaw Agent。它能够理解自然语言,自主调用多种工具完成实际任务,并且通过API对外开放。只需短短几百行代码,你就拥有了一位不知疲倦的智能助手。
未来,你可以为它添加更多行业专属工具(如财务分析、代码生成、客户服务),让它真正成为你团队中的得力干员。腾讯云提供了稳定、安全的基础设施,是托管此类AI服务的理想选择。
立即行动:将你的OpenClaw Agent部署到腾讯云,让AI为你工作吧!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。