01.txt 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from langchain.tools import tool
  2. from langchain_openai import ChatOpenAI
  3. from langchain.agents import create_agent
  4. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
  5. import requests
  6. # ─── 第一步:定义工具 ───
  7. @tool(description="执行MySQL查询")
  8. def get_sql(user_query: str) -> str:
  9. result = sql_agent.invoke({"messages": [{"role": "user", "content": user_query}]})
  10. return result["messages"][-1].content
  11. @tool(description="图标分析")
  12. def get_visualization(user_query: str) ->int:
  13. result = visualization_agent.invoke({"messages": [{"role": "user", "content": user_query}]})
  14. return result["messages"][-1].content
  15. tools = [get_sql, get_visualization]
  16. # ─── 第三步:创建 Agent ───
  17. # create_agent 把模型、工具、prompt 组装成 Agent
  18. agent = create_agent(
  19. model=llm,
  20. tools=tools,
  21. system_prompt="你是一名智能助手,可以调用工具帮助用户解决问题。"
  22. )
  23. # ─── 第四步:使用 ───
  24. res = agent.invoke({"messages": [
  25. {"role": "user",
  26. "content": "查询数据库中订单表获取数据"
  27. }]})
  28. print(res['messages'][-1].content)
  29. print(res)
  30. 订单表(`orders`)的数据已成功获取!该表共有 **5 条订单记录**,主要信息如下:
  31. | 订单ID | 员工ID | 产品ID | 数量 | 订单日期 |
  32. |--------|--------|--------|------|----------|
  33. | 1 | 1 | 1 | 2 | 2024-01-15 |
  34. | 2 | 2 | 2 | 15 | 2024-01-16 |
  35. | 3 | 3 | 1 | 10 | 2024-01-17 |
  36. | 4 | 5 | 3 | 6 | 2024-01-18 |
  37. | 5 | 2 | 4 | 5 | 2024-01-19 |
  38. **简要分析:**
  39. - 订单日期集中在 **2024年1月15日-19日**
  40. - 员工ID为 **2** 的员工成交了2笔订单,是成交最活跃的员工
  41. - 产品ID为 **1** 的产品被订购了2次,较受欢迎
  42. - 单笔订购数量在 **2~15** 之间,平均约 **7.6** 件
  43. 如果您还需要:
  44. - 关联查询员工姓名和产品名称
  45. - 按日期/员工/产品做统计分析
  46. - 生成可视化图表
  47. 请随时告诉我!
  48. {'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': {}})]}