Guardrails 0.2.0 版本迁移指南:重大变更与升级策略

Guardrails 0.2.0 版本迁移指南:重大变更与升级策略

【免费下载链接】guardrails 【免费下载链接】guardrails 项目地址: https://gitcode.com/gh_mirrors/gua/guardrails

引言

还在为AI应用的不确定性而烦恼吗?Guardrails 0.2.0版本带来了革命性的改进,让您的AI应用更加可靠和安全。本文将为您详细解析从0.1.x到0.2.0版本的重大变更,并提供完整的迁移策略,帮助您平滑升级。

通过本文,您将获得:

  • ✅ 完整的Pydantic支持迁移方案
  • ✅ Choice标签的全新使用方式
  • ✅ 验证器API的重大变更解析
  • ✅ 脚本支持移除的替代方案
  • ✅ 字符串格式化的标准化方法

版本变更概览

Guardrails 0.2.0版本引入了多项重大变更,主要围绕API简化、功能增强和向后兼容性改进。以下是主要变更的概览:

变更类型0.1.x版本0.2.0版本影响程度
Pydantic支持register_pydantic装饰器Guard.from_pydantic方法
Choice标签扁平化输出结构嵌套式输出结构
验证器API复杂参数传递简化参数传递
脚本支持<script>标签完全移除
字符串格式化{variable}格式${variable}格式

1. Pydantic支持的重大变更

1.1 从装饰器到方法的转变

在0.1.x版本中,Pydantic模型通过装饰器注册:

<rail version="0.1">
<script language="python">
from guardrails.utils.pydantic_utils import register_pydantic
from pydantic import BaseModel, validator

@register_pydantic
class Person(BaseModel):
    name: str
    age: int
    zip_code: str
    
    @validator("zip_code")
    def zip_code_must_be_numeric(cls, v):
        if not v.isnumeric():
            raise ValueError("Zip code must be numeric.")
        return v
</script>
</rail>

在0.2.0版本中,改为使用Guard.from_pydantic方法:

from guardrails import Guard
from pydantic import BaseModel, Field
from guardrails.validators import register_validator, Validator, ValidationResult

@register_validator(name="zip_code_must_be_numeric", data_type="string")
class ZipCodeMustBeNumeric(Validator):
    def validate(self, value: Any, metadata: Dict) -> ValidationResult:
        if not value.isnumeric():
            return FailResult(error_message="Zip code must be numeric.")
        return PassResult()

class Person(BaseModel):
    name: str
    age: int
    zip_code: str = Field(..., validators=[ZipCodeMustBeNumeric(on_fail="reask")])

guard = Guard.from_pydantic(Person, prompt=prompt)

1.2 验证器迁移策略

mermaid

2. Choice标签的结构变更

2.1 输出结构的变化

0.1.x版本的Choice标签产生扁平化输出:

<choice name="action">
    <case name="fight">
        <string name="fight_move"/>
    </case>
    <case name="flight">
        <object name="flight">
            <string name="flight_direction"/>
            <integer name="flight_speed"/>
        </object>
    </case>
</choice>

输出格式:

{
    "action": "fight",
    "fight": {
        "fight_move": "punch"
    }
}

0.2.0版本采用OpenAPI风格的嵌套结构:

<choice name="choice" discriminator="action">
    <case name="fight">
        <string name="fight_move"/>
    </case>
    <case name="flight">
        <string name="flight_direction"/>
        <integer name="flight_speed"/>
    </case>
</choice>

输出格式:

{
    "choice": {
        "action": "fight",
        "fight_move": "punch"
    }
}

2.2 Pydantic等效实现

from typing import Literal, Union
from pydantic import BaseModel, Field

class Fight(BaseModel):
    action: Literal["fight"]
    fight_move: str

class Flight(BaseModel):
    action: Literal["flight"]
    flight_direction: str
    flight_speed: int

class Choice(BaseModel):
    choice: Union[Fight, Flight] = Field(..., discriminator="action")

guard = Guard.from_pydantic(Choice)

3. 验证器API的简化

3.1 参数传递的变更

0.1.x版本的验证器需要处理复杂参数:

@register_validator(name="length", data_type=["string", "list"])
class ValidLength(Validator):
    def validate(self, key: str, value: Any, schema: Union[Dict, List]) -> Dict:
        if self._min is not None and len(value) < self._min:
            raise EventDetail(key, value, schema, "Value too short", corrected_value)
        return schema

0.2.0版本简化了参数传递:

@register_validator(name="length", data_type=["string", "list"])
class ValidLength(Validator):
    def validate(self, value: Any, metadata: Dict) -> ValidationResult:
        if self._min is not None and len(value) < self._min:
            return FailResult(error_message="Value too short", fix_value=corrected_value)
        return PassResult()

3.2 验证器迁移对照表

功能点0.1.x实现0.2.0实现
参数接收(self, key, value, schema)(self, value, metadata)
错误处理raise EventDetail()return FailResult()
成功返回return schemareturn PassResult()
修正值通过异常传递通过fix_value参数

4. 脚本支持的移除与替代方案

4.1 脚本功能的迁移路径

0.1.x版本使用<script>标签:

<script language="python">
script_var = "I'm the script variable!"
</script>

<output type="string" description="{script_var}"/>

0.2.0版本提供三种替代方案:

方案1:预定义变量

script_var = "I'm the script variable!"
rail_str = """
<output type="string" description="{script_var}"/>
""".format(script_var=script_var)

方案2:提示参数

rail_str = """
<output type="string" description="${script_var}"/>
"""

guard = Guard.from_rail_string(rail_str)
guard(..., prompt_params={"script_var": script_var})

方案3:自定义验证器

@register_validator(name="custom_validator", data_type="string")
class CustomValidator(Validator):
    def validate(self, value: Any, metadata: Dict) -> ValidationResult:
        # 自定义验证逻辑
        return PassResult()

4.2 脚本功能迁移决策树

mermaid

5. 字符串格式化的标准化

5.1 变量语法变更

0.1.x版本使用花括号格式:

<prompt>
{document}
@xml_prefix_prompt
{{output_schema}}
@json_suffix_prompt
</prompt>

0.2.0版本使用美元符号格式:

<prompt>
${document}
${gr.xml_prefix_prompt}
${output_schema}
${gr.json_suffix_prompt}
</prompt>

5.2 批量迁移工具

使用正则表达式进行批量替换:

变量替换:

  • 查找:([{]+)([^}"']*)([}]+)
  • 替换:${$2}

提示原语替换:

  • 查找:(^[@])(\w+)
  • 替换:${gr.$2}

5.3 LangChain集成调整

from langchain.output_parsers import GuardrailsOutputParser
from langchain.prompts import PromptTemplate

output_parser = GuardrailsOutputParser.from_rail_string(rail_spec, api=openai.ChatCompletion.create)

prompt = PromptTemplate(
    template=output_parser.guard.prompt.escape(),  # 使用escape方法
    input_variables=output_parser.guard.prompt.variable_names,
)

6. 迁移检查清单

6.1 必须检查的项目

  •  Pydantic模型注册方式已更新
  •  Choice标签已添加discriminator属性
  •  验证器API已适配新参数格式
  •  所有脚本标签已移除或替换
  •  字符串变量格式已更新为${variable}
  •  提示原语已更新为${gr.primitive}

6.2 推荐的最佳实践

  1. 逐步迁移:先迁移核心功能,再处理边缘案例
  2. 测试覆盖:确保所有验证场景都有测试用例
  3. 版本控制:使用版本控制工具管理迁移过程
  4. 文档更新:更新相关文档和示例代码

7. 常见问题解答

Q1: 迁移后验证器不工作怎么办?

A: 检查验证器是否正确使用@register_validator装饰,并且validate方法返回ValidationResult类型。

Q2: Choice标签迁移后数据结构变化如何处理?

A: 需要更新下游代码以适应新的嵌套结构,或者使用Pydantic模型进行数据提取。

Q3: 脚本中的复杂逻辑如何迁移?

A: 将复杂逻辑提取为独立的Python函数或类,然后在Guard外部调用。

Q4: 字符串格式化变更导致提示错误怎么办?

A: 使用提供的正则表达式进行批量替换,确保所有变量格式正确。

8. 总结

Guardrails 0.2.0版本的迁移虽然涉及多项重大变更,但通过这些变更,框架变得更加简洁、强大和易用。本文提供的迁移指南和策略将帮助您顺利完成升级过程。

记住迁移的核心原则:

  1. Pydantic优先:使用Guard.from_pydantic替代装饰器
  2. 结构标准化:适应Choice标签的新输出结构
  3. API简化:利用新的验证器参数格式
  4. 脚本外置:将逻辑移到Guard外部
  5. 格式统一:使用新的字符串变量格式

通过遵循这些指南,您将能够充分利用Guardrails 0.2.0的新特性,构建更加可靠和高效的AI应用程序。


下一步行动:

  • 立即检查您的代码库中的Pydantic使用情况
  • 使用提供的正则表达式进行字符串格式批量替换
  • 为关键功能添加迁移测试用例
  • 参考官方文档获取更多示例和最佳实践

祝您迁移顺利!如有问题,请查阅官方文档或参与社区讨论。

【免费下载链接】guardrails 【免费下载链接】guardrails 项目地址: https://gitcode.com/gh_mirrors/gua/guardrails

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值