amoffat/manifest · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
清单 ✨
通过调用函数来调用 LLM。
- 定义函数名、参数、返回值和文档字符串。
- 像平常一样调用你的函数,传入你的值。
- 对于这些值,LLM 将返回一个符合你返回类型的响应。
安装
pip install manifest
现在请确保你的 OpenAI 密钥已设置:
export OPENAI_API_KEY="your_api_key_here"
示例
情感分析
from manifest import ai
@ai
def is_optimistic(text: str) -> bool:
"""Determines if the text is optimistic"""
print(is_optimistic("This is amazing!")) # Prints True
翻译
from manifest import ai
@ai
def translate(english_text: str, target_lang: str) -> str:
"""Translates text from english into a target language"""
print(translate("Hello", "fr")) # Prints "Bonjour"
图像分析
from pathlib import Path
from manifest import ai
@ai
def breed_of_dog(image: Path) -> str:
"""Determines the breed of dog from a photo"""
image = Path("path/to/dog.jpg")
print(breed_of_dog(image)) # Prints "German Shepherd" (or whatever)
复杂对象
from dataclasses import dataclass
from manifest import ai
@dataclass
class Actor:
name: str
character: str
@dataclass
class Movie:
title: str
director: str
year: int
top_cast: list[Actor]
@ai
def similar_movie(movie: str, before_year: int | None=None) -> Movie:
"""Discovers a similar movie, before a certain year, if the year is
provided."""
like_inception = similar_movie("Inception")
print(like_inception) # Prints a movie similar to inception
递归类型
它可以处理自引用类型。例如,每个 Character 都有一个 social_graph,并且每个 SocialGraph 由 Characters 组成。
from dataclasses import dataclass
from pprint import pprint
from manifest import ai
@dataclass
class Character:
name: str
occupation: str
social_graph: "SocialGraph"
@dataclass
class SocialGraph:
friends: list[Character]
enemies: list[Character]
@ai
def get_character_social_graph(character_name: str) -> SocialGraph:
"""For a given fictional character, return their social graph, resolving
each friend and enemy's social graph recursively."""
graph = get_character_social_graph("Walter White")
pprint(graph)
SocialGraph(
friends=[
Character(
name='Jesse Pinkman',
occupation='Meth Manufacturer',
social_graph=SocialGraph(
friends=[Character(name='Walter White', occupation='Chemistry Teacher', social_graph=SocialGraph(friends=[], enemies=[]))],
enemies=[Character(name='Hank Schrader', occupation='DEA Agent', social_graph=SocialGraph(friends=[], enemies=[]))]
)
),
Character(
name='Saul Goodman',
occupation='Lawyer',
social_graph=SocialGraph(friends=[Character(name='Walter White', occupation='Chemistry Teacher', social_graph=SocialGraph(friends=[], enemies=[]))], enemies=[])
)
],
enemies=[
Character(
name='Hank Schrader',
occupation='DEA Agent',
social_graph=SocialGraph(
friends=[Character(name='Marie Schrader', occupation='Radiologic Technologist', social_graph=SocialGraph(friends=[], enemies=[]))],
enemies=[Character(name='Walter White', occupation='Meth Manufacturer', social_graph=SocialGraph(friends=[], enemies=[]))]
)
),
Character(
name='Gus Fring',
occupation='Businessman',
social_graph=SocialGraph(
friends=[Character(name='Mike Ehrmantraut', occupation='Fixer', social_graph=SocialGraph(friends=[], enemies=[]))],
enemies=[Character(name='Walter White', occupation='Meth Manufacturer', social_graph=SocialGraph(friends=[], enemies=[]))]
)
)
]
)
工作原理?
Manifest 严重依赖运行时元数据,例如函数名称、 文档字符串、参数和类型提示。它在幕后利用所有这些元素来组合提示, 然后将提示发送给 LLM。LLM “执行”该 提示,并返回一种基于 json 的格式,我们可以安全地将其解析回 相应的对象。
要充分利用 @ai 装饰器:
- 为你的函数起一个好名字。
- 为你的函数添加类型提示。
- 为你的函数添加高价值的文档字符串。
局限性
REPL
Manifest 无法在 REPL 中工作,因为它需要访问 它所装饰的函数的源代码。
类型
你只能传入和返回以下类型:
- Dataclasses
Enum子类- 基本类型 (str, int, bool, None 等)
- 基本容器类型 (list, dict, tuple)
- 联合类型
- 上述类型的任意组合
提示
提示模板有时也有点棘手。它们可以改进。
初始化
为了简化操作,manifest 使用环境 LLM 凭据,目前
仅支持 OPENAI_API_KEY。如果未找到环境凭据,你将
被指示自行初始化该库。