1 OutputFixingParser
想象你训练了一只总爱恶作剧的AI猴子写快递单: 它有时候把地址写成"银河系地球村" ,在重量栏画了个香蕉图标 ,忘记写收件人电话
这时候OutputFixingParser就像自带橡皮擦的监工,它的绝活是:
- 发现错误时不像Pydantic那样直接吼"重写!"
- 而是偷偷把错误单塞回AI手里:"你小子,这里应该填数字!"
- 盯着AI重新写直到合格
- 最后交给你完美格式的快递单
代码示例:
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就像开外挂的复活币,它的骚操作是:
- 捕捉到错误提示后立即时光倒流
- 把错误信息塞回AI手里:"看清楚了要这样打!"
- 让AI重新生成符合要求的招式
- 循环直到打出完美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=['光'])