Agent开发实战-langChain重构
·
很多初学者直接上手 LangChain,会被它眼花缭乱的类名(Classes)和链条(Chains)搞晕,因为他们不知道底层在干嘛。但你不一样,当你看到 LangChain 的源码时,你会心一笑:“这不就是我前两天写的那个 while 循环和 try-except 嘛!”
1. 概念映射:你的手写代码 VS LangChain 组件
我们先把你在前几天手写的“土方法”,一一对应到 LangChain 的“正规军”装备上:
| 你的手写逻辑 | LangChain 官方组件 | 说明 |
|---|---|---|
MockLLM / requests.post |
ChatOpenAI |
统一的大模型接口。换模型只需改一行代码,无需重写请求逻辑。 |
| 拼接 f-string 字符串 | ChatPromptTemplate |
模板管理。自动帮你处理 System, User, Assistant 等角色格式。 |
手写 [doc.page_content for doc in docs] |
create_retrieval_chain |
RAG 检索链。自动帮你把向量库查出来的文档塞进 Prompt 里。 |
| 手写的滑动窗口列表 | ConversationBufferWindowMemory |
记忆组件。自动剔除旧消息,防止 Token 撑爆。 |
re.search 正则抠 JSON + while 循环 |
AgentExecutor + create_react_agent |
核心引擎。帮你做 ReAct 循环,自带 JSON 报错自愈机制和死循环熔断。 |
2. LangChain 初体验:用 30 行代码重构你的 Agent
你不需要再去写复杂的正则表达式和循环了。请确保你安装了最新的库:
pip install langchain langchain-openai langchain-community
新建一个 langchain_agent.py,直接体验工业级框架的丝滑:
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_react_agent
from langchain_core.prompts import PromptTemplate
from langchain.memory import ConversationBufferWindowMemory
# ==========================================
# 1. 挂载大脑 (LLM) - 连接你本地的 Qwen
# ==========================================
print("[*] 正在连接本地大模型...")
llm = ChatOpenAI(
base_url="http://127.0.0.1:8080/v1",
api_key="sk-none",
model="qwen2.5-7b",
temperature=0.1
)
# ==========================================
# 2. 定义手脚 (Tools) - 一个装饰器搞定工具注册
# ==========================================
@tool
def search_ziwei(query: str) -> str:
"""当用户询问命理、紫微斗数、星曜等专业知识时,必须使用此工具。"""
# 这里为了演示直接返回字符串,实际中这里放你的 rag_system.query(query)
print(f" [⚙️ 底层执行工具] 正在检索: {query}")
return f"检索结果:{query} 是一颗非常重要的星曜,代表了智慧与变动。"
tools = [search_ziwei]
# ==========================================
# 3. 组装记忆 (Memory)
# ==========================================
# k=3 表示记住最近 3 轮完整对话
memory = ConversationBufferWindowMemory(memory_key="chat_history", k=3)
# ==========================================
# 4. 编写 Prompt 与组装 Agent
# ==========================================
# LangChain 标准的 ReAct 模板,留出变量占位符
template = """你是一个紫微斗数专家。尽可能用中文回答问题。
你可以使用以下工具:
{tools}
请严格遵守以下格式:
Question: 用户的问题
Thought: 思考你需要做什么
Action: 必须是 [{tool_names}] 之一
Action Input: 传入工具的参数
Observation: 工具的返回结果
... (Thought/Action/Action Input/Observation 可以循环多次)
Thought: 我现在知道最终答案了
Final Answer: 最终回答给用户的话
之前的对话记录:
{chat_history}
Question: {input}
{agent_scratchpad}"""
prompt = PromptTemplate.from_template(template)
# 创建 Agent 逻辑 (它代替了你手写的正则解析和 Action 判断)
agent = create_react_agent(llm, tools, prompt)
# 创建执行器 (它代替了你手写的 for step in range(max_iterations) 循环)
# handle_parsing_errors=True 就是你昨天写的 JSON 自愈机制!
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True, # 开启 verbose,能看到它内部的思考过程!
handle_parsing_errors=True
)
# ==========================================
# 5. 极简的主循环
# ==========================================
print("="*50)
print("🔮 LangChain 版紫微斗数 Agent 已启动")
print("="*50)
while True:
user_input = input("\n🧑💻 你: ").strip()
if user_input.lower() in ['quit', 'exit']:
break
if not user_input: continue
# 仅仅这一行代码,就走完了记忆读取、ReAct 循环、工具调用、自愈和记忆保存!
response = agent_executor.invoke({"input": user_input})
print(f"\n🤖 大师: {response['output']}")
3. 代码亮点解析(面试必聊)
当你运行这段代码时,注意观察控制台因为 verbose=True 打印出来的绿色文本。你会看到 LangChain 在底层帮你做了多少脏活累活:
@tool装饰器: 你再也不用手写繁琐的 JSON 工具说明书了!LangChain 会自动把你函数的docstring(注释)和参数类型解析成大模型能看懂的 JSON Schema。handle_parsing_errors=True: 昨天你写了好几行try-except来捕获 JSON 错误并引导模型重写。在 LangChain 里,只需把这个参数设为 True,框架会自动帮你“温柔地”把错误信息喂回给模型,实现自愈。memory.save_context去哪了? 因为你把memory对象传给了AgentExecutor,LangChain 内部会自动在循环结束后,把极其干净的input和output存入记忆,自动帮你做了数据隔离,防止中间思考过程污染记忆。
更多推荐


所有评论(0)