当前位置:首页>python>新手篇:纯 Python 手搓一个能搜索、能计算的 Agent

新手篇:纯 Python 手搓一个能搜索、能计算的 Agent

  • 2026-09-18 00:29:43
新手篇:纯 Python 手搓一个能搜索、能计算的 Agent

想学做 AI Agent(智能体),你是不是直接就去啃 LangChain 或者 AutoGen 了?结果被各种抽象概念绕晕,连个‘Hello World’都跑不通?停!今天咱们反其道而行。在引入大模型之前,强烈建议你先用纯 Python 写一个‘没有大脑’的简单 Agent。为什么?因为 Agent 的本质不是大模型,而是'感知 - 决策 - 行动'这个闭环。今天这个案例,不用 API Key,不用联网买算力,只用标准库,带你彻底搞懂 Agent 的底层骨架!

来看代码(代码在本文后),核心就三步,非常清晰。

第一步,定义工具(Tools)。看这里,我们写了两个函数:一个是 search_web 模拟搜索,一个是 calculate 做数学计算。这就是 Agent 的‘手’,它只能干我们预先定义好的事。

第二步,构建决策引擎(Decision Engine)。这是最关键的地方!在没有 LLM 的时候,我们用‘规则’来模拟大脑。看这个 _decide_tool 函数:如果用户输入里有加减乘除,它就判定‘我要用计算器’;如果有‘搜索’、‘查询’这些词,它就判定‘我要去联网’。这其实就是最原始的意图识别。

第三步,执行循环(Run Loop)。主程序接收用户指令,传给决策引擎。引擎说‘用计算器’,程序就立刻调用计算函数,拿到结果,最后拼成一句话返回给用户。你看,虽然没有大模型那么聪明,但‘观察、思考、行动’这个完整闭环,我们已经跑通了!

跑通这个例子,你就明白了:Agent 的核心架构,其实就是一个调度器 + 一堆工具函数。之前的‘规则判断’虽然死板,但它让我们看清了数据是怎么流动的。一旦你理解了这个骨架,下一步就简单了——只需要把中间那个死板的‘规则判断’,替换成‘大模型 API 调用’,让 LLM 来负责理解意图和提取参数。咣当!一个真正的智能 Agent 就诞生了!

import jsonimport reimport requestsfrom typing import Callable, Dict, List, Optional# --- 1. 定义工具 (Tools) ---def search_web(query: str) -> str:    """    模拟联网搜索工具。    在真实场景中,这里可以调用 Google Search API, Bing API...    """    print(f"🔍 [工具调用] 正在搜索: {query}")    # 这里为了演示,我们模拟一个搜索结果,或者你可以接入真实的 API    try:        # 这是一个简单的示例,实际使用中建议申请 API Key        url = "https://uapis.cn/api/v1/search/aggregate"        headers = {"Content-Type": "application/json"}        payload = {           "query": query,           "fetch_full": False,           "timeout_ms": 5000        }        resp = requests.post(url, json=payload, headers=headers, timeout=5)        if resp.status_code == 200:            data = resp.json()            rtn = ""            for item in data.get("results", []):               rtn += f"{item['title']} - {item['url']}"            return f"搜索结果: {rtn}"        else:           return f"请求失败:{resp['text']}"    except Exception as e:        return f"搜索出错: {str(e)}"def calculate(expression: str) -> str:    """    安全计算数学表达式。    """    print(f"🧮 [工具调用] 正在计算: {expression}")    try:        # 仅允许数字和基本运算符,防止代码注入        if not re.match(r'^[0-9+\-*/().\s]+$', expression):            return "错误: 无效的数学表达式"        result = eval(expression)        return f"计算结果: {result}"    except Exception as e:        return f"计算出错: {str(e)}"# 注册可用工具TOOLS = {    "search_web": {        "function": search_web,        "description": "当用户需要查询事实、新闻、天气或未知信息时使用。参数是搜索关键词。",        "parameters": {"type": "string", "name": "query"}    },    "calculate": {        "function": calculate,        "description": "当用户需要进行数学计算时使用。参数是数学表达式(如 '2 + 2' 或 '10 * 5')。",        "parameters": {"type": "string", "name": "expression"}    }}# --- 2. 定义 Agent 核心逻辑 ---class SimpleAgent:    def __init__(self):        self.history = []    def _decide_tool(self, user_input: str) -> Optional[Dict]:        """        简单的规则引擎来决定使用哪个工具。        在实际复杂 Agent 中,这里通常会调用 LLM (如 GPT-4) 来进行意图识别。        """        user_input_lower = user_input.lower()        # 规则 1: 数学计算        # 如果包含明显的数学符号或 "计算", "算一下"        if any(op in user_input for op in ['+', '-', '*', '/', '=']) or "计算" in user_input or "算" in user_input:            # 提取数字和运算符部分 (简化版提取)            match = re.search(r'([\d+\-*/().\s]+)', user_input)            if match:                return {"tool": "calculate", "args": match.group(1).strip()}        # 规则 2: 搜索查询        # 如果包含 "搜索", "查询", "是谁", "什么是", "天气", "新闻" 等        search_keywords = ["搜索", "查询", "是谁", "什么是", "weather", "news", "who is", "what is"]        if any(kw in user_input_lower for kw in search_keywords):            # 提取问题主体,去掉指令词 (简化版)            query = user_input            for kw in ["搜索", "查询", "请告诉我", "帮我查一下"]:                query = query.replace(kw, "")            return {"tool": "search_web", "args": query.strip()}        return None    def run(self, user_input: str) -> str:        print(f"\n👤 用户: {user_input}")        # 第一步:思考/决策        decision = self._decide_tool(user_input)        if decision:            tool_name = decision["tool"]            args = decision["args"]            if tool_name in TOOLS:                # 第二步:行动 (调用工具)                tool_func = TOOLS[tool_name]["function"]                observation = tool_func(args)                # 第三步:综合结果                response = f"我使用了 {tool_name} 工具,得到的结果是:{observation}"                return response            else:                return "我找不到对应的工具来处理这个请求。"        else:            # 如果没有匹配到工具,直接回复            return "我不确定是否需要使用工具。你可以问我数学题,或者让我搜索某些信息(例如:'搜索 Python 教程' 或 '计算 123 * 456')。"# --- 3. 运行测试 ---if __name__ == "__main__":    agent = SimpleAgent()    # 测试用例 1: 触发搜索    q1 = "搜索一下 Python 3.12 新特性"    print(f"🤖 Agent: {agent.run(q1)}")    # 测试用例 2: 触发计算    q2 = "帮我计算 (120 + 50) * 3 等于多少"    print(f"🤖 Agent: {agent.run(q2)}")    # 测试用例 3: 无工具匹配    q3 = "你好,今天心情怎么样?"    print(f"🤖 Agent: {agent.run(q3)}")

最新文章

随机文章