首页 > 其他分享 >【6!使用本地大模型调用代码,根本就是一场骗局!】

【6!使用本地大模型调用代码,根本就是一场骗局!】

时间:2024-07-18 18:27:47浏览次数:14  
标签:调用 框架 骗局 AI 模型 根本就是 agent API gpt

通过大模型调用其他工具到底可不可行?ChatGPT 或许能轻松搞定一切,但同样的需求落在本地大模型上,恐怕就要打个问号了。 法国开发工程师 Emilien Lancelot 尝试了多款号称具备工具调用功能的 agent 框架,来看看本地大模型到底能不能完成任务,但结果就像他总结的“一无所获”。是什么让这位工程师失望了?

用 AutoGPT,得会点“糊弄学”

AutoGPT 是款貌似强大的框架,提供很酷的 CLI 外加 Flutter UI,能够通过浏览器创建 agent。其主要功能是处理用户的文档、音频、视频等本地内容。

但是……它主要依靠 ChatGPT 或其他专有大模型服务来完成繁重工作,至少给我们的感觉是如此。

我们必须“唬弄”AutoGPT 才能使用 Ollama 端点,让其误认为是 ChatGPT。

代码语言:javascript

## OPENAI_API_KEY - OpenAI API Key (Example: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
OPENAI_API_KEY="helloworld"

...

## OPENAI_API_BASE_URL - OpenAI API 的自定义 URL,可用于接入自定义后端。如果 USE_AZURE 为 true 则无效,注意留空以保留默认 url。
# 以下为示例内容:
OPENAI_API_BASE_URL=http://localhost:11434/v1

...

## SMART_LLM - 智能语言模型 (Default: gpt-4-turbo)
SMART_LLM=dolphin-mixtral:8x7b-v2.7-q4_K_M

## FAST_LLM - 快速语言模型 (Default: gpt-3.5-turbo)
FAST_LLM=mistral:latest

这样应该可以解决问题:

代码语言:javascript

./autogpt.sh run

value is not a valid enumeration member; permitted: 'text-embedding-ada-002', 'text-embedding-3-small', 'text-embedding-3-large', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-16k-0613', 'gpt-3.5-turbo-1106', 'gpt-3.5-turbo-0125', 'gpt-3.5-turbo', 'gpt-3.5-turbo-16k', 'gpt-4-0314', 'gpt-4-32k-0314', 'gpt-4-0613', 'gpt-4-32k-0613', 'gpt-4-1106-preview', 'gpt-4-1106-vision-preview', 'gpt-4-0125-preview', 'gpt-4-turbo-2024-04-09', 'gpt-4', 'gpt-4-32k', 'gpt-4-turbo', 'gpt-4-turbo-preview', 'gpt-4-vision-preview' (type=type_error.enum; enum_values=[<OpenAIModelName.EMBEDDING_v2: 'text-embedding-ada-002'>, <OpenAIModelName.EMBEDDING_v3_S: 'text-embedding-3-small'>, <OpenAIModelName.EMBEDDING_v3_L: 'text-embedding-3-large'>, <OpenAIModelName.GPT3_v1: 'gpt-3.5-turbo-0301'>, <OpenAIModelName.GPT3_v2: 'gpt-3.5-turbo-0613'>, <OpenAIModelName.GPT3_v2_16k: 'gpt-3.5-turbo-16k-0613'>, <OpenAIModelName.GPT3_v3: 'gpt-3.5-turbo-1106'>, <OpenAIModelName.GPT3_v4: 'gpt-3.5-turbo-0125'>, <OpenAIModelName.GPT3_ROLLING: 'gpt-3.5-turbo'>, <OpenAIModelName.GPT3_ROLLING_16k: 'gpt-3.5-turbo-16k'>, <OpenAIModelName.GPT4_v1: 'gpt-4-0314'>, <OpenAIModelName.GPT4_v1_32k: 'gpt-4-32k-0314'>, <OpenAIModelName.GPT4_v2: 'gpt-4-0613'>, <OpenAIModelName.GPT4_v2_32k: 'gpt-4-32k-0613'>, <OpenAIModelName.GPT4_v3: 'gpt-4-1106-preview'>, <OpenAIModelName.GPT4_v3_VISION: 'gpt-4-1106-vision-preview'>, <OpenAIModelName.GPT4_v4: 'gpt-4-0125-preview'>, <OpenAIModelName.GPT4_v5: 'gpt-4-turbo-2024-04-09'>, <OpenAIModelName.GPT4_ROLLING: 'gpt-4'>, <OpenAIModelName.GPT4_ROLLING_32k: 'gpt-4-32k'>, <OpenAIModelName.GPT4_TURBO: 'gpt-4-turbo'>, <OpenAIModelName.GPT4_TURBO_PREVIEW: 'gpt-4-turbo-preview'>, <OpenAIModelName.GPT4_VISION: 'gpt-4-vision-preview'>])

看来没那么好唬弄,模型名称要求必须为专有名称,例如“GPT4-turbo”或者以上列表中包含的其他名称。遗憾的是,我的模型命名不在其中。

现在看看能不能“伪造”一个合规模型名称,这里将名称设置为“GPT4-turbo”并再次运行。

代码语言:javascript

./autogpt.sh run
2024-05-19 16:03:01,937 ERROR  Invalid OpenAI API key! Please set your OpenAI API key in .env or as an environment variable.
2024-05-19 16:03:01,938 INFO  You can get your key from https://platform.openai.com/account/api-keys

这回我的 API key 没能过关。我尝试了多种不同 key,但仍然无法再进一步。

项目链接:https://github.com/Significant-Gravitas/AutoGPT

不过,奇怪的是,必要的配置文件设置现在显示“404”了。

实验小结

要想解决模型名称问题,我们可以在 Ollama 当中创建一个名为 GPT4-turbo 的自定义模型,但模型内容实际可以是任意本地模型。这单纯是在用重命名的方式唬弄 AutoGPT,但却无法解决 API key 错误。

另外需要强调的是,似乎可以在 AutoGPT 上照搬 OpenAI 模型提供的文件并删除所有不合规部分,但我不确定具体该怎么操作。

网上的相关文件 (https://github.com/Significant-Gravitas/AutoGPT/issues/6336#issuecomment-2119252849) 没有介绍使用本地模型的任何内容,也没有提到如何调用工具。

总之,我认为 AutoGPT 恐怕还没有准备好对接本地模型,只能等后续升级之后再做本地化应用尝试。

此外,网友 Wladastic 也在使用后评价道,“我没有任何本地模型可以完全与 Auto-GPT 配合使用,因为 GPT-4 可以保持上下文长度而不会过于关注它,但其他有效的模型确实过于关注给予 LLM 的提示。”

Wladastic 解释道,“我让它与 Mistral 7B AWQ、neural chat v3 AWQ 和其他模型一起运行。唯一的问题是,我必须从头开始编写自己的 Auto-GPT,因为 Auto-GPT 的提示对于本地 llms 来说太长且混乱。”

“它们有时会返回正确的提示,但有时会通过 Auto-GPT 专注于系统提示,因此它们会以“Hello,我正在使用命令 ask_user 与用户交谈,这是正确的吗?”,然后它会说“Hello,我能如何帮助你?”,大约 100 次,直到我取消它。”Wladastic 说道。

Wladastic 表示,“我目前使用 oobabooga text-generation-webui 的用例在添加 JSON 语法时效果最好。然后,它只能在非常基本的提示符和只有几个命令的情况下工作,否则它会不断生成新的命令,并开始产生幻觉、同时响应多个命令等等。”

太复杂的 LangChain

自从生成式 AI 浪潮爆发以来,Langchain 已经成为诸多项目的核心。而它之所以还没有成为客观标准,原因可能在于它的语法太过复杂,很多开发者没时间去学习和适应。

Langchain 提供的是一种相当晦涩的 Python 功能使用方式,很多经验丰富的开发者恐怕都弄不明白。举例来说:

代码语言:javascript

chain = prompt | model | outputparser
chain.invoke("Question.")

Python 的 LCEL 系统使用 pipes(「|」)将事物串连起来。具体在 Python 之内,就是通过覆盖 Python 的 or 方法来实现。换句话说,Langchain 会像在 C++ 那些覆盖掉运算符。

但我们真有必要这么折腾吗?这就留待各位自行判断了……

现在说说本地模型。

Langchain 提供 2 款插件:

  • Ollama chat: 允许用户与大模型对话。
  • Ollama-functions: 允许大模型通过特定输出格式回答问题。例如,假设我们希望自己的大模型以 JSON 或者 YAML 形式作答,则可定义自己期望的格式类型、键和值类型。

另外请注意“函数调用”功能!这纯纯就是 OpenAI 的恶搞,千万别被功能名称给蒙蔽了!它并不像大家想象中那样以“使用工具”的方式调用函数,而只是对大模型的输出做格式调整。

那么,工具调用(即在本地执行真实代码)到底可不可行?这个嘛……Ollama 插件不提供这项功能……

代码语言:javascript

@tool
def multiply(first_number: int, second_number: int):
    """Multiplies two numbers together."""
    return first_number * second_number

model = ChatOllama(model="mistral:latest")
model_with_tools = model.bind_tools([multiply]) # <== Binding tool here

这项操作的运行输出为:

代码语言:javascript

ChatOllama doesn't have a method bind_tools()

可以确定它办不到,咱们又被耍了……

实验小结

必须承认,我感觉有点失望。因为这套框架在为 CrewAI 等许多其他框架提供支持,所以我本以为它能跟本地工具良好集成。但事实证明,它做得并不好,这个复杂的烂摊子同样没办法帮我们解决核心需求。

缺少工具支持的 Rivet

靠谱的选手终于来了!虽然 Rivet 还很年轻,但前景光明、未来可期。

Rivet 用于创建复杂的 AI 代理和提示链,它是某种用于跟大模型交互的 IDE,使用画布创建执行图(DAG)。Rivet 能够在浏览器中运行,同时允许用户导出 DAG 并作为代码运行以增强软件功能。

Rivet 目前支持的大模型有:GPT-3.5、GPT-4、Claude 2、 Claude 3 系列、用于语音数据的 AssemblyAI LeMUR 框架等。

大伙看看,这界面太酷了,Rivet 还提供 Ollama 插件以支持本地使用。

请注意单击右上角的三个点并将执行器更改为“节点”,否则可能无法运行。

遗憾的是,我没有找到调用自定义工具的方法,而且 Rivet 的项目文档也不够完备。这个项目显然还需要进一步更新,但强烈建议大家关注。

实验总结

这软件很酷,免费而且开源。我喜欢它的画面系统设计,用起来感觉就像做对了的 LangGraph。

要让它真正发挥作用,还得配合工具调用。但如果各位已经拥有 ChatGPT 账户,那还犹豫什么,赶紧把 Rivet 用起来。

让人看不懂教程的 AutoGen

作为本份榜单中表现最好的方案之一,AutoGen 微软公司开源的多智能体(Mutiple Agents)应用开发框架,多智能体应用让不同的 Agent 之间相互交流沟通来解决问题。

我已经按说明走完了教程,必须承认……其中大部分步骤我都没搞明白!刚开始几页还可以,但情况很快陷入失控,我可能得借助 AI agent 框架才能理解这一切到底是怎么起效的。

但 Autogen 确实具备我们需要的一切,而且开箱即用支持 Ollama:

代码语言:javascript

code_writer_agent = ConversableAgent(
    "code_writer_agent",
    system_message=code_writer_system_message,
    llm_config={"config_list": 
      [{"model": "dolphin-mixtral:8x7b-v2.7-q4_K_M",
      "api_key": "hello world",
      "base_url": "http://127.0.0.1:11434/v1"}]},
    code_execution_config=False,
)

在我看来,Autogen 最棒的特性包括:

  • 动态生成代码并执行;
  • 调用工具(即调用我们的代码);
  • 支持人工输入。

但工具调用真能起效吗?

还是不行……必须调用大模型的 OpenAI 兼容工具才能实现这项功能,所以 Ollama + Mistral 的理想终究只是理想。但是,Autogen 的代码生成和执行功能都运行良好。另外需要注意,它不支持调用 LangChain 工具。

可供使用的聊天机制

  • 双模型聊天模式:允许两个大模型相互对话以完成任务

  • 按序对话:任务将按照您指定的顺序进行评估。

这就有点复杂了。涉及多轮对话中积累的上下文延续机制,的确是个难以理解的概念。为什么每项任务仍然表现成两个 agent 之间的对话?为什么是 A 对 B、A 对 C、A 对 D 和 A 对 E?为什么永远是从 A 开始?我实在是整不明白。

  • 群组对话:彻底无法理解了……

看这意思,好像是某个 agent 充当主脑,在其他各 agent 之间建立了某种层次结构。这个概念可能很有吸引力,但文档示例实在起不到帮助理解的作用。

它还支持最新的提示工程方式,例如:

  • ReAct:允许拆分操作并制定计划。之后它会尝试执行各个步骤,一旦出现问题,则会制定新的计划并重新开始。通过这样的方式,即可创建对于大模型具备语义含义的上下文,并帮助其专注于当前需要解决的任务。
  • Reflection:跟 ReAct 有点类似,但强调的是自己的输出。在“说话”之后,它会问自己“这个结果对吗?”而且自我迭代似乎确能提升答案质量。

与往常一样,所谓提升答案质量也就是减少幻觉,这正是当前困扰大语言模型的核心问题。

如果各位不想被代码吞没,也可以尝试下载 AutoGenStudio 软件,它能在不编写任何代码的前提下完成 agent 定义。这是一款有趣的软件,但并不能帮助我们真正掌握框架的核心功能。

实验小结

AutoGen 显然有着光明的未来。但因为是由微软开发而成,我们唯一担心的就是它可能会被最终抛弃、或者成为仅限跟 OpenAI 搭配使用的软件。

但哪怕是它,也仍然实现不了本地大模型的工具调用功能。

标签:调用,框架,骗局,AI,模型,根本就是,agent,API,gpt
From: https://blog.csdn.net/lhx17673139267/article/details/140529248

相关文章

  • GICV3中断控制器调用流程
    GICV3中断控制器初始化调用链/kernel/irq/handle.c:#ifdefCONFIG_GENERIC_IRQ_MULTI_HANDLERint__initset_handle_irq(void(*handle_irq)(structpt_regs*)){if(handle_arch_irq)return-EBUSY;handle_arch_irq=handle_irq;return0;}#en......
  • 通过调用视频分享页,企业的MES、ERP、OA等第三方应用软件轻松直接调取视频监控的实时视
    目录一、企业的管理系统软件为何要调用实时视频监控1、监控与反馈能够实时呈现2、数据一致性和准确性3、增强安全性4、优化生产流程5、提升决策支持能力二、企业的管理系统软件介绍1、ERP系统(1)定义(2)主要功能与特点(3)应用场景2、MES系统(1)定义(2)主要功能与特点(3)应......
  • JDK调用工具(三)
    1.OkHttp的拦截机制OkHttp的拦截机制运用了责任链设计模式,允许拦截器以链式方式工作,每个拦截器都可以处理请求和响应,并将请求或响应传递给链中的下一个拦截器。这种机制极大地增强了OkHttp的灵活性和可扩展性。具体来说,每个拦截器在OkHttp的请求/响应流程中扮演着“处理者”......
  • C#调用C++库,进行串口通信
    1、添加C++接口实现,将dll放置在运行路径下。dll文件下载:https://files.cnblogs.com/files/ZM191018/SerialPortLib.7z?t=1721271982&download=true[DllImport("SerialPortLib.dll",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.StdCall)]......
  • LangChain补充二:LCEL和Runnable更加方便的创建调用链
    https://www.alang.ai/langchain/101/lc05一:LCEL入门LangChain的设计围绕着让AI应用开发者能够方便地将多个流程连缀成一个AI应用的业务逻辑,包括Chain与Agent。每个流程都被封装成一个runnable(langchain_core.runnables),包括提示语模板、模型调用、输出解析器、工具......
  • 数据科学入门之关于jupyter notebook的基本使用及numpy数据库的基本调用(内含一些报错
    前言介绍一下数据科学  在IBM(国际商用机器公司)官网上对数据科学的解释是数据科学将数学和统计学、专业编程、高级分析,人工智能和机器学习与特定主题专业知识相结合,获取隐藏在组织数据中的切实可行的洞察。这些洞察可用于指导决策和战略规划。  关于数据科学,我十分喜......
  • Spring AOP当方法被内部调用时,增强逻辑失效问题原因及解决方案
    首先,这个问题本质原因和我之前写的这篇文章《Spring事务调用类自己方法失效解决办法和原因》是一样的,都是动态代理失效导致的。最近在开发中遇到了一个关于SpringAOP的问题。需求是统计某个方法的调用次数,我尝试使用SpringAOP来实现,但发现当方法被内部调用时,增强逻辑不生效。以......
  • Java开发手册中-锁并发-同步调用应该去考量锁的性能损耗-加锁与不加锁性能对比
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。Java中数据同步-synchronized关键字与Mointor(jconsole)的使用:https://blog.csdn.net/......
  • SAP中MR8M调用的BAPI是什么,如何使用?
    在SAP系统中,针对MR8M(通常与采购发票冲销相关)的操作,并没有直接命名为BAPI_MR8M的标准BAPI。然而,对于发票冲销这一功能,SAP提供了BAPI_INCOMINGINVOICE_CANCEL这一BAPI,它可以用于冲销传入的发票。BAPI_INCOMINGINVOICE_CANCEL的使用BAPI_INCOMINGINVOICE_CANCELBAPI是用于......
  • 易优CMS模板标签tags标签调用
    【基础用法】标签:tags描述:TAG调用用法:{eyou:tagssort='now'getall='0'loop='100'}<ahref='{$field.link}'>{$field.tag}</a>(文档数:{$field.total}){/eyou:tags}属性:aid=''文档ID,在内容页可以不设置该属性typeid=''栏......