camel [功能请求] LLM的结构输出

tv6aics1  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(117)

所需先决条件

动机

当前的LLM(语言学习模型)输出往往是自由格式文本,这可能并不总是适用于所有应用。在需要结构化或特定格式输出的上下文中,用户发现很难调整LLM的输出。能够指定输出格式或类型可以增强LLM在各种应用中的集成,从数据分析到自然语言处理任务。

解决方案

解决方案:

  • 结构化输出格式:
  • 引入一个API参数,允许用户指定所需的输出格式。例如:output_format="JSON"
  • 在指定的格式中,允许分层结构。例如,如果输出预期为摘要,则可以如下所示:
{
   "title": "Summary Title",
   "points": ["point1", "point2", "point3"]
}
  • 输出类型:
  • 允许用户为输出指定类型。这可以是任何东西,从 numberstringsymbolemotion 等。
  • 例如,如果用户希望从一段文字中获取情感,他们可以将输出类型指定为 emotion ,LLM将返回 happysadangry 等。

替代方案

  1. 使用现有工具:有一些开源工具,如 OutlinesInstructor ,它们试图提供结构化输出。然而,将这些与LLM集成可能需要额外的努力,并且可能不是无缝的。
  2. 后处理:另一个选择是让用户根据需要对LLM输出进行后处理。然而,如果始终需要额外的处理,这将使强大的模型失去其目的。

其他上下文

在结构化数据的时代,获得可直接使用的信息的格式变得越来越重要。特别是在关系数据库、数据可视化工具或特定分析工具等应用中,具有LLM结构化输出可以大大减少数据处理和集成的时间。

fquxozlt

fquxozlt1#

我认为使用函数调用可以让LLM输出结构化输出。
我的初步想法是用户可以添加他们想要的具体结构,例如:

{
'Belief‘: ...
"Desire": ...
"Intention": ...}

并且他们需要描述每个部分需要输出的内容。例如:{"Belief": "what's your belief"}。同时,用户还需要指定何时需要结构化输出。最后,用户还需要指定哪个角色需要结构化输出。最终的输入可能是

{
    "assistant": [
        "when you need to help the task",
        {
            "Belief": "what's your Belief",
            "Desire": "what's your desire",
            "Intention": "what's your Intention"
        }
    ]
}

我们为角色扮演类添加一个接口,该接口发送此消息。然后助手将输出结构化输出。我们将在代理中构建一个函数调用。
我们将以如下格式构建参数:

{
    "type": "object",
    "properties": {
        "Believe": {
            "type": "string",
            "description": "What's your Believe?",
        },
        "Desire": {
            "type": "string",
            "description": "What do you desire?",
        },
        "Intention": {
            "type": "string",
            "description": "What's your Intention?",
        }
    },
    "required": ["Believe", "Desire", "Intention"],
}

然后我们将有以下函数调用:

money_call = OpenAIFunction(
    func=generate_text,
    name="generte_text",
    description="USER GIVEN",
    parameters=USER GIVEN,
)

可以使用以下方式生成generate_text函数:

def generate_function(strings):
    params = ', '.join(strings)
    
    dict_entries = ', '.join(f'"{s}": {s}' for s in strings)
    
    code = f"""
def generated_function({params}):
    return {{{dict_entries}}}
"""
    local_vars = {}
    exec(code, globals(), local_vars)
    
    return local_vars['generated_function']

通过这种方式,代理的输出可能是结构化的

ss2ws0br

ss2ws0br2#

太好了,@yitianlian!使用函数调用是与当前多代理系统所采用的方法不同的另一种方式。然而,我们需要推理来解释它为什么比多代理所做的事情更好。
此外,我不确定您是否考虑了问题描述中的"使用现有工具":"有一些开源工具,如OutlinesInstructor,它们试图提供结构化的输出。然而,将这些工具与LLM集成可能需要额外的努力,并且可能不会无缝衔接。"
因此,我认为类似的任务/问题已经被其他开源项目完成,您对此有何看法?我只是想避免重复造轮子。如果您无法做出决定,您可以询问@lightaime。谢谢。

ubof19bj

ubof19bj3#

我之前使用过工具Instructor来帮助我结构化模型的输出。在我看来,与函数调用相比,它有两个缺点:

  1. Instructor 需要特定的代理来结构化输出,因为这个工具是用来从提示中提取信息的。这可能会造成成本。
  2. 如果输入提示没有包含所有信息,它会抛出一个错误,这是不稳定的。
    关于Outlines,我没有使用过,抱歉。所以我会和@lightaime讨论一下。
rlcwz9us

rlcwz9us4#

好的,结论很好,期待你的进步:)

相关问题