LMQL语法现在,我们知道了什么是LMQL 。让我们看一个LMQL查询的例子来熟悉它的语法 。
beam(n=3) "Q: Say 'Hello, {name}!'""A: [RESPONSE]" from "openai/text-davinci-003"where len(TOKENS(RESPONSE)) < 20
我希望你能猜出它的意思 。但让我们详细讨论一下 。
以下是LMQL查询的方案:
文章插图
Beurer Kellner等人的论文图像(2023)
任何LMQL程序都由5个部分组成:
解码器定义所使用的解码过程 。简单地说,它描述了提取下一个令牌的算法 。LMQL有三种不同类型的解码器:argmax、beam和sample 。你可以从论文中更详细地了解它们 。
实际的查询类似于经典的提示,但使用Python语法 , 这意味着您可以使用循环或if语句等结构 。
在from子句中 , 我们指定了要使用的模型(在我们的示例中为openai/text-davinci-003) 。
Where子句定义约束 。
当您希望在返回中查看令牌的概率时,会使用分布 。我们还没有在这个查询中使用分布,但稍后我们将使用它来获得情绪分析的类概率 。
此外,您可能已经注意到我们的查询{name}和[RESPONSE]中的特殊变量 。让我们讨论一下它们是如何工作的:
{name}是一个输入参数 。它可以是您范围内的任何变量 。这样的参数可以帮助您创建方便的函数,这些函数可以很容易地用于不同的输入 。
[LRESPONSE]是LM将生成的短语 。它也可以称为孔或占位符 。[响应]之前的所有文本都被发送到LM,然后模型的输出被分配给变量 。很方便的是,您可以在稍后的提示中轻松地重用此输出,将其称为{RESPONSE} 。
我们已经简要介绍了主要概念 。让我们自己试试 。
开始设置环境首先,我们需要建立我们的环境 。要在Python中使用LMQL,我们需要首先安装一个包 。毫无疑问,我们可以使用pip 。您需要一个Python≥3.10的环境 。
pip install lmql
如果要将LMQL与本地GPU一起使用,请按照文档中的说明进行操作 。要使用OpenAI模型 , 您需要设置APIKey来访问OpenAI 。最简单的方法是指定OPENAI_API_KEY环境变量 。
import osos.environ['OPENAI_API_KEY'] = '<your_api_key>'
然而,OpenAI模型有很多局限性(例如,您将无法获得超过五个类的分发版) 。因此,我们将使用Llama.cpp用本地模型测试LMQL 。首先,您需要在与LMQL相同的环境中安装Llama.cpp的Python绑定 。
pip install llama-cpp-python
如果要使用本地GPU,请指定以下参数 。CMAKE_ARGS="-DLLAMA_METAL=on" pip install llama-cpp-python
然后,我们需要将模型权重加载为.gguf文件 。你可以在HuggingFace模特中心找到模特 。我们将使用两种型号:
- Llama-2-7B
- zephyr-7B-beta
Zephyr是Mistral车型的微调版本,性能不错 。在某些方面 , 它的性能比10倍大的开源型号Llama-2–70b要好 。然而,Zephyr与ChatGPT或Claude等专有模型之间仍有一些差距 。
文章插图
Tunstall等人的论文图像(2023)
根据LMSYS ChatBot Arena排行榜,Zephyr是性能最好的7B参数型号 。它与更大的型号不相上下 。
文章插图
排行榜截图|来源
让我们为我们的模型加载.gguf文件 。
import osimport urllib.requestdef download_gguf(model_url, filename): if not os.path.isfile(filename): urllib.request.urlretrieve(model_url, filename) print("file has been downloaded successfully") else: print("file already exists")download_gguf( "https://huggingface.co/TheBloke/zephyr-7B-beta-GGUF/resolve/main/zephyr-7b-beta.Q4_K_M.gguf","zephyr-7b-beta.Q4_K_M.gguf")download_gguf( "https://huggingface.co/TheBloke/Llama-2-7B-GGUF/resolve/main/llama-2-7b.Q4_K_M.gguf","llama-2-7b.Q4_K_M.gguf")
我们需要下载一些GB , 这样可能需要一些时间(每个型号需要10-15分钟) 。幸运的是,你只需要做一次 。您可以通过两种不同的方式(文档)与本地模型交互:
- 当您的模型和短时间运行的推理调用有一个单独的长时间运行的流程时,使用两个流程体系结构 。这种方法更适合生产 。
推荐阅读
- MySQL的自增主键是连续自增吗?
- MySQL数据库性能优化中常用的方法是什么?
- 实用性极强的MySQL查询优化策略
- MySQL的锁机制是如何防止数据冲突和不一致的?
- 十个高效的MySQL方法,助你更上一层楼
- 数据恢复新姿势:使用MySQL Shell进行更高效灵活的数据恢复
- SQL必须消失的九个理由,你认可吗?
- 生成式人工智能潜力的释放:软件工程师的MLOps和LLM部署策略
- 快速上手 PostgreSQL:掌握PSQL 命令行工具连接技巧
- 如何解决 MySQL 主从延时问题?