LLMs之ell:ell(轻量级函数式提示工程框架)的简介、安装和使用方法、案例应用之详细攻略

发布于:2024-11-29 ⋅ 阅读:(34) ⋅ 点赞:(0)

LLMs之ell:ell(轻量级函数式提示工程框架)的简介、安装和使用方法、案例应用之详细攻略

目录

ell的简介

1、ell的核心原则

2、ell的特点

ell的安装和使用方法

1、安装

2、使用方法

案例1:简单的文本生成

案例2:多模态输入(图像描述)

3、ell Studio

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)