from llama_index.core.tools import FunctionTool
from llama_index.core.agent import ReActAgent
from llama_index.llms.ollama import Ollama
# from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core import Settings
from llama_index.core.llms import ChatMessage,MessageRole
from llama_index.llms.openrouter import OpenRouter
from llama_index.llms.openai import OpenAI
import openai
api_key = "xxxxxxxxxxxxxxx"
llm = OpenRouter(
api_key=api_key,
api_base="https://openrouter.ai/api/v1", # 中转API地址
context_window=4096,
model="deepseek/deepseek-chat-v3-0324:free",
)
# base_url='http://localhost:11434'
# Settings.llm = Ollama(model="qwen2.5", request_timeout=360.0,base_url=base_url)
# Settings.embed_model = OllamaEmbedding(model_name="quentinz/bge-large-zh-v1.5:latest",base_url=base_url)
# 历史记录
chat_history=[ChatMessage(
role=MessageRole.SYSTEM,
content='''你是一名专业的理财计算助手,名字叫小旅。你需要按照以下步骤为客户处理财务计算:
1. 使用add工具计算总收入(例如:工资收入 + 其他收入)
2. 使用minus工具计算实际支出(总收入 - 支出)
3. 使用tax工具计算需要缴纳的税费(基于总收入)
4. 使用save工具将信息保存到文件(包括:总收入、总支出、税后金额)
请在每一步操作后说明计算结果,并在最后总结所有信息。'''
)]
def multiply(a: float, b: float) -> float:
"""Multiply two numbers and returns the product"""
print('-'*100)
return a * b
multiply_tool = FunctionTool.from_defaults(
fn=multiply,
description="乘法计算工具:用于计算两个数字的乘积。例如:计算月收入 = 日收入 * 工作天数",
return_direct=True
)
def minus(a: float, b: float) -> float:
"""Multiply two numbers and returns the product"""
print('-'*100)
return float(a) - float(b)
minus_tool = FunctionTool.from_defaults(
fn=minus,
description="减法计算工具:用于计算两个数字的差。例如:实际收入 = 总收入 - 支出",
return_direct=True
)
def add(a: float, b: float) -> float:
"""Add two numbers and returns the sum"""
print('-'*100)
return a + b
add_tool = FunctionTool.from_defaults(
fn=add,
description="加法计算工具:用于计算两个数字的和。例如:总收入 = 工资收入 + 其他收入",
return_direct=True
)
def tax(income: float) ->float:
"""calculate the tax"""
print('-'*100)
return income*0.25
tax_tool = FunctionTool.from_defaults(
fn=tax,
description="税费计算工具:计算需要缴纳的税费(税率为25%)。输入总收入,返回应缴税费。",
return_direct=True
)
def save(income: float, outcome: float, total: float) -> str:
from openpyxl import Workbook, load_workbook
import os
filename = 'test.xlsm'
# 定义表头(中文)
headers = ["收入", "支出", "总计"]
# 检查文件是否存在
if os.path.exists(filename):
# 如果文件存在,加载现有的工作簿
workbook = load_workbook(filename)
sheet = workbook.active
else:
# 如果文件不存在,创建一个新的工作簿并写入表头
workbook = Workbook()
sheet = workbook.active
sheet.append(headers) # 写入表头
# 写入数据行
sheet.append([income, outcome, total])
# 保存工作簿
workbook.save(filename)
print('-'*100)
print(f"数据已成功保存到 {filename}!")
return f"saved!"
save_tool = FunctionTool.from_defaults(
fn=save,
description="信息保存工具:将收入、支出和总计信息保存到文件。需要提供三个参数:总收入、总支出、税后金额。",
return_direct=True
)
tool = [multiply_tool, add_tool, tax_tool, minus_tool, save_tool]
# 创建代理
agent = ReActAgent.from_tools(llm=llm,tools=tool, verbose=True)
# response = agent.chat("我的工资是10000元,彩票意外中奖了8000元,又出去旅游花了600,我现在手上一共多少钱?使用工具实现")
# print('*************'*10)
# print(response.response)
# print('*************'*10)
# 更新聊天历史记录
# chat_history.append(ChatMessage(role=MessageRole.USER, content=response.response))
# 第二步:计算需要缴纳的税费
response_tax = agent.chat(
"我的工资是10000元,彩票意外中奖了8000元,又出去旅游花了600。请按照以下步骤处理:\n"
"1. 使用add工具计算总收入(工资 + 彩票)\n"
"2. 使用minus工具计算支出后的金额(总收入 - 旅游支出)\n"
"3. 使用tax工具计算需要缴纳的税费\n"
"4. 使用save工具保存信息到文件(总收入、旅游支出、税后金额)\n"
"请在每一步都告诉我计算结果。"
)
print('#############' * 10)
print(response_tax)
print('#############' * 10)
# chat_history.append(ChatMessage(role=MessageRole.USER, content=response.response))
# response_save = agent.chat(f"将上面得到的收入、支出以及总计信息保存到文件当中")
执行的代码如上,当我执行上述代码时agent并不像预想的那样一下子可以调用所有的工具(即使我的prompt写得很清楚了),而是只执行了最前面的第一个工具就不执行下去了


有没有人知道这是啥原因呀