大模型调用多个工具

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': {}})]

相关推荐
circuitsosk1 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
kobe_OKOK_7 小时前
DRF接口幂等操作
python·django
廿士8 小时前
python脚本使用相关
python
青 春 记 忆8 小时前
零基础入门python19:Flask账本第一步——应用工厂、蓝图和健康检查
python·flask·后端开发
朦胧之8 小时前
Python 后端核心知识
python
denggun123458 小时前
yield
前端·数据库·python
zx_7414848110 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python
招财小梗10 小时前
沈阳商贸公司AI企业服务优势几何?
大数据·人工智能·python
ZISHU_98711 小时前
用 TLabel 给 SynTouch BioTac 数据做语义标注:从原始信号到结构化标注
开发语言·人工智能·python·数据·机器人触觉
m0_6174939412 小时前
SSLError [ASN1: NOT_ENOUGH_DATA] 问题排查与解决指南
python·ssl