摘要:大模型(LLM)的下半场是 Agent(智能体)。本文将带你从理论到实践,深入理解 Agent 的核心架构,并使用 Python 和 LangChain 框架,结合当下最火的 DeepSeek/GPT-4 模型,构建一个具备“联网搜索”、“文件操作”和“长期记忆”能力的超级智能体。

关键词:AI Agent, LangChain, DeepSeek, Python, 这里的LLM, 教程


📅 1. 前言:为什么 Agent 是未来?

如果你还在只用 ChatGPT 聊天,那你可能已经落伍了。

单纯的大模型(LLM)像是一个博学的“脑瘫”教授:他无所不知,但他没有手脚(无法联网、无法操作数据库)、没有记忆(聊完就忘)。

AI Agent(智能体) 解决了这个问题。引用 OpenAI Lilian Weng 的经典公式:

$$Agent = LLM(大脑) + Planning(规划) + Memory(记忆) + Tools(工具)$$

通过这个架构,我们可以让 AI 不仅仅是“说话”,而是去**“做事”**。本文将带你亲手实现这个公式。


🛠️ 2. 技术栈选型与环境准备

为了保证教程的通用性和先进性,我们采用目前业界最主流的方案:

  • 编程语言:Python 3.10+

  • 核心框架:LangChain (v0.2/v0.3) —— 目前最强大的 LLM 编排工具。

  • 大模型:DeepSeek V3 (国产之光,兼容 OpenAI 协议) 或 GPT-4o。

  • 搜索工具:Tavily 或 DuckDuckGo。

  • 向量库:FAISS (用于简单的 RAG 记忆)。

2.1 安装依赖

在终端中执行以下命令(建议使用虚拟环境):

Bash

# 安装 LangChain 核心及社区包
pip install langchain langchain-openai langchain-community

# 安装搜索工具和其他工具库
pip install duckduckgo-search faiss-cpu

# 这是一个可选库,用于更好的日志展示
pip install grandalf

🧠 3. 核心实战:打造你的第一个 Agent

我们将分三步走:连接大脑 -> 装备工具 -> 注入灵魂(记忆)。

3.1 第一步:初始化“大脑” (LLM)

我们使用 ChatOpenAI 类,因为它兼容 OpenAI 和 DeepSeek。

Python

import os
from langchain_openai import ChatOpenAI

# ================= 配置区域 =================
# 建议将 Key 放在环境变量或 .env 文件中
# 这里以 DeepSeek 为例,性价比极高
DEEPSEEK_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxx" 
BASE_URL = "https://api.deepseek.com"

os.environ["OPENAI_API_KEY"] = DEEPSEEK_API_KEY
# ===========================================

# 初始化模型
# temperature=0.1:让模型更严谨,适合执行任务
llm = ChatOpenAI(
    model="deepseek-chat", 
    temperature=0.1,
    base_url=BASE_URL
)

# 测试一下
print("模型响应测试:", llm.invoke("你好,你是谁?").content)

3.2 第二步:打造“手脚” (Custom Tools)

Agent 的强大取决于工具有多强。我们定义两个工具:

  1. 联网搜索:弥补大模型知识滞后的问题。

  2. 自定义计算/逻辑:处理模型不擅长的精确任务。

Python

from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.tools import tool

# 1. 引入现成的搜索工具
search_tool = DuckDuckGoSearchRun()

# 2. 自定义一个工具:股票分析模拟器
# 使用 @tool 装饰器,docstring 非常重要,因为模型会根据它来决定是否调用
@tool
def analyze_stock(ticker: str) -> str:
    """
    输入股票代码(如 AAPL 或 00700),返回该股票的当前技术面分析结果。
    当用户询问具体的股票建议时,必须调用此工具。
    """
    # 真实场景这里会调用 Yahoo Finance 或 TuShare 的 API
    # 这里做模拟返回
    return f"【模拟数据】股票 {ticker} 目前处于上升通道,RSI指标为65,建议持有。"

# 3. 工具集结
tools = [search_tool, analyze_stock]

# 4. 绑定工具到模型
llm_with_tools = llm.bind_tools(tools)

3.3 第三步:组装 Agent (ReAct 架构)

这是最关键的一步。我们需要一个 Prompt 来告诉模型如何思考,并使用 AgentExecutor 来执行“思考-行动-观察”的循环。

Python

from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

# 定义 Prompt
# System: 设定人设
# Placeholder: 这是一个占位符,LangChain 会自动把中间的思考过程填入这里
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的金融 AI 助理。你会先思考用户的问题,如果需要数据,你会使用工具查找,最后给出综合建议。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

# 创建 Agent 实例
agent = create_tool_calling_agent(llm, tools, prompt)

# 创建执行器
# verbose=True 会在控制台打印出 Agent 的详细思考过程(非常解压!)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

🚀 4. 运行演示

让我们来看看这个 Agent 是如何处理复杂任务的。

场景:复合任务(联网 + 自定义逻辑)

Python

if __name__ == "__main__":
    query = "请帮我搜索一下'DeepSeek'最近的大新闻,并分析一下英伟达(NVDA)现在的股票情况。"
    
    print(f"🧐 用户提问: {query}\n")
    print("-" * 50)
    
    # 启动!
    response = agent_executor.invoke({"input": query})
    
    print("-" * 50)
    print(f"🤖 最终回答:\n{response['output']}")

运行预期结果(Log 模拟):

  1. Agent 思考:用户问了两个问题,一个是新闻(需要搜索),一个是股票(需要分析)。

  2. Agent 行动 1:调用 duckduckgo_search 搜索 "DeepSeek news"。

  3. Agent 观察 1:获取搜索结果(如 DeepSeek 开源 V3 等)。

  4. Agent 行动 2:调用 analyze_stock 参数 NVDA

  5. Agent 观察 2:获取模拟的股票数据。

  6. Agent 最终响应:结合上述两部分信息,生成流畅的自然语言回答。


💾 5. 进阶:为 Agent 加上“记忆”

上面的 Agent 是“健忘”的,下一句话就不记得上一句话了。我们需要添加 Memory

(注:LangChain 0.2+ 推荐使用 RunnableWithMessageHistory,但为了代码简洁易懂,这里演示最经典的 ChatHistory 注入方式)

Python

from langchain_core.messages import HumanMessage, AIMessage

# 模拟一个简单的聊天记录列表
chat_history = []

def chat_loop():
    print("=== 进入多轮对话模式 (输入 'exit' 退出) ===")
    while True:
        user_input = input("You: ")
        if user_input.lower() == "exit":
            break
            
        # 将历史记录传递给 Agent
        # 注意:我们需要修改上面的 Prompt 增加 history 的占位符,这里仅做逻辑演示
        result = agent_executor.invoke({
            "input": user_input, 
            "chat_history": chat_history # 需要在 Prompt 中预埋
        })
        
        # 手动更新历史
        chat_history.append(HumanMessage(content=user_input))
        chat_history.append(AIMessage(content=result['output']))
        
        print(f"Agent: {result['output']}")

# 提示:实际开发中建议使用 LangGraph 来管理状态,这在大规模生产中更稳定。

🔮 6. 总结与展望

通过这几十行代码,我们已经实现了一个具备感知能力(Search)、**逻辑能力(Code)表达能力(LLM)**的智能体雏形。

还可以做什么?

  1. RAG(检索增强):给它喂一本 PDF,让它基于文档回答问题。

  2. 多智能体协作(Multi-Agent):使用 LangGraphCrewAI,创建一个由“产品经理”、“程序员”和“测试”组成的虚拟软件公司。

  3. 本地化部署:使用 Streamlit 把它变成一个 Web 网页应用。

AI 的时代,动手实操才是硬道理。


📝 作者寄语

如果这篇教程对你有帮助,请 点赞、收藏、关注

关注我,下一期我们将深入讲解 《如何用 LangGraph 构建多智能体协作网络》

源码获取:评论区留言或私信“Agent源码”即可获取完整 Python 文件。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐