from langchain.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import create_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder import requests # ─── 第一步:定义工具 ─── @tool(description="执行MySQL查询") def get_sql(user_query: str) -> str: result = sql_agent.invoke({"messages": [{"role": "user", "content": user_query}]}) return result["messages"][-1].content @tool(description="图标分析") def get_visualization(user_query: str) ->int: result = visualization_agent.invoke({"messages": [{"role": "user", "content": user_query}]}) return result["messages"][-1].content tools = [get_sql, get_visualization] # ─── 第三步:创建 Agent ─── # create_agent 把模型、工具、prompt 组装成 Agent agent = create_agent( model=llm, tools=tools, system_prompt="你是一名智能助手,可以调用工具帮助用户解决问题。" ) # ─── 第四步:使用 ─── res = agent.invoke({"messages": [ {"role": "user", "content": "查询数据库中订单表获取数据" }]}) print(res['messages'][-1].content) print(res) 订单表(`orders`)的数据已成功获取!该表共有 **5 条订单记录**,主要信息如下: | 订单ID | 员工ID | 产品ID | 数量 | 订单日期 | |--------|--------|--------|------|----------| | 1 | 1 | 1 | 2 | 2024-01-15 | | 2 | 2 | 2 | 15 | 2024-01-16 | | 3 | 3 | 1 | 10 | 2024-01-17 | | 4 | 5 | 3 | 6 | 2024-01-18 | | 5 | 2 | 4 | 5 | 2024-01-19 | **简要分析:** - 订单日期集中在 **2024年1月15日-19日** - 员工ID为 **2** 的员工成交了2笔订单,是成交最活跃的员工 - 产品ID为 **1** 的产品被订购了2次,较受欢迎 - 单笔订购数量在 **2~15** 之间,平均约 **7.6** 件 如果您还需要: - 关联查询员工姓名和产品名称 - 按日期/员工/产品做统计分析 - 生成可视化图表 请随时告诉我! {'messages': [HumanMessage(content='查询数据库中订单表获取数据', additional_kwargs={}, response_metadata={}, id='5018d350-69a7-461f-a25e-81de46191e76'), AIMessage(content='我来帮您查询数据库中的订单表。首先让我查看一下数据库中有哪些表,以确定订单表的准确名称。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 233, 'prompt_tokens': 93, 'total_tokens': 326, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'kimi-k2.6', 'system_fingerprint': None, 'id': 'chatcmpl-6a43cd857742efa77f5d842f', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019f18da-d5ba-7c61-90bf-604b1cd3e540-0', tool_calls=[{'name': 'get_sql', 'args': {'user_query': 'SHOW TABLES'}, 'id': 'get_sql:0', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 93, 'output_tokens': 233, 'total_tokens': 326, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='数据库中共有 **4 张表**:\n\n| 表名 |\n|------|\n| chat_history |\n| employees |\n| orders |\n| products |\n\n如需查看某张表的字段结构,可以告诉我表名,我可以进一步展示其 schema 和样例数据。', name='get_sql', id='36407194-2a91-4131-abbb-5540eda49306', tool_call_id='get_sql:0'), AIMessage(content='', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 55, 'prompt_tokens': 209, 'total_tokens': 264, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'kimi-k2.6', 'system_fingerprint': None, 'id': 'chatcmpl-6a43cd9be421f2a153f066a9', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019f18db-2ce7-7103-ad04-9929979f38d6-0', tool_calls=[{'name': 'get_sql', 'args': {'user_query': 'DESCRIBE orders'}, 'id': 'get_sql:1', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 209, 'output_tokens': 55, 'total_tokens': 264, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='**orders 表结构如下:**\n\n| 字段名 | 类型 | 约束说明 |\n|--------|------|----------|\n| `id` | INTEGER | 主键、自增、非空 |\n| `employee_id` | INTEGER | 非空,外键 → `employees(id)` |\n| `product_id` | INTEGER | 非空,外键 → `products(id)` |\n| `quantity` | INTEGER | 非空 |\n| `order_date` | DATE | 非空 |\n\n**业务含义:** \n该表记录销售订单数据,每笔订单关联一名员工(`employee_id`)和一款产品(`product_id`),并记录订购数量与日期。\n\n**示例数据(前3行):**\n- 订单 1:员工 1,产品 1,数量 2,日期 2024-01-15\n- 订单 2:员工 2,产品 2,数量 15,日期 2024-01-16\n- 订单 3:员工 3,产品 1,数量 10,日期 2024-01-17', name='get_sql', id='ccc3ef90-f458-4f12-b732-58608df97eb3', tool_call_id='get_sql:1'), AIMessage(content='', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 40, 'prompt_tokens': 483, 'total_tokens': 523, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'kimi-k2.6', 'system_fingerprint': None, 'id': 'chatcmpl-6a43cdaf35173be8151cddd2', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019f18db-7b3f-7022-81ca-ac83a18fb4ac-0', tool_calls=[{'name': 'get_sql', 'args': {'user_query': 'SELECT * FROM orders'}, 'id': 'get_sql:2', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 483, 'output_tokens': 40, 'total_tokens': 523, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='**查询结果:**\n\n`orders` 表共有 **5 条**订单记录,结构如下:\n\n| id | employee_id | product_id | quantity | order_date |\n|---|------------|-----------|---------|-----------|\n| 1 | 1 | 1 | 2 | 2024-01-15 |\n| 2 | 2 | 2 | 15 | 2024-01-16 |\n| 3 | 3 | 1 | 10 | 2024-01-17 |\n| 4 | 5 | 3 | 6 | 2024-01-18 |\n| 5 | 2 | 4 | 5 | 2024-01-19 |\n\n**业务洞察:**\n- 订单时间集中在 **2024年1月15日至19日**,共5天\n- **employee_id=2** 的员工成交了2笔订单(id 2和5),是订单量最多的员工\n- **product_id=1** 的产品被订购了2次(id 1和3),较受欢迎\n- 单笔订单数量在 **2~15** 之间,平均约 **7.6** 件', name='get_sql', id='4ffad403-292c-49dd-9b99-903d25c81c7b', tool_call_id='get_sql:2'), AIMessage(content='订单表(`orders`)的数据已成功获取!该表共有 **5 条订单记录**,主要信息如下:\n\n| 订单ID | 员工ID | 产品ID | 数量 | 订单日期 |\n|--------|--------|--------|------|----------|\n| 1 | 1 | 1 | 2 | 2024-01-15 |\n| 2 | 2 | 2 | 15 | 2024-01-16 |\n| 3 | 3 | 1 | 10 | 2024-01-17 |\n| 4 | 5 | 3 | 6 | 2024-01-18 |\n| 5 | 2 | 4 | 5 | 2024-01-19 |\n\n**简要分析:**\n- 订单日期集中在 **2024年1月15日-19日**\n- 员工ID为 **2** 的员工成交了2笔订单,是成交最活跃的员工\n- 产品ID为 **1** 的产品被订购了2次,较受欢迎\n- 单笔订购数量在 **2~15** 之间,平均约 **7.6** 件\n\n如果您还需要:\n- 关联查询员工姓名和产品名称\n- 按日期/员工/产品做统计分析\n- 生成可视化图表\n\n请随时告诉我!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 331, 'prompt_tokens': 768, 'total_tokens': 1099, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 256}, 'cached_tokens': 256}, 'model_provider': 'openai', 'model_name': 'kimi-k2.6', 'system_fingerprint': None, 'id': 'chatcmpl-6a43cded07eee87de940d71d', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019f18dc-6d72-7342-bcf4-08616a069e2a-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 768, 'output_tokens': 331, 'total_tokens': 1099, 'input_token_details': {'cache_read': 256}, 'output_token_details': {}})]}