实战:基于 LangChain 与通义千问构建旅行规划 AI Agent
在 AI 应用开发的浪潮中,大语言模型(LLM)展现出了惊人的理解与生成能力,但其本身缺乏与真实世界交互的“手脚”。为了赋予 AI 自主规划与执行任务的能力,AI Agent(智能体)应运而生。本文将带你从零开始,利用 LangChain 框架与阿里通义千问(Qwen)大模型,构建一个具备工具调用与上下文记忆能力的“旅行规划 Agent”。
一、 核心组件与架构设计
一个标准的 ReAct(Reasoning + Acting)Agent 通常由以下四个核心组件构成:
- LLM(大脑):负责理解用户意图、进行逻辑推理并生成最终回复。本文选用通义千问(Qwen),其强大的中文理解能力非常适合处理国内旅行场景。
- Tools(工具):Agent 的“手脚”。通过定义函数并赋予描述,Agent 能够根据需求自主决定何时调用外部 API(如查询机票、搜索景点)。
- Memory(记忆):维持多轮对话的上下文。在旅行规划场景中,Agent 需要记住用户之前提到的目的地,避免用户反复输入。
- AgentExecutor(执行引擎):串联上述组件的调度器。它驱动“思考(Thought) -> 行动(Action) -> 观察(Observation)”的循环,直到得出最终答案。
二、 环境准备与模型接入
pip install langchain langchain-community
在代码中,我们通过环境变量安全地读取 API Key,并利用 LangChain 提供的
ChatOpenAI 类来接入通义千问。由于阿里云 DashScope 提供了兼容 OpenAI 的接口,我们可以无缝切换:import os from langchain_community.chat_models import ChatOpenAI # 从环境变量获取 Qwen API Key qwen_key = os.environ.get("QWEN_API_KEY") # 初始化通义千问模型 llm = ChatOpenAI( model="qwen-max", openai_api_key=qwen_key, openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1", temperature=0.7 )
三、 定义工具与记忆机制
为了让 Agent 能够查询旅行信息,我们使用 LangChain 的
Tool 类封装了两个模拟函数。关键在于 description 参数,这是 Agent 决定何时使用该工具的依据。同时,我们引入 ConversationBufferMemory 来保存聊天历史:from langchain.agents import Tool from langchain.memory import ConversationBufferMemory # 定义查询机票工具 def search_flights(destination: str) -> str: return f"已为您查到飞往 {destination} 的特价机票,往返含税约 1500 元。" # 定义查询景点工具 def search_attractions(city: str) -> str: return f"{city} 的热门景点包括:天涯海角、蜈支洲岛。建议游玩 4-5 天。" tools = [ Tool(name="FlightSearch", func=search_flights, description="查询前往某城市的航班或机票信息"), Tool(name="AttractionSearch", func=search_attractions, description="查询某城市的旅游景点和游玩建议") ] # 初始化对话记忆 memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
四、 组装 Agent 并运行交互
最后,我们将 LLM、工具和记忆注入到
initialize_agent 中,选择 CHAT_CONVERSATIONAL_REACT_DESCRIPTION 类型以支持多轮对话。开启 verbose=True from langchain.agents import initialize_agent, AgentType agent = initialize_agent( tools=tools, llm=llm, agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, memory=memory, verbose=True, handle_parsing_errors=True, max_iterations=5 ) # 简单的交互循环 while True: user_input = input("\n 你: ") if user_input.lower() in ['exit', 'quit']: break response = agent.invoke({"input": user_input}) print(f"\n Agent: {response['output']}")
五、 运行效果与原理剖析
当我们在终端输入“我要去三亚旅行”时,Agent 的执行日志会清晰地展示其内部逻辑:
- Thought: 用户想去三亚,我需要先查询机票信息。
- Action: 调用
FlightSearch,输入“三亚”。 - Observation: 获取到机票价格信息。
- Final Answer: 整合信息,回复用户。
紧接着,当我们追问“有哪些景点”时,得益于
Memory 组件,Agent 能够自动补全上下文,理解用户是在询问“三亚”的景点,从而精准调用 AttractionSearch 工具。六、 总结与展望
通过上述步骤,我们成功构建了一个具备基本规划能力的 AI Agent。这个 Demo 展示了 LangChain 强大的编排能力:它将非结构化的自然语言转化为结构化的工具调用,并结合上下文记忆,实现了接近真人的交互体验。
在实际的生产环境中,我们可以将模拟的
search_flights 替换为真实的携程或飞猪 API,将 Memory 替换为基于 Redis 或向量数据库的持久化存储,从而打造出一个真正可用的商业级旅行助手。
浙公网安备 33010602011771号