LangChain重构工作流:智能体如何自动化你的日常任务?

说实话,我最早接触LangChain时,觉得它就是个大号的提示词拼接工具。直到我花了一个周末,用LangChain的智能体(Agent)把我每天手动处理的十几项重复工作——比如整理日报、检查服务器日志、自动回复常见问题——全串起来之后,我才意识到这东西的真正威力。今天我就把我踩过的坑、摸索出的最佳实践,以及一个能直接上手的自动化工作流完整拆解给你。
为什么智能体能“自动化”而非“脚本化”?
传统脚本是“你告诉它每一步做什么”,智能体是“你告诉它目标,它自己决定步骤”。举个例子:我想让系统每天下午5点检查某个API的响应时间,如果超过500ms就发Slack通知,并写一条日志到数据库。用Python写死逻辑当然可以,但一旦需求变成“如果连续三次超时,就自动重启服务”,你就得改代码。而LangChain智能体只需要你给它工具(检查API、发Slack、写数据库、执行Shell命令),它自己会推理:哦,连续三次超时 → 需要重启 → 执行重启脚本。
这种“推理+行动”的循环,才是智能体自动化的核心。下面我带你一步一步搭建一个能处理“日常巡检+异常处理”的智能体。
第一步:安装LangChain并配置基础环境
别急着装最新版,我吃过亏。LangChain 0.1.x 和 0.2.x 的 Agent API 变化挺大,我这里用 langchain==0.2.0 系列,稳定且文档全。同时需要一个大模型,我推荐用 OpenAI 的 GPT-4(虽然贵点,但推理能力明显强于3.5),或者用 Ollama 跑本地模型(比如 Llama 3)省钱。
# 创建虚拟环境
python -m venv langchain_agent
source langchain_agent/bin/activate
# 安装核心依赖
pip install langchain==0.2.0 langchain-openai==0.1.0 langchain-community==0.0.10
# 如果要用本地模型,安装Ollama并拉取模型
# curl -fsSL https://ollama.com/install.sh | sh
# ollama pull llama3
⚠️ 踩坑提示:如果你用的是Windows PowerShell,source 换成 .langchain_agentScriptsActivate.ps1。另外,langchain-community 里包含了我们需要的一些工具包,比如 ShellTool,别漏了。
第二步:定义“工具”——让智能体有手有脚
智能体不能直接操作你的电脑或API,它需要你提供“工具”。每个工具就是一个函数,加上描述(description)——这个描述特别重要,因为智能体会根据描述来决定什么时候调用这个工具。描述写得太模糊,它会乱调用;写得太具体,它可能找不到。
我来写三个工具:检查服务器响应时间、发送Slack消息、执行Shell命令。
from langchain.tools import tool
import requests
import subprocess
import time
@tool
def check_api_response(url: str) -> str:
"""检查指定URL的HTTP响应时间(单位:毫秒)。输入示例:'https://api.example.com/health'"""
try:
start = time.time()
resp = requests.get(url, timeout=5)
elapsed = int((time.time() - start) * 1000)
return f"状态码: {resp.status_code}, 响应时间: {elapsed}ms"
except Exception as e:
return f"请求失败: {str(e)}"
@tool
def send_slack_message(channel: str, message: str) -> str:
"""发送消息到Slack频道。channel格式如 '#general',message为文本内容。需要设置环境变量SLACK_TOKEN"""
# 实际使用时换成你的Slack Webhook URL或SDK
# 这里仅做演示,直接打印
print(f"[Slack] 发送到 {channel}: {message}")
return f"消息已发送到 {channel}"
@tool
def run_shell_command(command: str) -> str:
"""在本地Shell执行命令。谨慎使用!仅限非破坏性操作,如 'systemctl status nginx'"""
result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=10)
if result.returncode == 0:
return result.stdout[:500] # 截断避免token过多
else:
return f"错误: {result.stderr[:500]}"
注意看 @tool 装饰器里的docstring——那就是智能体理解工具用途的说明书。我一开始写的是“检查API”,结果智能体在需要“重启服务”时也去调用它,因为描述里没说明“只用于检查”。后来改成“检查指定URL的HTTP响应时间”,准确率直接提升。
第三步:创建智能体——给大脑配上推理引擎
LangChain 0.2 里推荐用 create_react_agent(ReAct 模式),它会循环“思考→行动→观察→再思考”。我们需要一个大模型来驱动推理,这里用GPT-4。
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.prompts import PromptTemplate
# 初始化大模型
llm = ChatOpenAI(
model="gpt-4-turbo",
temperature=0.1, # 低温度让输出更确定
api_key="你的OpenAI API密钥" # 或者从环境变量读取
)
# 把工具打包成列表
tools = [check_api_response, send_slack_message, run_shell_command]
# ReAct智能体的核心提示词模板
prompt = PromptTemplate.from_template(
"""你是日常运维助手。你有以下工具可用:
{tools}
请按步骤思考:
1. 分析当前任务需要哪些工具
2. 调用工具获取信息
3. 根据结果决定下一步行动
任务: {input}
{agent_scratchpad}"""
)
# 创建智能体
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=6)
这里 verbose=True 是调试神器,你会看到智能体的每一步思考过程。我第一次跑的时候,发现它有时候会陷入死循环(比如反复检查API而不采取行动),所以加了 max_iterations=6 限制步数,避免无限循环烧钱。
第四步:写一个“日常巡检”任务——让智能体自动执行
现在我们来测试一下:给智能体一个复合任务,看它能不能自己拆解。比如:“检查我的博客API(https://myblog.com/api/health)是否正常,如果响应时间超过800ms,就发Slack告警到 #ops 频道,并执行 systemctl restart nginx。”
task = """
请执行以下步骤:
1. 检查 https://myblog.com/api/health 的响应时间
2. 如果响应时间超过800ms,则发送Slack消息到 #ops,内容为 '博客API响应超时,已执行重启'
3. 然后执行命令:systemctl restart nginx
4. 最后告诉我最终状态
"""
result = agent_executor.invoke({"input": task})
print("最终输出:", result["output"])
当 verbose=True 时,你会看到类似这样的输出:
> 进入新的AgentExecutor链...
思考: 我需要先检查API响应时间,然后根据结果决定是否发Slack和执行重启。
行动: check_api_response
行动输入: https://myblog.com/api/health
观察: 状态码: 200, 响应时间: 950ms
思考: 响应时间950ms超过800ms,需要发Slack并重启。
行动: send_slack_message
行动输入: #ops | 博客API响应超时,已执行重启
观察: 消息已发送到 #ops
行动: run_shell_command
行动输入: systemctl restart nginx
观察: (无输出,表示成功)
思考: 所有步骤完成。
最终答案: 博客API响应超时(950ms),已发送Slack告警并执行nginx重启。
第一次看到这个输出时,我有点震撼——它真的自己推理出了“先检查→条件判断→发消息→执行命令”的完整流程。而且每一步的“行动输入”都是它自己生成的,包括把Slack频道和消息拼接成字符串。
第五步:把智能体部署成定时任务——真正的自动化
手动调用一次没意义,我们需要它每天下午5点自动执行。我用Linux的cron来调度,但注意:cron环境通常没有你的Python虚拟环境变量,需要写绝对路径。
# 编辑crontab
crontab -e
# 每天下午5点执行巡检脚本(假设脚本在 /home/you/agent_scripts/daily_check.py)
0 17 * * * cd /home/you/agent_scripts && /home/you/langchain_agent/bin/python daily_check.py >> /var/log/agent.log 2>&1
⚠️ 又一个坑:cron执行时,SLACK_TOKEN 这些环境变量可能没加载。我建议在Python脚本开头显式设置环境变量,或者用 python-dotenv 加载 .env 文件:
# daily_check.py 开头
from dotenv import load_dotenv
load_dotenv('/home/you/agent_scripts/.env') # 显式指定路径
进阶技巧:让智能体学会“记忆”和“上下文”
上面的智能体每次执行都是“失忆”的——它不知道上次巡检的结果。如果你想让智能体记住“昨天API就超时了,今天是连续第二天”,就需要引入记忆模块。LangChain的 ConversationBufferMemory 可以做到,但要注意:智能体的记忆会占用token,如果任务简单,反而增加成本。
我自己的做法是:把历史结果写入一个JSON文件,然后在每次任务前让智能体先读取这个文件作为上下文。比如:
@tool
def read_history() -> str:
"""读取最近7天的巡检记录,返回JSON字符串"""
with open('/var/log/agent_history.json', 'r') as f:
return f.read()
然后在任务描述里加上:“先读取历史记录,如果发现连续两天超时,则升级告警到电话通知”。这样既保留了记忆,又避免了记忆模块的token浪费。
踩坑总结
最后分享几个让我抓狂过的细节:
- 工具描述要精准:别写“检查服务器”,要写“检查指定URL的HTTP状态码和响应时间”。智能体真的会抠字眼。
- 限制迭代次数:
max_iterations设个5-8次,否则一个复杂任务可能跑20步,API费用暴涨。 - Shell工具要加白名单:我的
run_shell_command只允许特定命令(比如systemctl和grep),防止智能体乱执行rm -rf。可以用正则过滤:
allowed_commands = ['systemctl', 'docker', 'grep', 'cat']
if not any(cmd in command for cmd in allowed_commands):
return "命令不在白名单内"
- 错误处理要兜底:如果API请求失败,智能体可能会尝试用Shell命令去ping,但如果没有权限,就卡住了。我一般在工具函数里捕获所有异常,返回友好信息,让智能体自己决定下一步。
现在这套智能体已经在我服务器上跑了两个月,每天自动巡检3个API、2个数据库、1个Nginx状态,累计帮我处理了20多次异常(大部分是重启服务)。它不完美——偶尔会误解工具描述,但比起手动SSH登录敲命令,已经省了太多时间。如果你也有重复的运维或办公任务,不妨从一个小点开始,让智能体先帮你“跑一次”,你会爱上这种“我说目标,它来执行”的感觉。


Shell工具不开白名单我真不敢跑,太吓人了