Files
SmartVoyage/demo_agent/muiti_agent.py
liangfangxing 65baccba87 feat: demo
2026-03-19 19:28:48 +08:00

138 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate, \
HumanMessagePromptTemplate # 导入所有必需的 Prompt 类
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.output_parsers import StrOutputParser
from conf import settings
# 创建模型
llm = ChatOpenAI(
base_url=settings.base_url,
api_key=settings.api_key,
model=settings.model_name,
temperature=0.1
)
# 2.定义工具
# 2.1 计算工具
@tool
def multiply(a: int, b: int) -> int:
"""用于计算两个整数的乘积。
参数:
a (int): 第一个整数。
b (int): 第二个整数。
"""
print(f"\n[计算专家] -> 正在执行乘法: {a} * {b}")
return a * b
@tool
def add(a: int, b: int) -> int:
"""用于计算两个整数的和。
参数:
a (int): 第一个整数。
b (int): 第二个整数。
"""
print(f"\n[计算专家] -> 正在执行加法: {a} + {b}")
return a + b
# 2.2 信息查询工具
@tool
def search_weather(city: str) -> str:
"""用于查询指定城市的实时天气。"""
print(f"正在查询天气: {city}")
if "北京" in city:
return "北京今天是晴天气温25摄氏度。"
elif "上海" in city:
return "上海今天是阴天有小雨气温22摄氏度。"
else:
return f"抱歉,我没有'{city}'的天气信息。"
@tool
def get_current_date() -> str:
"""用于获取当前日期。"""
print("\n[信息专家] -> 正在获取当前日期...")
import datetime
return datetime.date.today().strftime("%Y年%m月%d")
# 3 创建两个独立的 Agent
# 3.1 创建“计算专家” Agent
math_tools = [multiply, add]
# 创建完整的 Tool Calling Prompt
# 这包括一个系统消息,一个用户消息占位符,以及一个 Agent 中间思考过程的占位符。
math_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个强大的数学计算专家,可以访问和使用各种数学工具。"),
HumanMessagePromptTemplate.from_template("{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建 math_Agent
math_agent = create_tool_calling_agent(llm, math_tools, math_prompt)
# 创建 math Agent Executor
math_executor = AgentExecutor(
agent=math_agent,
tools=math_tools,
verbose=True
)
# 3.2 创建“信息专家” Agent
info_tools = [search_weather, get_current_date]
# 手动创建完整的 Tool Calling Prompt
info_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个强大的信息查询专家,可以访问和使用各种查询工具。"),
HumanMessagePromptTemplate.from_template("{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建 info Agent
info_agent = create_tool_calling_agent(llm, info_tools, info_prompt)
# 创建 info Agent Executor
info_executor = AgentExecutor(
agent=info_agent,
tools=info_tools,
verbose=True
)
# 4.协调和总结工作流
def multi_agent_workflow(query: str, math_task: str, info_task: str):
print("--- 启动多智能体协作流程 ---")
print(f"\n用户原始请求: {query}")
# 4.1 让“计算专家”执行任务
print("\n[主程序] -> 将任务分配给计算专家...")
math_result = math_executor.invoke({"input": math_task}).get("output")
print(f"\n[主程序] -> 计算专家返回结果: {math_result}")
# 4.2 让“信息专家”执行任务
print("\n[主程序] -> 将任务分配给信息专家...")
info_result = info_executor.invoke({"input": info_task}).get("output")
print(f"\n[主程序] -> 信息专家返回结果: {info_result}")
# 4.3 使用 LLM 进行最终结果总结
print("\n[主程序] -> 使用大模型进行最终总结...")
summarize_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个善于总结和整合信息的助手。请根据以下信息,为用户原始请求生成一个完整的回答。"),
("human",
f"用户请求: {query}\n\n计算结果: {math_result}\n\n信息查询结果: {info_result}\n\n请整合以上信息,生成一个连贯的最终回答。")
])
summarize_chain = summarize_prompt | llm | StrOutputParser()
final_answer = summarize_chain.invoke({"query": query})
print("\n--- 协作流程已完成!---")
print(f"最终综合回答:\n{final_answer}")
return final_answer
if __name__ == "__main__":
# 定义用户原始请求和分配给每个Agent的子任务
original_query = "请先计算 25 乘以 4然后告诉我北京今天的天气和当前日期。"
math_task = "计算 25 乘以 4"
info_task = "查询北京今天的天气和当前日期"
# 启动工作流
multi_agent_workflow(original_query, math_task, info_task)