引言
在开发AI应用时,解析模型输出是非常重要的一步。自定义解析器可以帮助我们将模型输出转换为所需的格式。本文将介绍如何创建自定义输出解析器,包括使用RunnableLambda或RunnableGenerator的方法,以及通过继承基类实现的方法。
主要内容
使用RunnableLambda和RunnableGenerator
推荐使用RunnableLambda或RunnableGenerator来解析输出。这种方法不仅简单,而且可以利用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)}")
常见问题和解决方案
- 解析失败:确保输入格式正确,并在必要时捕获
OutputParserException。 - 流式解析不工作:确认解析器实现为可迭代的生成器。
总结和进一步学习资源
创建自定义解析器可以提高应用的灵活性和可靠性。推荐使用RunnableLambda和RunnableGenerator。进一步学习可以参考以下资源:
参考资料
- LangChain API 参考
- Python 类型注释
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---