LangChain 实现AI Agent 工程化完整步骤
·
文章目录
整体流程总览
- 安装依赖包
- 准备大模型API密钥,配置环境变量
- 初始化大模型LLM实例
- 定义Agent可用工具(自定义业务工具)
- 构造Agent提示词模板
- 创建Agent实例 + AgentExecutor执行器
- 调用执行、调试、开启日志
- 工程增强:记忆、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。
更多推荐



所有评论(0)