直截了当:展示给我提示符。 [译]

直截了当:展示给我提示符。 [译]

💡 原文中文,约20400字,阅读约需49分钟。
📝

内容提要

这篇文章介绍了如何通过截获API调用来理解大语言模型的工作原理。作者使用了mitmproxy工具来拦截API请求,并通过示例展示了如何设置和操作。作者还提到了几个大语言模型的库,包括Langchain、SmartLLMChain、DSPy和Instructor,并对它们的工作原理进行了分析和评价。最后,作者强调了在使用这些工具时要注意理解提示内容的重要性。

🔎

延伸解读

为什么直接查看提示比依赖文档更有效

文章指出,许多大语言模型库通过自动重构或生成提示来优化输出,却鼓励用户不直接与提示交互。这导致用户难以理解工具实际发送给模型的内容。作者认为,提示是对工具操作的自然语言描述,是了解其工作方式的最快途径。通过截获API调用,用户无需深究文档或源代码,就能直观看到提示和调用次数,从而做出更明智的选择。

mitmproxy:轻量级拦截API调用的实用方案

文章推荐使用mitmproxy这一免费开源的HTTPS代理来记录API请求。配置步骤简单:安装后运行mitmweb启动交互界面,设置设备代理并安装CA证书,再通过环境变量将代理应用于特定Python程序。这种方法不依赖特定框架,适合初学者快速上手,能帮助用户直观监控和管理网络流量,避免修改源代码或寻找设置选项的麻烦。

从API调用看框架的隐藏成本与设计取舍

文章通过多个示例揭示,一些框架在实现功能时会产生大量API调用。例如,Langchain的LCEL批量处理实际发起五个独立请求,而非利用OpenAI的批量接口;SmartLLMChain为生成答案需四次调用;DSPy的快速入门示例运行超30分钟并发出数百次请求。这些设计可能增加成本和时间,用户应通过拦截调用评估其必要性,并考虑是否有更简洁的替代方案。

结构化输出与验证:不同库的实现差异

文章对比了Guardrails、Instructor等库处理结构化输出的方式。Guardrails通过XML架构和两次API调用(生成与修正)实现验证;Instructor则利用OpenAI的函数调用功能,一次调用即可提取结构化数据,作者认为其高效简洁。而某些验证示例需三次调用,作者质疑是否可合并步骤。这些差异提醒用户,理解底层机制有助于选择更适合自身需求的工具。

❓

Q&A

如何在不阅读文档或源代码的情况下,快速理解一个大语言模型框架的工作原理?

可以通过截获该框架发出的 API 调用来实现。使用 mitmproxy 这类 HTTPS 代理记录请求,就能直接看到框架发送给大语言模型的提示,从而理解其工作方式。

mitmproxy 的配置步骤是什么?

首先安装 mitmproxy,然后在终端运行 mitmweb 启动交互式界面,并设置设备将所有网络流量路由到 http://localhost:8080。接着访问 http://mitm.it 安装 CA 证书以拦截 HTTPS 请求。最后,通过设置环境变量将代理仅应用于特定的 Python 程序。

Langchain 的 LCEL 批量处理是如何工作的?

LCEL 的批量处理会对列表中的每一项发起独立的 API 调用。例如,对 5 个主题生成笑话时,会向 OpenAI 发送 5 个独立的请求,而不是一个批量请求。这可能导致速率限制问题。

SmartLLMChain 如何自动生成提示?

SmartLLMChain 通过多次 API 调用自动生成提示:首先为每个“创意”进行两次独立调用,然后结合这些创意进行批判性分析,最后根据反馈生成最终答案。整个过程可能涉及四次或更多 API 调用。

DSPy 框架为什么会导致大量的 API 调用?

DSPy 通过优化提示来改善指定指标,它会迭代采样少样本示例,并在验证集上选择最佳示例。这个过程可能涉及数百次 API 调用,导致运行时间很长且成本较高。

使用大语言模型库时,为什么理解提示内容很重要?

理解提示内容可以帮助用户判断框架是否必要、能否直接复制最终提示、能否编写更好的提示,以及API调用数量是否合理。这有助于避免不必要的复杂性,并做出更明智的选择。

🏷️

标签

➡️

继续阅读