2.2_Langchain_会自动修复的OutputParser

1 OutputFixingParser

        想象你训练了一只总爱恶作剧的AI猴子写快递单: 它有时候把地址写成"银河系地球村" ,在重量栏画了个香蕉图标 ,忘记写收件人电话

这时候OutputFixingParser就像自带橡皮擦的监工,它的绝活是:

  1. 发现错误时不像Pydantic那样直接吼"重写!"
  2. 而是偷偷把错误单塞回AI手里:"你小子,这里应该填数字!"
  3. 盯着AI重新写直到合格
  4. 最后交给你完美格式的快递单

代码示例:

from langchain.chat_models import init_chat_model
from langchain.output_parsers import OutputFixingParser
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel


# 1 之前定义好的快递单格式(Pydantic模型)
class ExpressOrder(BaseModel):
    address: str
    weight: float
    phone: str

# 2. 自动修复的llm
API_KEY = "sk-xxx"
llm = init_chat_model(model_provider="deepseek", model="deepseek-chat", api_key=API_KEY)

# 3 创建自动纠错解析器
fix_parser = OutputFixingParser.from_llm(
    parser=PydanticOutputParser(pydantic_object=ExpressOrder),
    llm=llm
)

# 伪造一个乱写的快递单
bad_output = """
{
  "address": "火星基地1号",
  "weight": "一百三十斤",
  "phone": "幺零零八八"
}
"""

# 监工启动自动修正!
fixed_order = fix_parser.parse(bad_output)
print(f"解析结果:{fixed_order}")

输出内容:

解析结果:address='火星基地1号' weight=65.0 phone='10088'

2 RetryWithErrorOutputParser

        想象你在玩《AI文字冒险游戏》,每次输错指令就会这样:

        输入:"攻击BOSS用光波"

        系统提示:"发生错误!攻击失效并反弹"

        直接Game Over

RetryWithErrorOutputParser就像开外挂的复活币,它的骚操作是:

  1. 捕捉到错误提示后立即时光倒流
  2. 把错误信息塞回AI手里:"看清楚了要这样打!"
  3. 让AI重新生成符合要求的招式
  4. 循环直到打出完美combo
from langchain.chat_models import init_chat_model
from langchain.output_parsers import RetryWithErrorOutputParser
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from openai import BaseModel


# 定义游戏技能规范(Pydantic模型)
class Skill(BaseModel):
    name: str
    damage: int
    element: list

# 2. 创建提示模板
prompt_template = PromptTemplate(
    template="""请根据要求生成游戏技能数据\n{format_instructions}\n{query}""",
    input_variables=["query"],
    partial_variables={
        "format_instructions": PydanticOutputParser(pydantic_object=Skill).get_format_instructions()
    }
)

# 3. 进行修复的llm
API_KEY = "sk-xxx"
llm = init_chat_model(model_provider="deepseek", model="deepseek-chat", api_key=API_KEY)

# 创建不死心解析器
retry_parser = RetryWithErrorOutputParser.from_llm(
    parser=PydanticOutputParser(pydantic_object=Skill),
    llm=llm
)

# 第一次错误的输出
bad_skill = """
{
  "name": ["你相信光吗"],
  "damage": "超强",
  "element": "蓝色"
}
"""

# 开始循环
fixed_skill = retry_parser.parse_with_prompt(bad_skill,
                                             prompt_template.format_prompt(query=" 生成一个光属性技能"))

print(fixed_skill)

输出内容:

Skill(name='你相信光吗', damage=100, element=['光'])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值