MartialBE / one-api

OpenAI 接口管理 & 分发系统,改自songquanpeng/one-api。支持更多模型,加入统计页面,完善非openai模型的函数调用。
https://one-api-martialbe.vercel.app/
Apache License 2.0
814 stars 166 forks source link

gemini的函数调用是不是有bug?? #197

Closed jqlts1 closed 1 month ago

jqlts1 commented 1 month ago

例行检查

问题描述 gemini的函数调用似乎无法执行多步请求,比如

在Dify中

image

这里确实会调用一次函数,但是对于稍微复杂一点的问题,就无法执行了

我用官方api测试(openai官方,非中转)

image

可以看到,官方api可以成功的调用2次函数接口

在langchain中的代码测试

在代码中,用langchain也会出现类似的情况,以下是代码( 你可以直接运行测试 )

from langchain.tools import tool
from langchain_openai import ChatOpenAI

@tool
def add(a: int, b: int) -> int:
    """Adds a and b.

    Args:
        a: first int
        b: second int
    """
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """Multiplies a and b.

    Args:
        a: first int
        b: second int
    """
    return a * b

tools = [add, multiply]

llm = ChatOpenAI(
    openai_api_key="sk-x",xxxx
    base_url="https://xxxxxx/v1",
    model="gemini-1.5-flash-latest",
)

# 给llm绑定好工具
llm_with_tools = llm.bind_tools(tools)
query = "3 * 12是多少?然后11 + 49又是多少?"

llm_with_tools.invoke(query).tool_calls

返回的结果如下: ( 也就是只能执行一次 )

image

上面的代码,用官方api(非中转)测试的结果

image

这里可以很明显的看出来,是调用了2次

是不是你在那个for循环的时候,提前返回了?

MartialBE commented 1 month ago

我觉得更多是 gemini-1.5-flash-latest 模型的问题,我在测试中 它的函数调用能力确实没有3.5好


image
jqlts1 commented 1 month ago

我觉得更多是 gemini-1.5-flash-latest 模型的问题,我在测试中 它的函数调用能力确实没有3.5好


image

我在dify中发现也是这样,提示词写好是没问题。 但是在langchain中,似乎最多只能计算一个步骤?我测了很多提示词好像结果都差不多

MartialBE commented 1 month ago

我编写了提示词,gemini-1.5-flash-latest始终只能调用2次函数,第三次死活调用不了

iShot_2024-05-20_02 41 40 iShot_2024-05-20_02 42 08 iShot_2024-05-20_02 46 50
MartialBE commented 1 month ago

昨天在测试lobe-chat的时候就发现了,问他热门视频,其他模型都回答出具体的视频,只有它回答的分类 LobeChat_随便聊聊_2024-05-18 (1)

jqlts1 commented 1 month ago

昨天在测试lobe-chat的时候就发现了,问他热门视频,其他模型都回答出具体的视频,只有它回答的分类 LobeChat_随便聊聊_2024-05-18 (1)

你可以用我那段代码在langchain跑一下吗,因为好像在langchain中,似乎不管怎么做,他都只会调用一次,我用pro也是一样的

MartialBE commented 1 month ago
  1. OpenAI可以一次性调用多个函数,也就是,你调用一次接口,OpenAI会在tool_calls中返回多个函数。
  2. gemini只会一次调用返回一个函数。也就是,你调用一次接口,gemini会在tool_calls中返回一个函数。 你使用langchainbind_tools调用,是只会请求一次接口,这就是为什么OpenAI会一次性执行多个函数,而gemini只会执行一个函数。

如果你要完善函数调用,你应该写一个完整的agent,将函数调用结果返回给模型,模型会判断是否需要调用下一次函数还是直接返回结果。

MartialBE commented 1 month ago

emmmmm, 刚刚测试了geminifunctionCall 现在可以返回多个函数了。 我改一下~

jqlts1 commented 1 month ago

emmmmm, 刚刚测试了geminifunctionCall 现在可以返回多个函数了。 我改一下~

谢谢你重视这个问题,辛苦了刚请你喝杯咖啡....

jqlts1 commented 1 month ago

emmmmm, 刚刚测试了geminifunctionCall 现在可以返回多个函数了。 我改一下~

最新版的dev可以测了吗?

MartialBE commented 1 month ago

可以了。试试dev

jqlts1 commented 1 month ago

可以了。试试dev

刚测了,新版和旧版的gemini都不能用了... 我的key确定是没有问题,也在newapi和oneapi都测了,都没问题 不确定是不是没兼容好?

MartialBE commented 1 month ago

不能用?用的什么? 有报错吗?

MartialBE commented 1 month ago

我测试了 lobe dify LangChain 都可以执行