整体流程总览

  1. 安装依赖包
  2. 准备大模型API密钥,配置环境变量
  3. 初始化大模型LLM实例
  4. 定义Agent可用工具(自定义业务工具)
  5. 构造Agent提示词模板
  6. 创建Agent实例 + AgentExecutor执行器
  7. 调用执行、调试、开启日志
  8. 工程增强:记忆、RAG作为工具、异常捕获、封装接口

步骤1:安装依赖

pip install langchain langchain-openai python-dotenv

如果后续要做RAG知识库,额外安装:

pip install langchain-community chromadb pypdf

步骤2:配置环境变量.env

项目根目录新建 .env 文件,把密钥、接口地址放这里,不要硬编码到代码。

#大模型配置
API_KEY=sk-xxxxxxxxxxxxxxxx
BASE_URL=https://api.deepseek.com/v1
MODEL_NAME=deepseek-chat

步骤3:导入模块、加载环境变量,初始化LLM

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

#加载.env
load_dotenv()

#初始化大模型,兼容所有OpenAI格式API
llm = ChatOpenAI(
    model=os.getenv("MODEL_NAME"),
    api_key=os.getenv("API_KEY"),
    base_url=os.getenv("BASE_URL"),
    temperature=0,   #Agent任务建议0,减少幻觉
    timeout=60
)

若使用Ollama本地模型:base_url填http://127.0.0.1:11434/v1,api_key随便填字符串。

步骤4:定义工具Tool

@tool装饰器定义工具,函数docstring必须写清楚,大模型依靠注释理解工具用途、参数。

@tool
def calculator(expression:str)->str:
    """
    数学计算工具,执行四则运算等数学表达式
    参数expression:数学表达式字符串,示例:"1350*1.05"
    """
    return str(eval(expression,{"__builtins__":None}))

@tool
def get_now_time()->str:
    """获取当前系统时间,不需要入参"""
    import time
    return time.strftime("%Y-%m-%d %H:%M:%S")

#把所有工具放入列表
tools = [calculator, get_now_time]

工程中可以扩展:查询数据库、http调用第三方接口、RAG检索函数都可以包装成@tool

步骤5:构建Prompt提示词模板

agent_scratchpad 是LangChain Agent必须内置变量,用来存放模型思考、工具调用中间记录,不能删掉。

prompt = ChatPromptTemplate.from_messages([
    ("system","你是业务AI助手,根据用户问题合理选择工具完成任务。有工具就调用,不需要工具直接输出答案。"),
    ("user","{input}"),
    ("agent_scratchpad","{agent_scratchpad}")
])

步骤6:创建Agent对象 + AgentExecutor执行器

  • create_openai_tools_agent:创建agent逻辑,负责思考、选择工具、解析工具参数
  • AgentExecutor:真正执行循环:调用LLM→调用工具→回传结果,循环直到输出答案;控制最大迭代次数,防止死循环。
#构建agent
agent = create_openai_tools_agent(llm, tools, prompt)

#执行器配置
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,        #打印内部思考过程,调试打开;生产环境关闭False
    max_iterations=5,    #最大循环次数,防止无限调用工具
    handle_parsing_errors=True #开启解析错误容错,模型输出格式错乱不会直接崩溃
)

步骤7:调用Agent运行

if __name__ == "__main__":
    resp = agent_executor.invoke({"input":"现在几点,346*28等于多少?"})
    print("====最终回答====")
    print(resp["output"])

运行后verbose=True会打印完整思考链路:模型决定调用哪个工具、工具入参、工具返回结果。

步骤8:工程化增强(生产环境常用)

8.1 增加对话记忆,支持多轮对话

pip install langchain-memory
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

def get_history(session_id:str):
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

agent_with_memory = RunnableWithMessageHistory(
    agent_executor,
    get_history,
    input_messages_key="input",
    history_messages_key="history"
)

#调用,session_id区分不同用户会话
resp = agent_with_memory.invoke(
    {"input":"再把刚才的结果乘以2"},
    config={"configurable":{"session_id":"user_001"}}
)
print(resp["output"])

8.2 将RAG检索包装成Agent工具

把向量库检索封装成tool,Agent遇到私有文档问题自动调用知识库。

@tool
def search_doc(query:str)->str:
    """查询本地私有知识库,遇到业务文档相关问题调用此工具"""
    #这里替换为你的Chroma/Milvus检索逻辑
    docs = retriever.invoke(query)
    return "\n".join([d.page_content for d in docs])

tools.append(search_doc)

8.3 异常捕获,封装调用

def agent_chat(query:str):
    try:
        res = agent_executor.invoke({"input":query})
        return {"code":0,"data":res["output"]}
    except Exception as e:
        return {"code":-1,"msg":str(e)}

8.4 FastAPI封装http接口

pip install fastapi uvicorn

agent_chat()包装成post接口,前端、小程序就可以请求Agent。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐