如何创建自定义输出解析器:全方位指南

103 阅读2分钟

引言

在开发AI应用时,解析模型输出是非常重要的一步。自定义解析器可以帮助我们将模型输出转换为所需的格式。本文将介绍如何创建自定义输出解析器,包括使用RunnableLambdaRunnableGenerator的方法,以及通过继承基类实现的方法。

主要内容

使用RunnableLambda和RunnableGenerator

推荐使用RunnableLambdaRunnableGenerator来解析输出。这种方法不仅简单,而且可以利用LangChain生态系统的优势。

反转大小写解析器

我们将创建一个简单的解析器,将输出的大小写反转。例如,模型输出"Meow",解析器将返回"mEOW"。

from typing import Iterable
from langchain_anthropic.chat_models import ChatAnthropic
from langchain_core.messages import AIMessage, AIMessageChunk

model = ChatAnthropic(model_name="claude-2.1")

def parse(ai_message: AIMessage) -> str:
    """Parse the AI message."""
    return ai_message.content.swapcase()

chain = model | parse
chain.invoke("hello")

流式解析器

如果需要流式解析,可以使用RunnableGenerator处理可迭代的输入,并在可用时产生结果。

from langchain_core.runnables import RunnableGenerator

def streaming_parse(chunks: Iterable[AIMessageChunk]) -> Iterable[str]:
    for chunk in chunks:
        yield chunk.content.swapcase()

streaming_parse = RunnableGenerator(streaming_parse)

chain = model | streaming_parse

继承解析基类

另一种方法是从基类继承实现解析器。这种方法代码较多,通常不推荐。

简单布尔解析器

扩展BaseOutputParser类,可解析字符串形式的布尔值。

from langchain_core.exceptions import OutputParserException
from langchain_core.output_parsers import BaseOutputParser

class BooleanOutputParser(BaseOutputParser[bool]):
    """Custom boolean parser."""

    true_val: str = "YES"
    false_val: str = "NO"

    def parse(self, text: str) -> bool:
        cleaned_text = text.strip().upper()
        if cleaned_text not in (self.true_val.upper(), self.false_val.upper()):
            raise OutputParserException(
                f"Expected {self.true_val} or {self.false_val}, got {cleaned_text}."
            )
        return cleaned_text == self.true_val.upper()

代码示例

# 使用API代理服务提高访问稳定性
parser = BooleanOutputParser()
parser.invoke("YES")

try:
    parser.invoke("MEOW")
except Exception as e:
    print(f"Exception: {type(e)}")

常见问题和解决方案

  1. 解析失败:确保输入格式正确,并在必要时捕获OutputParserException
  2. 流式解析不工作:确认解析器实现为可迭代的生成器。

总结和进一步学习资源

创建自定义解析器可以提高应用的灵活性和可靠性。推荐使用RunnableLambdaRunnableGenerator。进一步学习可以参考以下资源:

参考资料

  • LangChain API 参考
  • Python 类型注释

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---