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