跳到主要内容

DSPy 中的示例

在 DSPy 中工作涉及训练集、开发集和测试集。这类似于传统的机器学习,但通常您需要更少的标签(或零标签)才能有效地使用 DSPy。

DSPy 中数据的核心数据类型是 Example。您将使用 Examples 来表示训练集和测试集中的项目。

DSPy 中的 Examples 类似于 Python 中的 dict,但具有一些有用的实用程序。您的 DSPy 模块将返回 Prediction 类型的值,这是 Example 的一个特殊子类。

创建一个 Example

当您使用 DSPy 时,您将进行大量的评估和优化运行。您的单个数据点将是 Example 类型的:

qa_pair = dspy.Example(question="这是一个问题吗?", answer="这是一个答案。")

print(qa_pair)
print(qa_pair.question)
print(qa_pair.answer)

输出:

Example({'question': '这是一个问题吗?', 'answer': '这是一个答案。'}) (input_keys=None)
这是一个问题吗?
这是一个答案。

Examples 可以有任何字段键和任何值类型,尽管通常值是字符串。

object = Example(field1=value1, field2=value2, field3=value3, ...)

指定输入键

在传统的机器学习中,有分开的“输入”和“标签”。

在 DSPy 中,Example 对象有一个 with_inputs() 方法,可以将特定字段标记为输入。(其余字段只是元数据或标签。)

# 单个输入。
print(qa_pair.with_inputs("question"))

# 多个输入;在标记标签为输入时要小心,除非您是有意为之。
print(qa_pair.with_inputs("question", "answer"))

这种灵活性允许根据不同的 DSPy 场景定制 Example 对象。

当您调用 with_inputs() 时,您会获得一个示例的新副本。原始对象保持不变。

元素访问和更新

可以使用 .(点)运算符访问值。您可以通过 object.name 访问定义对象 Example(name="John Doe", job="sleep") 中键 name 的值。

要访问或排除某些键,使用 inputs()labels() 方法分别返回仅包含输入或非输入键的新 Example 对象。

article_summary = dspy.Example(article= "这是一篇文章。", summary= "这是一个摘要。").with_inputs("article")

input_key_only = article_summary.inputs()
non_input_key_only = article_summary.labels()

print("仅包含输入字段的 Example 对象:", input_key_only)
print("仅包含非输入字段的 Example 对象:", non_input_key_only)

输出

仅包含输入字段的 Example 对象: Example({'article': '这是一篇文章。'}) (input_keys=None)
仅包含非输入字段的 Example 对象: Example({'summary': '这是一个摘要。'}) (input_keys=None)

要排除键,使用 without()

article_summary = dspy.Example(context="这是一篇文章。", question="这是一个问题?", answer="这是一个答案。", rationale="这是一个理由。").with_inputs("context", "question")

print("Example object without answer & rationale keys:", article_summary.without("answer", "rationale"))

输出

示例对象没有答案和解释键:Example({'context': '这是一篇文章。', 'question': '这是一个问题?'}) (input_keys=None)

更新值只需使用 . 运算符分配一个新值。

article_summary.context = "新的内容"

遍历示例对象

Example 类中的迭代也类似于字典,支持诸如 keys()values() 等方法:

for k, v in article_summary.items():
print(f"{k} = {v}")

输出

context = 这是一篇文章。
question = 这是一个问题?
answer = 这是一个答案。
rationale = 这是一个解释。