大模型调用多个工具

from langchain_openai import ChatOpenAI

from langchain_core.tools import tool

from langchain_core.messages import HumanMessage, AIMessage, ToolMessage

from init_llm import deepseek_llm

定义股票查询工具

@tool

def get_stock_price(company: str, timeframe: str = "today") -> str:

"""获取指定公司的股票价格信息

Args:

company: 公司名称(如:苹果公司, 微软公司, 谷歌公司)

timeframe: 时间范围(today-今日, week-本周, month-本月)

"""

模拟股票数据

mock_data = {

"苹果公司": {"today": 185.20, "week": 183.50, "month": 180.75},

"微软公司": {"today": 415.86, "week": 412.30, "month": 405.42},

"谷歌公司": {"today": 15.42, "week": 15.20, "month": 14.85}

}

if company in mock_data:

price = mock_datacompany.get(timeframe, "未知时间范围")

return f"{company} {timeframe}价格: {price}美元"

else:

return f"未找到股票代码 {company} 的数据"

定义新闻搜索工具

@tool

def search_news(company: str) -> str:

"""搜索指定公司的财经新闻

Args:

company: 公司名称

Return:

公司的财经新闻,每个新闻占一行

"""

模拟新闻数据

mock_news = {

"苹果公司": [

"苹果发布新款iPhone,股价上涨3%",

"苹果与欧盟达成反垄断和解协议",

"苹果将在印度扩大生产规模"

],

"微软公司": [

"微软Azure云业务季度增长超预期",

"微软完成对Nuance的收购",

"微软推出新一代AI助手Copilot"

],

"谷歌公司": [

"谷歌发布新AI模型,性能提升20%",

"谷歌与OpenAI合作,开发新的AI助手",

"谷歌在欧洲展开AI研究项目"

]

}

news_list = mock_news.get(company, f"未找到{company}的相关新闻")

return "\n".join(news_list)

1. 初始化模型并绑定工具

tools = get_stock_price, search_news

model_with_tools = deepseek_llm.bind_tools(tools)

message = \[\]

#human_message = HumanMessage(content="苹果公司今天的股价是多少?最近有什么新闻?")

human_message = HumanMessage(content="比较一下微软和苹果的股价")

#human_message = HumanMessage(content="腾讯最近有什么重大新闻?")

human_message = HumanMessage(content="海水为什么是咸的?")

message.append(human_message)

2. 工具调用

while True:

response = model_with_tools.invoke(message)

message.append(response)

如果有调用工具,处理工具调用响应

3.开发者根据模型的响应,调用工具并获取结果

if response.tool_calls:

for tool_call in response.tool_calls:

if tool_call"name" == "get_stock_price":

stock_result = get_stock_price.invoke(tool_call)

print("stock_result", stock_result)

message.append(stock_result)

if tool_call"name" == "search_financial_news":

news_result = search_news.invoke(tool_call)

print("news_result", news_result)

message.append(news_result)

else:

print("没有工具调用,直接返回答案")

break

print(message)

[HumanMessage(content='比较一下微软和苹果的股价', additional_kwargs={}, response_metadata={}),

AIMessage(content='我来帮你查询微软和苹果的股票价格信息。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 124, 'prompt_tokens': 410, 'total_tokens': 534, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 384}, 'prompt_cache_hit_tokens': 384, 'prompt_cache_miss_tokens': 26}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_8b330d02d0_prod0820_fp8_kvcache_20260402', 'id': 'eb47ca2a-3af3-43b7-91fa-0a2f7ca05a7e', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019e6979-41a4-7403-b875-88285ac2f716-0',

tool_calls=[

{'name': 'get_stock_price', 'args': {'company': '微软公司', 'timeframe': 'today'}, 'id': 'call_00_GLN3fxNaweLSYa6EBQc57191', 'type': 'tool_call'},

{'name': 'get_stock_price', 'args': {'company': '苹果公司', 'timeframe': 'today'}, 'id': 'call_01_idWsFLNdofWtrHquw6gh3359', 'type': 'tool_call'}], invalid_tool_calls=\[\], usage_metadata={'input_tokens': 410, 'output_tokens': 124, 'total_tokens': 534, 'input_token_details': {'cache_read': 384}, 'output_token_details': {}}),

ToolMessage(content='微软公司 today价格: 415.86美元', name='get_stock_price', tool_call_id='call_00_GLN3fxNaweLSYa6EBQc57191'),

ToolMessage(content='苹果公司 today价格: 185.2美元', name='get_stock_price', tool_call_id='call_01_idWsFLNdofWtrHquw6gh3359'),

AIMessage(content='好的,以下是微软和苹果今日股价的对比:\n\n---\n\n## 📊 微软 vs 苹果 股价对比\n\n| 公司 | 今日股价(美元) |\n|------|:--------------:|\n| **🟢 微软(Microsoft)** | **415.86\*\* \|\\n\| \*\*🍎 苹果(Apple)\*\* \| \*\*185.20** |\n\n### 对比分析:\n- **微软** 当前股价为 **415.86\*\*,远高于苹果的 \*\*185.20**,单价差距约为 **$230.66**。\n- 不过需要注意的是,股价高低并不直接代表公司价值大小,因为还要考虑总股本数量(市值 = 股价 × 总股本)。\n\n如果你想进一步了解它们的市值或近期新闻动态,也可以告诉我!😊', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 165, 'prompt_tokens': 573, 'total_tokens': 738, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 384}, 'prompt_cache_hit_tokens': 384, 'prompt_cache_miss_tokens': 189}, 'model_provider': 'deepseek', 'model_name': 'deepseek-v4-flash', 'system_fingerprint': 'fp_8b330d02d0_prod0820_fp8_kvcache_20260402', 'id': '86849b24-5baa-4603-a837-5f2b2af92b32', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019e6979-4932-7b00-9f9a-084788de16f1-0', tool_calls=\[\], invalid_tool_calls=\[\], usage_metadata={'input_tokens': 573, 'output_tokens': 165, 'total_tokens': 738, 'input_token_details': {'cache_read': 384}, 'output_token_details': {}})]

相关推荐
金銀銅鐵5 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li6 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
小九九的爸爸11 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学12 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
花酒锄作田1 天前
Pydantic校验配置文件
python
hboot1 天前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
ZhengEnCi2 天前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi2 天前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽2 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
用户8358086187912 天前
基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
python