LLMs之ell:ell(轻量级函数式提示工程框架)的简介、安装和使用方法、案例应用之详细攻略
目录
案例一:简单的问候语生成 (对比传统API调用和ell方法)
案例二:使用ell.system, ell.user, ell.assistant 定义消息
案例四:多个LMP函数组合生成故事 (Best-of-N采样)
ell的简介
2024年8月,ell框架是由前OpenAI研究员William Guss开发的。这个框架的设计理念是将提示词视为程序,而不仅仅是字符串。ELL框架提供了自动化的版本控制和序列化功能,支持多模态数据处理,并配备了丰富的本地开源可视化工具,帮助用户优化提示词工程过程。
ell是一个轻量级、函数式的提示工程框架。ell 提供了一个结构化的、可编程的方式来进行提示工程,并通过 ell Studio 提供了工具来管理和优化提示。 其多模态支持使其能够处理各种类型的数据,使其成为一个功能强大的提示工程框架。
GitHub地址:GitHub - MadcowD/ell: A language model programming library.
文档地址:Getting Started | ell documentation
1、ell的核心原则
它基于几个核心原则构建:
>> 提示是程序,而不是字符串:ell将使用语言模型的过程视为离散的子程序,称为“语言模型程序”(LMP)。提示不仅仅是字符串,而是所有生成发送给语言模型的字符串的代码。
>> 提示实际上是机器学习模型的参数:提示工程涉及许多迭代,类似于机器学习中的优化过程。因为LMP只是函数,ell提供了丰富的工具来支持这个过程。ell通过静态和动态分析以及自动生成的提交信息,提供提示的自动版本控制和序列化到本地存储。这类似于机器学习训练循环中的检查点,但它不需要任何特殊的IDE或编辑器——所有这些都是用普通的Python代码完成的。
>> 监控、版本控制和可视化工具:ell Studio是一个本地、开源的工具,用于提示版本控制、监控和可视化。使用ell Studio,你可以随着时间的推移使你的提示优化过程经验化,并在为时已晚之前发现回归。
>> 多模态应该是第一位的:大型语言模型可以处理和生成各种类型的内容,包括文本、图像、音频和视频。使用这些数据类型的提示工程应该像使用文本一样容易。ell支持丰富的多模态输入和输出类型强制转换。你可以在LMP返回的Message对象中内联使用PIL图像、音频和其他多模态输入。
2、ell的特点
ell 是一个轻量级、函数式的提示工程库,它将提示视为程序,并提供了一套完整的工具来简化、优化和管理提示工程流程。其核心优势在于:函数式编程方法、自动版本控制、多模态支持、以及易于集成的特性。ell Studio 提供了可视化和监控工具,进一步提升了提示工程的效率和可控性。 ell 的设计理念是让提示工程变得更简单、更有效率,并且不会干扰用户的现有工作流程。
>> 将提示视为程序而非字符串:ell 的核心设计理念是将提示视为程序(Language Model Program, LMP),而非简单的字符串。这使得提示工程更具结构化和可维护性,便于版本控制和复用。
>> 函数式编程范式:ell 使用函数式编程方法来定义和管理 LMP,这使得代码更简洁、易读,也更易于测试和调试。
>> 自动版本控制和序列化:ell自动跟踪 LMP 的版本和调用信息,并将这些信息序列化到本地存储,方便追踪提示的演变过程,进行比较和分析。这类似于机器学习中的检查点机制。
>> 提供监控、版本控制和可视化工具 (ell Studio):ell Studio 作为一个本地开源工具,提供了提示版本控制、监控和可视化功能,帮助用户更好地理解和优化提示工程流程。
>> 支持测试时计算:ell 简化了测试时计算的实现,方便用户在实际应用中利用多次调用语言模型来优化结果。
>> 高效利用语言模型调用:ell 能够可选地保存每次对语言模型的调用,这允许用户生成调用数据集,比较不同版本 LMP 的输出,从而更好地管理和利用语言模型资源。
>> 灵活处理复杂性和简单性:ell 提供了 @ell.simple 和 @ell.complex 装饰器,分别用于处理简单和复杂的输出,满足不同需求。@ell.complex 支持多模态输出(文本、图像、音频等)。
>> 支持多模态:ell 支持丰富的多模态输入和输出类型,允许用户在提示工程中方便地使用各种类型的数据。
>> 不干扰现有工作流程:ell 设计轻量级且不干扰用户现有工作流程,用户可以使用常规 Python 代码和 IDE 来定义和修改提示。
>> 易于迁移:文档中提到可以逐步将 Langchain 中的函数迁移到 ell 中。
ell的安装和使用方法
1、安装
使用pip安装ell和ell studio:打开终端或命令提示符。运行以下命令从PyPI安装ell-ai包:
pip install ell-ai[all]
pip install -i https://mirrors.aliyun.com/pypi/simple ell-ai[all]
通过检查ell的版本来验证安装:
python -c "import ell; print(ell.__version__)"
这将安装ell和ell studio到你的系统上,允许你开始使用这些工具进行提示工程和可视化。
2、使用方法
ell 使用 Python 进行编程,其核心是定义 Language Model Program (LMP),这是一种将提示工程视为函数调用的方法。 LMP 使用装饰器 @ell.simple 定义,其中可以指定模型名称(例如 "gpt-4o")和其他参数(例如 temperature)。
LLMs模型目前的支持列表:anthropic、bedrock、groq、ollama、openai、xai
案例1:简单的文本生成
这段代码定义了一个名为 hello 的 LMP,它接收一个字符串作为输入,并返回一个字符串作为输出。 [::-1] 反转了输入字符串。
import ell
@ell.simple(model="gpt-4o")
def hello(world: str):
"""You are a helpful assistant that writes in lower case."""
# System Message
return f"Say hello to {world[::-1]} with a poem."
# User Message
hello("sama")
案例2:多模态输入(图像描述)
这个例子展示了如何使用 PIL Image 作为输入,并使用 ell.system 和 ell.user 来构建系统消息和用户消息。
from PIL import Image
import ell
@ell.simple(model="gpt-4o", temperature=0.1)
def describe_activity(image: Image.Image):
return [
ell.system("You are VisionGPT. Answer <5 words all lower case."),
ell.user(["Describe what the person in the image is doing:", image])
]
# Capture an image from the webcam (假设 capture_webcam_image 函数已定义)
describe_activity(capture_webcam_image())
# "they are holding a book"
3、ell Studio
ell Studio 是一个用于提示版本控制、监控和可视化的本地工具。 使用方式如下:
ell-studio --storage ./logdir
这将把日志存储在 ./logdir 目录下。此命令会在您的 Web 浏览器中打开 ell-studio 界面。在这里,您可以可视化您的 LMP、查看其依赖关系并跟踪随时间的变化。
ell的案例应用
案例一:简单的问候语生成 (对比传统API调用和ell方法)
# T1、传统API调用 (OpenAI)
import openai
openai.api_key = "your-api-key-here" # 替换为你的API密钥
messages = [
{"role": "system", "content": "You are a helpful assistant."}, # 系统提示:定义助手角色
{"role": "user", "content": "Say hello to Sam Altman!"} # 用户提示:请求问候
]
response = openai.ChatCompletion.create(model="gpt-4o", messages=messages) # 调用OpenAI API
print(response['choices'][0]['message']['content']) # 打印模型的回复
# T2、ell方法
import ell
@ell.simple(model="gpt-4o") # 定义一个简单的LMP,指定模型为gpt-4o
def hello(name: str):
"""You are a helpful assistant.""" # 系统提示:写在docstring中
# User prompt: 返回值即为用户提示
return f"Say hello to {name}!"
greeting = hello("Sam Altman") # 调用LMP函数
print(greeting) # 打印结果
案例二:使用ell.system, ell.user, ell.assistant 定义消息
import ell
@ell.simple(model="gpt-4o")
def hello(name: str):
return [ # 返回一个消息列表
ell.system("You are a helpful assistant."), # 系统消息:定义助手角色
ell.user(f"Say hello to {name}!"), # 用户消息:请求问候
ell.assistant("Hello! I'd be happy to greet Sam Altman."), # 助手回复:一个示例回复
ell.user("Great! Now do it more enthusiastically.") # 用户追加请求
]
greeting = hello("Sam Altman")
print(greeting)
案例三:使用函数生成动态提示
import ell
import random
def get_random_adjective(): # 定义一个函数,返回随机形容词
adjectives = ["enthusiastic", "cheerful", "warm", "friendly"]
return random.choice(adjectives)
@ell.simple(model="gpt-4o")
def hello(name: str):
"""You are a helpful assistant.""" # 系统提示
adjective = get_random_adjective() # 调用函数获取随机形容词
return f"Say a {adjective} hello to {name}!" # 用户提示包含随机形容词
greeting = hello("Sam Altman")
print(greeting)
案例四:多个LMP函数组合生成故事 (Best-of-N采样)
import ell
from typing import List
ell.init(verbose=True) # 启用详细模式
@ell.simple(model="gpt-4o-mini", temperature=1.0)
def generate_story_ideas(about: str):
"""You are an expert story ideator. Only answer in a single sentence."""
return f"Generate a story idea about {about}." # 生成故事想法
@ell.simple(model="gpt-4o-mini", temperature=1.0)
def write_a_draft_of_a_story(idea: str):
"""You are an adept story writer. The story should only be 3 paragraphs."""
return f"Write a story about {idea}." # 根据想法写故事草稿
@ell.simple(model="gpt-4o", temperature=0.1)
def choose_the_best_draft(drafts: List[str]):
"""You are an expert fiction editor."""
return f"Choose the best draft from the following list: {'\n'.join(drafts)}." # 选择最佳草稿
@ell.simple(model="gpt-4-turbo", temperature=0.2)
def write_a_really_good_story(about: str):
"""You are an expert novelist that writes in the style of Hemmingway. You write in lowercase."""
ideas = generate_story_ideas(about, api_params=(dict(n=4))) # 生成四个故事想法
drafts = [write_a_draft_of_a_story(idea) for idea in ideas] # 为每个想法生成草稿
best_draft = choose_the_best_draft(drafts) # 选择最佳草稿
return f"Make a final revision of this story in your voice: {best_draft}." # 最终润色
story = write_a_really_good_story("a dog") # 生成关于狗的故事
print(story)