人轨书途 2025-03-31 21:05 采纳率: 0%
浏览 6

使用LlamaIndex构建Agent时遇到的问题


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写得很清楚了),而是只执行了最前面的第一个工具就不执行下去了

img

img


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

  • 写回答

5条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-03-31 21:35
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 代码片段看起来是在尝试使用LlamaIndex库构建一个Agent,但代码不完整。缺少具体的函数定义、导入其他必要的模块以及完整的Agent构建逻辑等部分。
    2. 解决方案
      - 首先,需要完整地导入所有必要的模块。例如,如果要使用FunctionToolReActAgent,假设已经安装了llama_index库,完整的导入可能如下:
      python from llama_index import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.tools import FunctionTool from llama_index.core.agent import ReActAgent
      - 然后,定义一个示例函数来作为FunctionTool的一部分。比如:
      ```python
      def example_function(input_str):
      return f”你输入的是: {input_str}”

    function_tool = FunctionTool.from_defaults(
    name=”example_function”,
    fn=example_function
    )
    - 接着,创建一个`VectorStoreIndex`并加载数据(如果有数据的话):python
    documents = SimpleDirectoryReader(‘data’).load_data()
    index = VectorStoreIndex(documents)
    - 最后,构建`ReActAgent`:python
    agent = ReActAgent.from_tools([function_tool], index=index)
    - 要使用这个Agent,可以进行如下查询:python
    response = agent.query(“调用example_function函数,输入一些内容”)
    print(response)
    `` 3. **多种解决方案及优缺点**: - **使用默认设置**: - **优点**:简单直接,按照LlamaIndex的基本使用方式构建Agent,容易理解和上手。 - **缺点**:功能相对有限,对于复杂的任务场景可能无法很好地适应。 - **自定义函数和工具**: - **优点**:可以根据具体需求定制各种函数和工具,使Agent能够处理更复杂和多样化的任务。 - **缺点**:开发成本较高,需要深入理解LlamaIndex的机制以及业务需求,开发和调试难度较大。 4. **总结**: - 构建基于LlamaIndex`的Agent,首先要确保正确导入所有必要的模块,然后定义合适的函数工具,接着创建索引并加载数据,最后构建Agent并进行查询。根据任务需求选择合适的构建方式可以提高Agent的适用性和效率。

    请注意,以上代码是基于常见的LlamaIndex使用场景编写的示例,实际应用中可能需要根据具体的数据、任务和需求进行调整。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月31日