35 KiB
35 KiB
In [1]:
import os
from dotenv import load_dotenv
from langgraph.graph import StateGraph, START, END, MessagesState
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
load_dotenv()
# 初始化 LLM
llm = ChatOpenAI(
model="MiniMax-M2.7-highspeed",
openai_api_key="sk-8d657b8b7efe0cb6c141a30d9cee97f726efb9b18ea72bb1e8cfb080b42c140d",
openai_api_base="https://console.pivotbak.cfd/v1",
temperature=0.5
)
# 路由函数
def classify_intent(state: MessagesState) -> str:
"""根据用户意图路由到不同的 Agent"""
last_message = state["messages"][-1]
content = last_message.content.lower()
if "天气" in content or "温度" in content:
return "weather_agent"
elif "代码" in content or "编程" in content:
return "code_agent"
elif "再见" in content or "退出" in content:
return "farewell"
else:
return "general_agent"
# 定义各个 Agent 节点
def router_node(state: MessagesState) -> dict:
"""路由节点:不做处理,只用于触发路由判断"""
return {}
def weather_node(state: MessagesState) -> dict:
"""天气 Agent"""
response = llm.invoke([
SystemMessage(content="你是一个天气助手,友好地回答天气相关问题。如果没有实时数据,可以给出一般性建议。"),
*state["messages"]
])
return {"messages": [response]}
def code_node(state: MessagesState) -> dict:
"""代码 Agent"""
response = llm.invoke([
SystemMessage(content="你是一个编程助手,擅长解答代码问题并给出清晰的代码示例。"),
*state["messages"]
])
return {"messages": [response]}
def general_node(state: MessagesState) -> dict:
"""通用 Agent"""
response = llm.invoke([
SystemMessage(content="你是一个友善的 AI 助手,可以回答各种问题。"),
*state["messages"]
])
return {"messages": [response]}
def farewell_node(state: MessagesState) -> dict:
"""告别节点"""
return {"messages": [{"role": "assistant", "content": "再见!期待下次与你交流。"}]}
# 构建图
builder = StateGraph(MessagesState)
# 添加节点
builder.add_node("router", router_node)
builder.add_node("weather_agent", weather_node)
builder.add_node("code_agent", code_node)
builder.add_node("general_agent", general_node)
builder.add_node("farewell", farewell_node)
# 添加边
builder.add_edge(START, "router")
builder.add_conditional_edges(
"router",
classify_intent,
{
"weather_agent": "weather_agent",
"code_agent": "code_agent",
"general_agent": "general_agent",
"farewell": "farewell",
}
)
# 所有 agent 节点处理完后结束
for node in ["weather_agent", "code_agent", "general_agent", "farewell"]:
builder.add_edge(node, END)
# 编译图
graph = builder.compile()
# 测试不同意图
test_inputs = [
"北京今天天气怎么样?",
"帮我写一个 Python 快速排序",
"你好,介绍一下你自己",
"再见啦!"
]
for user_input in test_inputs:
print(f"\n用户: {user_input}")
result = graph.invoke({"messages": [HumanMessage(content=user_input)]})
print(f"助手: {result['messages'][-1].content[:100]}...")
print("-" * 50)用户: 北京今天天气怎么样?
助手: 您好!很抱歉,我无法获取实时的天气数据,因此无法告诉您北京今天的具体天气情况。
建议您可以通过以下方式查询北京今天的天气:
1. **手机天气应用** - 如墨迹天气、天气通等
2. **搜索引擎...
--------------------------------------------------
用户: 帮我写一个 Python 快速排序
助手: # Python 快速排序实现
## 方法一:原地排序(经典版本)
```python
def quick_sort(arr, left, right):
"""原地快速排序"""
...
--------------------------------------------------
用户: 你好,介绍一下你自己
助手: 你好!我是 MiniMax AI,一个由 MiniMax 公司开发的人工智能助手。
我可以帮助你:
- 回答各种问题
- 进行对话和交流
- 协助写作、编程、翻译等任务
- 提供信息和知识
有什...
--------------------------------------------------
用户: 再见啦!
助手: 再见!期待下次与你交流。...
--------------------------------------------------
In [3]:
from IPython.display import Image
Image(graph.get_graph().draw_mermaid_png())Out [3]: