LangGraph实战:用通义千问Qwen-Turbo打造你的第一个Agent(附完整代码)
LangGraph实战用通义千问Qwen-Turbo打造你的第一个Agent附完整代码第一次接触LangGraph和Agent概念时最让人头疼的往往不是技术本身而是如何快速搭建一个能实际运行的智能体。本文将带你从零开始用国内开发者可轻松访问的通义千问Qwen-Turbo模型构建一个能调用工具查询信息的实用Agent。无需纠结同步异步的理论细节我们先做出一个能跑起来的完整Demo。1. 环境准备与基础配置在开始编码前我们需要准备好Python环境和必要的依赖库。推荐使用Python 3.8以上版本并创建一个干净的虚拟环境python -m venv langgraph-env source langgraph-env/bin/activate # Linux/Mac # 或者 langgraph-env\Scripts\activate # Windows安装核心依赖库pip install langgraph langchain-community dashscope为什么选择通义千问Qwen-Turbo相比需要特殊网络访问的国外模型Qwen-Turbo有三大优势国内直接可用无需额外配置响应速度快适合快速迭代免费额度充足学习成本低2. 构建第一个工具调用Agent让我们从一个简单的保险信息查询工具开始。这个Agent将能回答关于工商银行保险产品的询问。首先创建icbc_agent.py文件写入以下基础代码from langgraph.prebuilt import create_react_agent from langchain_community.chat_models.tongyi import ChatTongyi # 初始化通义千问模型 llm ChatTongyi( modelqwen-turbo, temperature0.7, # 控制创造性0-1之间 verboseTrue # 显示详细日志 ) # 定义工具函数 - 查询工商银行保险信息 def get_icbc_info(city: str) - str: 根据城市查询工商银行合作保险信息 if 杭州 in city: return 工银安盛人寿保险有限公司杭州分公司 elif 北京 in city: return 工银安盛人寿保险有限公司北京分公司 else: return 工银安盛人寿保险有限公司提示工具函数的文档字符串非常重要LangGraph会用它来指导模型何时调用此工具。接下来构建Agent并测试基本功能# 创建Agent agent create_react_agent( modelllm, tools[get_icbc_info] # 传入工具列表 ) # 同步调用测试 response agent.invoke({ messages: [{ role: user, content: 杭州工商银行合作的保险公司是哪家 }] }) print(response[messages][-1][content])运行后会看到类似输出根据查询结果杭州工商银行合作的保险公司是工银安盛人寿保险有限公司杭州分公司。3. 增强Agent的交互能力基础版只能回答固定问题我们通过以下改进让它更智能3.1 添加多轮对话记忆修改Agent初始化代码from langgraph.memory import ConversationBufferMemory memory ConversationBufferMemory() agent create_react_agent( modelllm, tools[get_icbc_info], memorymemory # 添加记忆组件 )3.2 支持更自然的提问方式测试这样的交互response agent.invoke({ messages: [{ role: user, content: 我在杭州想了解工行的保险合作方 }] })3.3 添加参数验证增强工具函数的健壮性from pydantic import Field def get_icbc_info(city: str Field(..., description需要查询的城市名称)) - str: 根据城市查询工商银行合作保险信息 city city.replace(市, ).strip() # 规范化输入 # 其余逻辑不变...4. 部署与实用技巧完成开发后你可能想将Agent部署为API服务。以下是使用FastAPI的示例from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app FastAPI() app.add_middleware( CORSMiddleware, allow_origins[*], allow_methods[*], ) app.post(/ask) async def ask_agent(query: str): response agent.invoke({ messages: [{ role: user, content: query }] }) return {response: response[messages][-1][content]}启动服务uvicorn icbc_agent:app --reload性能优化技巧对于高并发场景使用await agent.ainvoke()异步调用设置合理的递归限制防止无限循环agent agent.with_config(recursion_limit10)启用流式响应提升用户体验for chunk in agent.stream(inputs): print(chunk) # 实时处理每个片段5. 扩展应用场景这个基础框架可以轻松扩展到其他领域5.1 电商客服Agentdef query_order(order_id: str) - dict: 查询订单状态 return {status: 已发货, tracking: SF123456789} def cancel_order(order_id: str) - bool: 取消订单 return True ecommerce_agent create_react_agent( modelllm, tools[query_order, cancel_order] )5.2 技术支持Agentdef search_kb(keywords: str) - list: 搜索知识库文章 return [文章1, 文章2] def create_ticket(title: str, desc: str) - str: 创建工单 return TICKET-12345 support_agent create_react_agent( modelllm, tools[search_kb, create_ticket] )在实际项目中我发现最影响Agent表现的不是模型选择而是工具函数的设计质量。好的工具应该有清晰准确的文档字符串处理各种边界情况返回结构化的数据包含参数验证