### 为什么ell能够跳出这个圈?
ell的诞生,根子上就是为了修正这些痛点。它的创造者是前OpenAI研究科学家William H. Guss,在语言模型和提示工程这块积累相当深厚。废话不多说,直接看它到底好在哪。
#### 1. 把提示当成程序,而不是字符串
ell的核心哲学很特别——它把提示看作一个程序,而不是一段字符串。这意味着,Python的全套能力你都能拿来构建提示逻辑。看看下面两个例子就明白了。
**写法1**
```python
import ell
@ell.simple(model="gpt-4o-mini")
def answer_question(question: str):
"""你是一个知识渊博的助手""" # 系统提示
return f"请回答以下问题:{question}" # 用户提示
result = answer_question("法国的首都是哪里?")
```
**写法2**
```python
import ell
import random
@ell.simple(model="gpt-4o-mini")
def creative_story_generator(theme: str, mood: str):
adjectives = ["神奇的", "惊人的", "不可思议的", "震撼人心的"]
def get_random_adjective():
return random.choice(adjectives)
system_prompt = f"你是一个{get_random_adjective()}故事创作者。"
user_prompt = f"请以'{theme}'为主题,创作一个'{mood}'基调的短篇故事。"
return [
ell.system(system_prompt),
ell.user(user_prompt)
]
story = creative_story_generator("时空旅行", "神秘")
print(story)
```
第二个例子尤其有意思——系统提示里嵌入了随机逻辑,提示本身就有了生命力和动态性。这在传统框架里得绕不少弯子才能实现。
#### 2. 自动版本控制,告别手工记日志
版本控制这个能力,LangChain和dspy都做不到,但ell把它做成了标配。
```python
ell.init(store='./my_prompts', autocommit=True)
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家。"""
return f"将以下文本翻译成{target_language}:\n{text}"
# 第一个版本
result1 = translate("Hello, world!", "中文")
print("版本1:", result1)
# 修改函数,创建新版本
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家,专注于保留原文的语气和风格。"""
return f"请将以下文本翻译成{target_language},注意保持原文的语气和风格:\n{text}"
# 第二个版本
result2 = translate("Hello, world!", "中文")
print("版本2:", result2)
```
每次修改和运行函数,ell都自动存档一个新的版本。管理和对比不同版本的提示,像操作Git一样清爽。这在不断调优提示的场景下,价值立竿见影。
#### 3. 监控与可视化,把工程变成科学
提示工程优化久了,最大的痛点就是:全靠感觉。哪个版本效果更好?哪里跑偏了?影响多大?过去只能赌。
ell用一套可视化工具(ell-studio)把这个问题解决了。
```python
ell.init(store='./my_prompts', autocommit=True, verbose=True)
@ell.simple(model="gpt-4o-mini")
def sentiment_analysis(text: str):
"""你是一个专业的情感分析专家。"""
return f"分析以下文本的情感倾向(正面/负面/中性):\n{text}"
result = sentiment_analysis("今天的天气真是太棒了!")
print(result)
# 运行这段代码后,你可以使用ell-studio来可视化和分析结果
# 在命令行中运行: ell-studio --storage ./my_prompts
```
ell-studio提供了一个直观的web界面,版本线、性能指标、使用统计,全部可视化。提示工程从凭感觉变成了靠数据,这才是科学化的底层逻辑。
#### 4. 多步骤语言模型调用,复杂的活儿拆开干
处理复杂任务是AI开发的老大难。ell的做法是把任务拆解成几个独立的步骤,每一步交给一个专门的函数。
```python
@ell.simple(model="gpt-4o-mini")
def generate_outline(topic: str):
"""你是一个擅长创作大纲的作家。"""
return f"为主题'{topic}'创建一个简要的文章大纲。"
@ell.simple(model="gpt-4o")
def expand_section(section: str):
"""你是一个专业的内容写作者。"""
return f"详细展开以下段落,至少300字:\n{section}"
@ell.complex(model="gpt-4o-2024-08-06")
def write_article(topic: str):
# 步骤1: 生成大纲
outline = generate_outline(topic)
# 步骤2: 对每个大纲章节进行扩展
sections = outline.split("\n")
expanded_sections = [expand_section(section) for section in sections if section.strip()]
# 步骤3: 组合成完整文章
full_article = "\n\n".join(expanded_sections)
return full_article
article = write_article("人工智能的未来发展")
print(article)
```
分解之后的每一步,代码意图都一目了然,调试和替换哪个步骤都很方便。这种编排方式比在LangChain里画复杂的chain要直观得多。
#### 5. 结构化输出+多模态,复杂场景一把抓
图、文、结构化结果,ell一把抓。重点在于它支持Pydantic模型来定义输出格式,并且直接接收图片作为输入。
```python
from pydantic import BaseModel, Field
from PIL import Image
class ImageAnalysis(BaseModel):
main_subject: str = Field(description="图片的主要主题")
colors: list[str] = Field(description="图片中的主要颜色")
mood: str = Field(description="图片传达的整体情绪")
@ell.complex(model="gpt-4-vision-preview", response_format=ImageAnalysis)
def analyze_image(image: Image.Image):
return [
ell.system("你是一个精通图像分析的AI助手。请分析提供的图片,并以结构化格式返回结果。"),
ell.user(["请分析这张图片:", image])
]
# 假设我们有一个名为 'sunset.jpg' 的图片文件
image = Image.open('sunset.jpg')
analysis = analyze_image(image).parsed
print(f"主题: {analysis.main_subject}")
print(f"颜色: {', '.join(analysis.colors)}")
print(f"情绪: {analysis.mood}")
```
这个例子清楚展现了如何在一次调用中同时处理文本、图像、结构化约束——这在实际项目里是很常见的需求。
#### 6. 简单到不像框架
ell的设计哲学是“和普通Python函数一样”。你在项目里引入它,不需要改变&现有的编码习惯,直接在需要的地方定义和使用即可。
```python
import ell
# 在你的项目中定义ell函数
@ell.simple(model="gpt-4o-mini")
def summarize(text: str):
"""你是一个擅长总结的AI助手。"""
return f"请简要总结以下文本,不超过50字:\n{text}"
# 在项目的任何地方使用这个函数
def process_document(document):
# 其他处理逻辑...
summary = summarize(document.content)
document.summary = summary
# 更多处理...
# 示例使用
doc = get_document() # 假设这是你项目中的一个函数
process_document(doc)
print(doc.summary)
```
没有复杂的链、没有繁杂的管道、没有隐藏的抽象层。你在写Python,同时就是在构造提示工程。
---
综合来看,LangChain和dspy各有建树,但ell用更简洁的接口、更贴近实际工程需求的设计,找到了一个更舒服的平衡点。无论你是想快速搭建原型,还是需要精细控制提示的迭代演进,ell都值得放进工具箱里尝试一下。告别LangChain繁琐,拥抱提示工程新时代
ell是一款AI开发框架,将提示视为程序而非字符串,支持自动版本控制、可视化监控及多步骤调用,能处理图文结构化输出。相比LangChain和dspy,其接口更简洁,更贴近工程需求,提升提示工程效率。
人工智能领域发展得有多快,看看AI开发框架的迭代就知道。LangChain一度风光无限,dspy也吸引了一波忠实用户,但仔细琢磨下来,这些框架真的完美解决了所有问题吗?这恐怕得打一个问号。那么,有没有更对味的工具?ell的出现,或许给出了一个答案。
先来聊聊LangChain。用过的朋友应该都有体会:API接口堆得太高了,上来就是一大段样板代码,光是理顺这东西就要耗不少精力。灵活度方面也被卡得比较死——它强制你按照特定的工作流来走,想自由发挥?有点难。版本控制?几乎没有,提示改来改去,全靠人工记忆,效率低不说,还容易出错。再加上框架复杂的架构本身也带来额外的性能开销,而且功能越塞越多,给人感觉定位越来越模糊。
dspy确实是简洁,API设计更轻量,但短板也挺明显的。功能相对有限,碰到复杂的多步骤任务就容易力不从心。它的做法是通过自动识别类信息来构建提示词,这一层封装把很多细节都遮盖了,微调空间自然不够用。社区和生态还在成长,版本控制也基本空白,这些在大项目里就是要命的点。
### 为什么ell能够跳出这个圈?
ell的诞生,根子上就是为了修正这些痛点。它的创造者是前OpenAI研究科学家William H. Guss,在语言模型和提示工程这块积累相当深厚。废话不多说,直接看它到底好在哪。
#### 1. 把提示当成程序,而不是字符串
ell的核心哲学很特别——它把提示看作一个程序,而不是一段字符串。这意味着,Python的全套能力你都能拿来构建提示逻辑。看看下面两个例子就明白了。
**写法1**
```python
import ell
@ell.simple(model="gpt-4o-mini")
def answer_question(question: str):
"""你是一个知识渊博的助手""" # 系统提示
return f"请回答以下问题:{question}" # 用户提示
result = answer_question("法国的首都是哪里?")
```
**写法2**
```python
import ell
import random
@ell.simple(model="gpt-4o-mini")
def creative_story_generator(theme: str, mood: str):
adjectives = ["神奇的", "惊人的", "不可思议的", "震撼人心的"]
def get_random_adjective():
return random.choice(adjectives)
system_prompt = f"你是一个{get_random_adjective()}故事创作者。"
user_prompt = f"请以'{theme}'为主题,创作一个'{mood}'基调的短篇故事。"
return [
ell.system(system_prompt),
ell.user(user_prompt)
]
story = creative_story_generator("时空旅行", "神秘")
print(story)
```
第二个例子尤其有意思——系统提示里嵌入了随机逻辑,提示本身就有了生命力和动态性。这在传统框架里得绕不少弯子才能实现。
#### 2. 自动版本控制,告别手工记日志
版本控制这个能力,LangChain和dspy都做不到,但ell把它做成了标配。
```python
ell.init(store='./my_prompts', autocommit=True)
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家。"""
return f"将以下文本翻译成{target_language}:\n{text}"
# 第一个版本
result1 = translate("Hello, world!", "中文")
print("版本1:", result1)
# 修改函数,创建新版本
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家,专注于保留原文的语气和风格。"""
return f"请将以下文本翻译成{target_language},注意保持原文的语气和风格:\n{text}"
# 第二个版本
result2 = translate("Hello, world!", "中文")
print("版本2:", result2)
```
每次修改和运行函数,ell都自动存档一个新的版本。管理和对比不同版本的提示,像操作Git一样清爽。这在不断调优提示的场景下,价值立竿见影。
#### 3. 监控与可视化,把工程变成科学
提示工程优化久了,最大的痛点就是:全靠感觉。哪个版本效果更好?哪里跑偏了?影响多大?过去只能赌。
ell用一套可视化工具(ell-studio)把这个问题解决了。
```python
ell.init(store='./my_prompts', autocommit=True, verbose=True)
@ell.simple(model="gpt-4o-mini")
def sentiment_analysis(text: str):
"""你是一个专业的情感分析专家。"""
return f"分析以下文本的情感倾向(正面/负面/中性):\n{text}"
result = sentiment_analysis("今天的天气真是太棒了!")
print(result)
# 运行这段代码后,你可以使用ell-studio来可视化和分析结果
# 在命令行中运行: ell-studio --storage ./my_prompts
```
ell-studio提供了一个直观的web界面,版本线、性能指标、使用统计,全部可视化。提示工程从凭感觉变成了靠数据,这才是科学化的底层逻辑。
#### 4. 多步骤语言模型调用,复杂的活儿拆开干
处理复杂任务是AI开发的老大难。ell的做法是把任务拆解成几个独立的步骤,每一步交给一个专门的函数。
```python
@ell.simple(model="gpt-4o-mini")
def generate_outline(topic: str):
"""你是一个擅长创作大纲的作家。"""
return f"为主题'{topic}'创建一个简要的文章大纲。"
@ell.simple(model="gpt-4o")
def expand_section(section: str):
"""你是一个专业的内容写作者。"""
return f"详细展开以下段落,至少300字:\n{section}"
@ell.complex(model="gpt-4o-2024-08-06")
def write_article(topic: str):
# 步骤1: 生成大纲
outline = generate_outline(topic)
# 步骤2: 对每个大纲章节进行扩展
sections = outline.split("\n")
expanded_sections = [expand_section(section) for section in sections if section.strip()]
# 步骤3: 组合成完整文章
full_article = "\n\n".join(expanded_sections)
return full_article
article = write_article("人工智能的未来发展")
print(article)
```
分解之后的每一步,代码意图都一目了然,调试和替换哪个步骤都很方便。这种编排方式比在LangChain里画复杂的chain要直观得多。
#### 5. 结构化输出+多模态,复杂场景一把抓
图、文、结构化结果,ell一把抓。重点在于它支持Pydantic模型来定义输出格式,并且直接接收图片作为输入。
```python
from pydantic import BaseModel, Field
from PIL import Image
class ImageAnalysis(BaseModel):
main_subject: str = Field(description="图片的主要主题")
colors: list[str] = Field(description="图片中的主要颜色")
mood: str = Field(description="图片传达的整体情绪")
@ell.complex(model="gpt-4-vision-preview", response_format=ImageAnalysis)
def analyze_image(image: Image.Image):
return [
ell.system("你是一个精通图像分析的AI助手。请分析提供的图片,并以结构化格式返回结果。"),
ell.user(["请分析这张图片:", image])
]
# 假设我们有一个名为 'sunset.jpg' 的图片文件
image = Image.open('sunset.jpg')
analysis = analyze_image(image).parsed
print(f"主题: {analysis.main_subject}")
print(f"颜色: {', '.join(analysis.colors)}")
print(f"情绪: {analysis.mood}")
```
这个例子清楚展现了如何在一次调用中同时处理文本、图像、结构化约束——这在实际项目里是很常见的需求。
#### 6. 简单到不像框架
ell的设计哲学是“和普通Python函数一样”。你在项目里引入它,不需要改变&现有的编码习惯,直接在需要的地方定义和使用即可。
```python
import ell
# 在你的项目中定义ell函数
@ell.simple(model="gpt-4o-mini")
def summarize(text: str):
"""你是一个擅长总结的AI助手。"""
return f"请简要总结以下文本,不超过50字:\n{text}"
# 在项目的任何地方使用这个函数
def process_document(document):
# 其他处理逻辑...
summary = summarize(document.content)
document.summary = summary
# 更多处理...
# 示例使用
doc = get_document() # 假设这是你项目中的一个函数
process_document(doc)
print(doc.summary)
```
没有复杂的链、没有繁杂的管道、没有隐藏的抽象层。你在写Python,同时就是在构造提示工程。
---
综合来看,LangChain和dspy各有建树,但ell用更简洁的接口、更贴近实际工程需求的设计,找到了一个更舒服的平衡点。无论你是想快速搭建原型,还是需要精细控制提示的迭代演进,ell都值得放进工具箱里尝试一下。
### 为什么ell能够跳出这个圈?
ell的诞生,根子上就是为了修正这些痛点。它的创造者是前OpenAI研究科学家William H. Guss,在语言模型和提示工程这块积累相当深厚。废话不多说,直接看它到底好在哪。
#### 1. 把提示当成程序,而不是字符串
ell的核心哲学很特别——它把提示看作一个程序,而不是一段字符串。这意味着,Python的全套能力你都能拿来构建提示逻辑。看看下面两个例子就明白了。
**写法1**
```python
import ell
@ell.simple(model="gpt-4o-mini")
def answer_question(question: str):
"""你是一个知识渊博的助手""" # 系统提示
return f"请回答以下问题:{question}" # 用户提示
result = answer_question("法国的首都是哪里?")
```
**写法2**
```python
import ell
import random
@ell.simple(model="gpt-4o-mini")
def creative_story_generator(theme: str, mood: str):
adjectives = ["神奇的", "惊人的", "不可思议的", "震撼人心的"]
def get_random_adjective():
return random.choice(adjectives)
system_prompt = f"你是一个{get_random_adjective()}故事创作者。"
user_prompt = f"请以'{theme}'为主题,创作一个'{mood}'基调的短篇故事。"
return [
ell.system(system_prompt),
ell.user(user_prompt)
]
story = creative_story_generator("时空旅行", "神秘")
print(story)
```
第二个例子尤其有意思——系统提示里嵌入了随机逻辑,提示本身就有了生命力和动态性。这在传统框架里得绕不少弯子才能实现。
#### 2. 自动版本控制,告别手工记日志
版本控制这个能力,LangChain和dspy都做不到,但ell把它做成了标配。
```python
ell.init(store='./my_prompts', autocommit=True)
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家。"""
return f"将以下文本翻译成{target_language}:\n{text}"
# 第一个版本
result1 = translate("Hello, world!", "中文")
print("版本1:", result1)
# 修改函数,创建新版本
@ell.simple(model="gpt-4o-mini")
def translate(text: str, target_language: str):
"""你是一个精通多国语言的翻译专家,专注于保留原文的语气和风格。"""
return f"请将以下文本翻译成{target_language},注意保持原文的语气和风格:\n{text}"
# 第二个版本
result2 = translate("Hello, world!", "中文")
print("版本2:", result2)
```
每次修改和运行函数,ell都自动存档一个新的版本。管理和对比不同版本的提示,像操作Git一样清爽。这在不断调优提示的场景下,价值立竿见影。
#### 3. 监控与可视化,把工程变成科学
提示工程优化久了,最大的痛点就是:全靠感觉。哪个版本效果更好?哪里跑偏了?影响多大?过去只能赌。
ell用一套可视化工具(ell-studio)把这个问题解决了。
```python
ell.init(store='./my_prompts', autocommit=True, verbose=True)
@ell.simple(model="gpt-4o-mini")
def sentiment_analysis(text: str):
"""你是一个专业的情感分析专家。"""
return f"分析以下文本的情感倾向(正面/负面/中性):\n{text}"
result = sentiment_analysis("今天的天气真是太棒了!")
print(result)
# 运行这段代码后,你可以使用ell-studio来可视化和分析结果
# 在命令行中运行: ell-studio --storage ./my_prompts
```
ell-studio提供了一个直观的web界面,版本线、性能指标、使用统计,全部可视化。提示工程从凭感觉变成了靠数据,这才是科学化的底层逻辑。
#### 4. 多步骤语言模型调用,复杂的活儿拆开干
处理复杂任务是AI开发的老大难。ell的做法是把任务拆解成几个独立的步骤,每一步交给一个专门的函数。
```python
@ell.simple(model="gpt-4o-mini")
def generate_outline(topic: str):
"""你是一个擅长创作大纲的作家。"""
return f"为主题'{topic}'创建一个简要的文章大纲。"
@ell.simple(model="gpt-4o")
def expand_section(section: str):
"""你是一个专业的内容写作者。"""
return f"详细展开以下段落,至少300字:\n{section}"
@ell.complex(model="gpt-4o-2024-08-06")
def write_article(topic: str):
# 步骤1: 生成大纲
outline = generate_outline(topic)
# 步骤2: 对每个大纲章节进行扩展
sections = outline.split("\n")
expanded_sections = [expand_section(section) for section in sections if section.strip()]
# 步骤3: 组合成完整文章
full_article = "\n\n".join(expanded_sections)
return full_article
article = write_article("人工智能的未来发展")
print(article)
```
分解之后的每一步,代码意图都一目了然,调试和替换哪个步骤都很方便。这种编排方式比在LangChain里画复杂的chain要直观得多。
#### 5. 结构化输出+多模态,复杂场景一把抓
图、文、结构化结果,ell一把抓。重点在于它支持Pydantic模型来定义输出格式,并且直接接收图片作为输入。
```python
from pydantic import BaseModel, Field
from PIL import Image
class ImageAnalysis(BaseModel):
main_subject: str = Field(description="图片的主要主题")
colors: list[str] = Field(description="图片中的主要颜色")
mood: str = Field(description="图片传达的整体情绪")
@ell.complex(model="gpt-4-vision-preview", response_format=ImageAnalysis)
def analyze_image(image: Image.Image):
return [
ell.system("你是一个精通图像分析的AI助手。请分析提供的图片,并以结构化格式返回结果。"),
ell.user(["请分析这张图片:", image])
]
# 假设我们有一个名为 'sunset.jpg' 的图片文件
image = Image.open('sunset.jpg')
analysis = analyze_image(image).parsed
print(f"主题: {analysis.main_subject}")
print(f"颜色: {', '.join(analysis.colors)}")
print(f"情绪: {analysis.mood}")
```
这个例子清楚展现了如何在一次调用中同时处理文本、图像、结构化约束——这在实际项目里是很常见的需求。
#### 6. 简单到不像框架
ell的设计哲学是“和普通Python函数一样”。你在项目里引入它,不需要改变&现有的编码习惯,直接在需要的地方定义和使用即可。
```python
import ell
# 在你的项目中定义ell函数
@ell.simple(model="gpt-4o-mini")
def summarize(text: str):
"""你是一个擅长总结的AI助手。"""
return f"请简要总结以下文本,不超过50字:\n{text}"
# 在项目的任何地方使用这个函数
def process_document(document):
# 其他处理逻辑...
summary = summarize(document.content)
document.summary = summary
# 更多处理...
# 示例使用
doc = get_document() # 假设这是你项目中的一个函数
process_document(doc)
print(doc.summary)
```
没有复杂的链、没有繁杂的管道、没有隐藏的抽象层。你在写Python,同时就是在构造提示工程。
---
综合来看,LangChain和dspy各有建树,但ell用更简洁的接口、更贴近实际工程需求的设计,找到了一个更舒服的平衡点。无论你是想快速搭建原型,还是需要精细控制提示的迭代演进,ell都值得放进工具箱里尝试一下。来源:https://www.53ai.com/news/tishicijiqiao/2024101184612.html
相关热点
继续查看同栏目近期热点。
延伸阅读
补充最近整理过的热点入口。
