138 lines
4.9 KiB
Python
138 lines
4.9 KiB
Python
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) |