AI开发-python-langchain框架(3-22-Conversational_ReAct智能体)

LangChain 实战:面向对话场景的 Conversational ReAct 智能助手实现

在构建具备推理能力与交互体验的智能助手时,ReAct 框架凭借「思考 - 行动 - 观察」的闭环推理逻辑,成为大模型 Agent 领域的经典范式。而Conversational ReAct 作为 LangChain 中面向对话场景定制的 ReAct 变体,将推理决策能力与自然对话交互深度融合,在保留工具调用、逻辑推理能力的同时,实现更流畅、更贴近人类对话习惯的交互体验,非常适合用于智能助手、对话机器人等场景。

一、Conversational ReAct 核心特点

相比于基础 ReAct 架构,Conversational ReAct 更聚焦对话交互,具备三大核心优势:

  1. 对话记忆能力
    内置对话历史管理机制,能够持续记住用户信息、上下文内容,实现真正的多轮连贯对话,而非单次问答,大幅提升交互自然度。
  2. 推理与对话解耦
    严格遵循「思考 - 行动 - 观察」推理闭环,需要计算、查询等任务时自动调用工具,日常闲聊、问候等场景直接自然回复,兼顾实用性与对话体验。
  3. 灵活适配与稳定可控
    支持自定义工具扩展,同时可通过约束规则避免无效调用、格式错乱与循环推理,保证交互稳定可靠,适配不同大模型与部署环境。
  4. 轻量化易落地
    无需复杂架构改造,基于 LangChain 标准组件即可快速实现,兼顾开发效率与实际使用效果。

二、低版本 LangChain 下的实现思路

由于部分稳定环境中常用 langchain==0.1.20 版本,该版本暂未提供封装好的 create_conversational_react_agent,因此采用通用 ReAct 能力 + 对话记忆组件的组合方案,实现与新版 Conversational ReAct 完全一致的效果。
整体实现围绕四大核心模块搭建:

  1. 大模型接入层
    兼容开源模型与私有部署模型接口,通过标准化配置完成模型调用,保证推理能力与格式输出可控。
  2. 工具能力扩展
    封装可复用的实用工具,如数学计算、时间查询等,通过规范工具描述,让模型能够自主判断并调用。
  3. 对话记忆管理
    使用对话缓冲记忆组件,保存历史交互信息,让 Agent 具备上下文感知能力,实现连贯多轮对话。
  4. 推理规则约束
    通过结构化提示词规范推理流程,明确工具使用边界与输出格式,避免无效循环、非法调用,确保推理闭环完整。

三、实现核心逻辑

整个系统以 ReAct 推理循环为骨架,对话记忆为上下文支撑,形成稳定的交互链路:

  1. 接收用户输入后,先结合历史对话理解意图;
  2. 判断是否需要调用工具,闲聊场景直接给出回复;
  3. 需工具支持时,执行「思考 - 选择工具 - 执行 - 观察结果」流程;
  4. 完成推理后输出最终答案,并将本轮对话存入记忆;
  5. 全程约束调用行为,防止格式错误与循环卡死。

该方案适配低版本 LangChain,同时完整保留 Conversational ReAct 的对话能力与推理特性,在生产环境与学习实践中均具备极高的实用性。

四、总结

Conversational ReAct 打通了「推理工具调用」与「自然对话交互」的壁垒,既拥有 ReAct 强大的任务解决能力,又具备对话系统的流畅体验。在无法使用新版封装接口的场景下,通过基础 ReAct 组件搭配对话记忆,即可实现同等效果。
这种实现方式轻量化、易扩展、稳定性强,既适合作为大模型 Agent 的入门实践,也可直接用于构建面向用户的对话式智能助手,是 LangChain 实战中极具价值的经典范式。
代码实现:

复制代码
# -*- coding: utf-8 -*-
import warnings
from datetime import datetime
from dotenv import load_dotenv

warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", category=UserWarning)

from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.tools import Tool
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate

load_dotenv()

# === LLM ===
DEEPSEEK_API_KEY = "123"
llm = ChatOpenAI(
    api_key=DEEPSEEK_API_KEY,
    base_url="http://172.25.140.23:8003/v1",
    model="/data/yangfengyi/Qwen3-235B-A22B-Instruct-2507",
    temperature=0.1,
    max_tokens=1024
)

# === 工具 ===
def safe_calculate(expr: str) -> str:
    try:
        allowed = set("0123456789+-*/(). ")
        if not all(c in allowed for c in expr):
            return "错误:非法字符"
        return str(eval(expr, {"__builtins__": {}}, {}))
    except Exception as e:
        return f"错误: {e}"

def get_current_time(_) -> str:
    return datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")

tools = [
    Tool(name="Calculator", func=safe_calculate, description="数学计算,输入算式如 1+1"),
    Tool(name="CurrentTime", func=get_current_time, description="获取当前时间"),
]

# === 记忆 ===
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# ======================= 核心修复:标准 ReAct 格式 =======================
prompt = PromptTemplate.from_template("""
你是一个友好的AI助手,有记忆能力。
回答必须严格按照以下格式,**一步一步来**:

Question: 用户问题
Thought: 分析问题,决定是否需要工具
Action: 工具名称,必须是 [{tool_names}],不需要工具就不写Action
Action Input: 工具输入
Observation: 工具返回结果
...(可循环多轮)
Thought: 我现在可以给出最终答案
Final Answer: 直接回答用户

规则:
1. 日常聊天、问候、自我介绍,**不需要工具**,直接 Final Answer
2. 计算、问时间,才调用对应工具
3. 绝对不要调用不存在的工具,不要写 Action: None
4. 得到结果后必须用 Final Answer 结束

可用工具:
{tools}

历史对话:
{chat_history}

Question: {input}
Thought:{agent_scratchpad}
""")

# === Agent === 注:langchain ==0.1.20用create_react_agent,  langchain ≥ 0.2.0 使用 create_conversational_react_agent 效果一样
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=5  # 防止死循环
)

# === 运行 ===
if __name__ == "__main__":
    print("✅ 3-Conversational_ReAct 正常启动!输入 quit 退出")
    while True:
        user_input = input("你: ").strip()
        if user_input.lower() in ["quit", "exit"]:
            break
        try:
            resp = agent_executor.invoke({"input": user_input})
            print(f"助手: {resp['output']}\n")
        except Exception as e:
            print(f"助手: 你好呀小老虎!\n")

结果输出:

✅ 3-Conversational_ReAct 正常启动!输入 quit 退出

你: 你好我叫小老虎

> Entering new AgentExecutor chain...

Thought: 这是日常问候和自我介绍,不需要工具。

Final Answer: 你好,小老虎!很高兴认识你~

> Finished chain.

助手: 你好,小老虎!很高兴认识你~

你: 现在几点了

> Entering new AgentExecutor chain...

Thought: 需要获取当前时间

Action: CurrentTime

Action Input: 2026年04月10日 11:54:35Thought: 我现在可以给出最终答案

Final Answer: 现在是2026年04月10日 11:54:35

> Finished chain.

助手: 现在是2026年04月10日 11:54:35

你: 我叫什么

> Entering new AgentExecutor chain...

Thought: 我可以从历史对话中找到用户的名字,不需要工具

Final Answer: 你叫小老虎

> Finished chain.

助手: 你叫小老虎

更多学习资料尽在 老虎网盘资源