前言

Function Calling 是 OpenAI 首先提出来的一个非常有用的功能,实现了大模型对函数的调用能力。Byzer-LLM 给开源模型也带来了 Function Calling 实现。 

在这个基础上,我们还拓展了 Respond With Class 功能,允许大模型输出标准的Python对象,进步控制了大模型的输出能力。

这两个能力参看:

给开源大模型带来Function Calling、 Respond With Class

今天,我们又给大家隆重推出一个新能力:Function Implementation

编程思想的变化

其实大模型带来了很多理念上的变化。比如当我们写一个函数时,一般越通用越好,最好是能解决一大类问题。但是随着大模型的代码能力不断提升,让大模型生成代码,实际上这个代码是越不通用,越好。

什么意思呢,我来举个例子:7-2 等于多少?程序员的实现是:

def sub(a,b):
    return a-b

这种就是通用实现,7-2 可以用这个, 100-30 也可以用这个函数。那如果不通用的应该怎么实现呢?可以是这样:

def sub():
   return 7-2

也就是说,根据用户的问题,生成一个函数,这个函数只解决当前用户这个问题,执行完就废弃掉。

根据这个思路,Byzer-LLM 给大家带来了 Function Implementation 功能。

Function Implementation

举个例子,我想解决关于时间的一个问题,用户任意复杂的时间提问,都可以转化成一个时间区间。

用户的各种花式时间区间表达:
    去年三月到四月
    去年三月到今年四月
    三月份15号到18号
    昨天
    明天
    最近六个月

上面是我给模型的输入,我希望输出下面一个对象:

class TimeRange(pydantic.BaseModel):
    '''
    时间区间
    格式需要如下: yyyy-MM-dd
    '''  
    
    start: str = pydantic.Field(...,description="开始时间.时间格式为 yyyy-MM-dd")
    end: str = pydantic.Field(...,description="截止时间.时间格式为 yyyy-MM-dd")

为了解决上面的问题,我定义了一个函数:

def calculate_time_range():
    '''
    计算时间区间,时间格式为 yyyy-MM-dd. 
    '''
    pass

这个函数的用户是为了实现计算时间区间,返回的值TimeRange。可以看到,我在函数里没有具体实现,也没有指定返回值。我们来看,如何让大模型完成这个函数,并且调用这个函数最后输出 TimeRange:

t = llm.chat_oai([{
    "content":"去年三月到七月",
    "role":"user"    
}],impl_func=calculate_time_range,
   response_class=TimeRange,
   execute_impl_func=True)

在上面的调用中,我们指定了用户的问题是去年三月到七月,我们指定大模型实现 calculate_time_range 方法,并且返回值必须是 TimeRange,并且将最后的执行结果直接返回。当上面的代码运行完成后,你可以通过下面的方式获取结果:

t[0].value
# start='2023-03-01' end='2023-07-31'

如果 value 为 None, 那么你可以通过

t[0].metadata.get("resason","")

获取具体的出错原因。

如果 calculate_time_range 需要额外接受一些参数,你可以按如下方式调用:

t = llm.chat_oai([{
    "content":"xxxxx",
    "role":"user"    
}],
impl_func=calculate_time_range,
impl_func_params={},
response_class=TimeRange,execute_impl_func=True)

我们额外通过 impl_func_params 可以传递一些参数给到这个函数。

当然,如果你不想看黑盒,也可以通过如下两条语句获得发送给模型和从模型得到的实际文本内容:

show_text(t[0].response.input)
show_text(t[0].response.output)

总结

通过 Byzer-LLM, 我们给开源模型和SaaS模型可以很方便的添加 Function Implementation功能,我们只要提供方法名称以及签名,包括最后需要返回的值的类型,以及简要描述函数的作用,以及给到用户的输入,即可让大模型帮助我们动态实现函数,并且给出一个Python对象输出。使得编程更加容易。

结合 Function Calling, Respond With Class 以及 Function Calling 功能,我相信,未来大模型会越来越易于和程序进行交互,或许我们的元编程大题就是大模型融合在我们的代码里,帮我们完成很多重要的实现。

最后,更多文档在这里:https://github.com/allwefantasy/byzer-llm?tab=readme-ov-file#Function-Implementation

Logo

更多推荐