agent.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from typing import Annotated
  2. from typing_extensions import TypedDict
  3. from langgraph.graph import StateGraph, START, END
  4. from langgraph.graph.message import add_messages
  5. import os
  6. from langchain.chat_models import init_chat_model
  7. from IPython.display import Image, display
  8. from tools import evaluation_extraction_tool
  9. from langgraph.prebuilt import ToolNode, tools_condition
  10. from langgraph.checkpoint.memory import InMemorySaver
  11. graph=None
  12. llm_with_tools=None
  13. os.environ["OPENAI_API_KEY"] = "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"
  14. os.environ["TAVILY_API_KEY"] = "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"
  15. prompt="""
  16. 你好!我是一个智能数据助手,专为协助您快速获取和分析评估信息而设计。
  17. ---
  18. ### 我的角色 (Role):
  19. 我将充当您的“评估报告检索专员”。当您需要了解特定主题的评估情况时,我将利用背后强大的【评估提取工具】(evaluation_extraction_tool) 来精确地从数据源中检索和整理相关评估报告、摘要或关键指标,并呈现给您。
  20. ---
  21. ### 您的目标 (Goal):
  22. 您的目标是:
  23. 1. 根据特定的主题(关键词)快速获取相关的评估报告、数据摘要或关键指标,以便您能深入了解某个方面(如产品表现、服务质量、市场反馈、项目评估等)的详细评估情况。
  24. 2. 为您的每次查询提供一个唯一的标识符,以便您能轻松追踪和管理您的请求,确保数据的可追溯性。
  25. ---
  26. ### 工作流 (Workflow):
  27. 为了实现您的目标,并确保我能准确有效地为您服务,我们需要遵循以下简单的交互流程:
  28. 1. **您提供输入:** 您需要向我提供两个关键信息:
  29. * **关键词 (`query_word`)**:这是我用来筛选和定位评估内容的依据。请提供您关注的具体主题或词语。
  30. * **例如:** `新功能A的用户反馈`, `客户满意度调查结果`, `Q3市场评估报告`
  31. * **请求ID (`request_id`)**:这是一个唯一的任务标识,用于区分您的每一次请求,方便后续查询和管理。
  32. * **例如:** `20231027-REP001`, `PROJ_X-EVAL-V2`, `SESSION-USER-XYZ`
  33. 2. **我解析并调用工具:** 一旦我接收到您的输入,我将立即解析您提供的关键词和请求ID。
  34. * 如果信息完整且格式正确,我将自动调用【评估提取工具】(evaluation_extraction_tool)。
  35. * 如果信息有误或缺失,我将提示您重新输入。
  36. 3. **我返回结果:** 【评估提取工具】执行完毕后,我将把提取到的评估摘要、链接或相关数据返回给您。
  37. ---
  38. ### 请您按照以下格式提供信息:
  39. {input}
  40. """
  41. class State(TypedDict):
  42. messages: Annotated[list, add_messages]
  43. name: str
  44. birthday: str
  45. def chatbot(state: State):
  46. message = llm_with_tools.invoke(state["messages"])
  47. # Because we will be interrupting during tool execution,
  48. # we disable parallel tool calling to avoid repeating any
  49. # tool invocations when we resume.
  50. assert len(message.tool_calls) <= 1
  51. return {"messages": [message]}
  52. def main():
  53. start("Can you look up when LangGraph was released? When you have the answer, use the human_assistance tool for review.")
  54. def execute_agent_with_api(user_input: str):
  55. global graph, llm_with_tools, prompt
  56. # 替换prompt中的{input}占位符为用户输入
  57. formatted_prompt = prompt.replace("{input}", user_input)
  58. # 如果graph或llm_with_tools未初始化,先初始化
  59. if graph is None or llm_with_tools is None:
  60. llm = init_chat_model("openai:gpt-4.1")
  61. tools = [evaluation_extraction_tool]
  62. llm_with_tools = llm.bind_tools(tools=tools)
  63. # 初始化图
  64. graph_builder = StateGraph(State)
  65. graph_builder.add_node("chatbot", chatbot)
  66. tool_node = ToolNode(tools=tools)
  67. graph_builder.add_node("tools", tool_node)
  68. graph_builder.add_conditional_edges(
  69. "chatbot",
  70. tools_condition,
  71. )
  72. graph_builder.add_edge("tools", "chatbot")
  73. graph_builder.add_edge(START, "chatbot")
  74. memory = InMemorySaver()
  75. graph = graph_builder.compile(checkpointer=memory)
  76. # 生成唯一的线程ID
  77. import uuid
  78. thread_id = str(uuid.uuid4())
  79. # 执行Agent并收集结果
  80. results = []
  81. config = {"configurable": {"thread_id": thread_id}}
  82. # 使用格式化后的prompt作为用户输入
  83. for event in graph.stream({"messages": [{"role": "user", "content": formatted_prompt}]}, config, stream_mode="values"):
  84. for value in event.values():
  85. # 保存消息内容
  86. if "messages" in event and len(event["messages"]) > 0:
  87. message = event["messages"][-1]
  88. results.append(message.content)
  89. # 返回结果
  90. return "\n".join(results) if results else "Agent执行完成,但没有返回结果"
  91. if __name__ == '__main__':
  92. main()