OutputAdapter
此组件有助于将一个组件的输出平滑地适配到另一个组件的输入。它使用 Jinja 表达式来定义这种适配如何发生。
| pipeline 中的最常见位置 | 灵活 |
| 必需的初始化变量 | "template": 一个 Jinja 模板字符串,定义了如何适配数据 "output_type": 此实例将返回的类型别名 |
| 强制运行变量 | “**kwargs”:将在 Jinja 表达式中使用的输入变量。有关更多详细信息,请参阅变量部分。 |
| 输出变量 | 输出在 "output" 键字典下指定 |
| API 参考 | Converters (转换器) |
| GitHub 链接 | https://github.com/deepset-ai/haystack/blob/main/haystack/components/converters/output_adapter.py |
概述
要使用OutputAdapter,您需要指定包含以下内容的适配规则
template:一个 Jinja 模板字符串,定义了如何适配输入数据。output_type:输出数据的类型(例如str,List[int]等)。这不会改变实际的输出类型,仅用于验证与其他组件的连接。custom_filters:一个可选的自定义 Jinja 过滤器字典,可在模板中使用。
变量
该OutputAdapter 要求在运行前所有模板变量都已存在,并在管道连接时如果任何模板变量缺失则会引发错误。
from haystack.components.converters import OutputAdapter
adapter = OutputAdapter(
template="Hello {{name}}!",
output_type=str
)
不安全行为
该OutputAdapter 内部使用 Jinja 渲染template,默认情况下,这是安全行为。但是,它将输出类型限制为字符串、字节、数字、元组、列表、字典、集合、布尔值、None 和省略号 (...),以及这些结构的任何组合。
如果您想使用其他类型,例如ChatMessage, Document 或Answer,您必须通过设置unsafe 初始化参数来启用不安全模板渲染。True.
请谨慎操作,因为启用此功能可能不安全,如果template 是由最终用户可自定义的字符串,则可能导致远程代码执行。
用法
单独使用
此组件主要用于管道中。
在此示例中,OutputAdapter 仅输出文档数组中的第一个文档的内容字段。
from haystack import Document
from haystack.components.converters import OutputAdapter
adapter = OutputAdapter(template="{{ documents[0].content }}", output_type=str)
input_data = {"documents": [Document(content="Test content")]}
expected_output = {"output": "Test content"}
assert adapter.run(**input_data) == expected_output
在 pipeline 中
以下示例演示了一个使用OutputAdapter 将列表中第一个文档大写化的简单管道。如果需要,您还可以利用预定义的 Jinja 过滤器。
from haystack import Pipeline, component, Document
from haystack.components.converters import OutputAdapter
@component
class DocumentProducer:
@component.output_types(documents=dict)
def run(self):
return {"documents": [Document(content="haystack")]}
pipe = Pipeline()
pipe.add_component(
name="output_adapter",
instance=OutputAdapter(template="{{ documents[0].content | capitalize}}", output_type=str),
)
pipe.add_component(name="document_producer", instance=DocumentProducer())
pipe.connect("document_producer", "output_adapter")
result = pipe.run(data={})
assert result["output_adapter"]["output"] == "Haystack"
您还可以定义自己的自定义过滤器,然后通过其初始化方法添加到OutputAdapter 实例中,并在模板中使用。下面是这种方法的示例。
from haystack import Pipeline, component, Document
from haystack.components.converters import OutputAdapter
def reverse_string(s):
return s[::-1]
@component
class DocumentProducer:
@component.output_types(documents=dict)
def run(self):
return {"documents": [Document(content="haystack")]}
pipe = Pipeline()
pipe.add_component(
name="output_adapter",
instance=OutputAdapter(template="{{ documents[0].content | reverse_string}}",
output_type=str,
custom_filters={"reverse_string": reverse_string}))
pipe.add_component(name="document_producer", instance=DocumentProducer())
pipe.connect("document_producer", "output_adapter")
result = pipe.run(data={})
assert result["output_adapter"]["output"] == "kcatsyah"
更新于 9 个月前
