__init__.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # !/usr/bin/ python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. @Project : lq-agent-api
  5. @File :__init__.py.py
  6. @IDE :PyCharm
  7. @Author :
  8. @Date :2025/7/10 16:30
  9. '''
  10. from langgraph.prebuilt import create_react_agent
  11. from langgraph.checkpoint.memory import MemorySaver
  12. from langchain_core.prompts import ChatPromptTemplate
  13. from langchain_core.messages import HumanMessage
  14. from logger.loggering import server_logger
  15. from utils.utils import get_models
  16. from function.function_call import FunctionCall
  17. from io import StringIO
  18. import sys
  19. class XiwuzcAgent:
  20. """
  21. Xiwuzc 智能助手+function call
  22. """
  23. def __init__(self):
  24. # 初始化
  25. self.init_agent()
  26. # 初始化 agent 对象
  27. def init_agent(self):
  28. # 获取部署的模型列表
  29. llm, chat, embed = get_models()
  30. self.llm = llm
  31. self.chat = chat
  32. # 初始化 工具列表
  33. function_call = FunctionCall()
  34. tools = [
  35. function_call.query_recently_cattle_farm_ambient_info,
  36. function_call.query_recently_cattle_temperature,
  37. function_call.query_recently_cattle_eat_water,
  38. ]
  39. # 创建系统Prompt提示语
  40. system_prompt = self.create_sys_prompt()
  41. prompt = ChatPromptTemplate.from_messages([
  42. ("system", system_prompt),
  43. ("placeholder", "{messages}"),
  44. ("placeholder", "{agent_scratchpad}")
  45. ])
  46. # 创建Agent
  47. self.agent_executor = create_react_agent(
  48. self.llm,
  49. tools=tools, #
  50. prompt=prompt,
  51. checkpointer=MemorySaver()
  52. )
  53. def handle_query(self, input_query, session_id):
  54. # 流式处理事件
  55. config = {"configurable": {"thread_id": session_id}}
  56. try:
  57. events = self.agent_executor.stream(
  58. {"messages": [HumanMessage(content=input_query)]},
  59. config=config,
  60. stream_mode="values",
  61. )
  62. result_list = []
  63. # 打印流式事件的消息
  64. for event in events:
  65. message = event["messages"][-1] # 取最后一步信息
  66. result_list.append(message.content)
  67. # 转换为字符串并写入日志文件
  68. log_content = self.get_pretty_message_str(message)
  69. server_logger.info("\n" + log_content.strip())
  70. final_result = event["messages"][-1].content if result_list else None
  71. server_logger.info("=" * 50)
  72. server_logger.info(f"最终结果: \n {final_result}")
  73. server_logger.info("=" * 50)
  74. return final_result
  75. except Exception as e:
  76. server_logger.error(f"处理查询时出错: {e}")
  77. raise e
  78. # agent 非流式输出
  79. def handle_invoke_query(self, input_query, session_id):
  80. config = {"configurable": {"thread_id": session_id}}
  81. try:
  82. result = self.agent_executor.invoke(
  83. {"messages": [HumanMessage(content=input_query)]},
  84. config=config,
  85. stream_mode="values",
  86. )
  87. server_logger.info(f"result={result}")
  88. for presult in result["messages"]:
  89. server_logger.info(f'【agent】: {presult}')
  90. server_logger.info("=" * 50)
  91. final_result_conent = result["messages"][-1].content
  92. server_logger.info(f"final_result_conent={final_result_conent}")
  93. return final_result_conent
  94. except Exception as e:
  95. server_logger.error(f"处理查询时出错: {e}")
  96. raise e
  97. def get_pretty_message_str(self, message):
  98. """
  99. 捕获 pretty_print() 输出为字符串
  100. """
  101. captured_output = StringIO()
  102. sys.stdout = captured_output
  103. server_logger.info(message.pretty_print())
  104. sys.stdout = sys.__stdout__
  105. return captured_output.getvalue()
  106. @staticmethod
  107. def create_sys_prompt():
  108. system_prompt = """
  109. 你是一个农业智能专家,请根据提供的数据信息和规则信息分析是否存在异常并进行建议。
  110. 请严格按照以下步骤操作:
  111. 1. 检查可用工具
  112. 2. 必要时调用工具获取数据
  113. 3. 结合数据进行分析
  114. 4. 给出专业建议
  115. 注意:
  116. - 必须通过工具获取最新数据后再分析
  117. - 保持回答专业且简洁
  118. """
  119. return system_prompt