LangChain开发(七)自定义输出格式(JSON/XML/YAML)

JSON结构输出

虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型,查询符合该模式的模型输出,最后将该模式解析为JSON。

JsonOutputParser是一个内置选项,用于提示并解析JSON输出。虽然它在功能上类似于PydanticOutputParser,但它还支持流式返回部分JSON对象。

以下是如何将其与Pydantic一起使用以方便地声明预期模式的示例:

未使用Pydantic

让大模型生成json结构

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os

model = ChatOpenAI(model="gpt-4o", temperature=0)

joke_query = "告诉我一个笑话."
parser = JsonOutputParser()
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
print(response)
{'joke': '为什么电脑去医院?因为它需要检查一下‘病毒’!'}

Pydantic

让大模型生成指定结构的数据,结构为class Joke

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o", temperature=0)

# 定义期望的数据结构
class Joke(BaseModel):
    setup: str = Field(description="设置笑话的问题")
    punchline: str = Field(description="解决笑话的答案")

joke_query = "告诉我一个笑话."
parser = JsonOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
print(response)

输出示例:

{'setup': '为什么计算机不能喝咖啡?', 'punchline': '因为它们会崩溃!'}

请注意,我们将解析器中的format_instructions直接传递到提示中。可以并且应该尝试在提示的其他部分中添加自己的格式提示,以增强或替换默认指令:

parser.get_format_instructions()

流式处理

如上所述,JsonOutputParserPydanticOutputParsr之间的一个关键区别是JsonOutputParser输出解析器支持流式处理部分块。以下是其示例:

from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o", temperature=0)

joke_query = "告诉我一个笑话."
parser = JsonOutputParser()
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model | parser
response = chain.invoke({"query": joke_query})
for s in chain.stream({"query": joke_query}):
    print(s)

输出示例:

{}
{'joke': '为什么'}
{'joke': '为什么电脑去医院?因为它'}
{'joke': '为什么电脑去医院?因为它需要检查一下‘'}
{'joke': '为什么电脑去医院?因为它需要检查一下‘病毒’!'}

XML结构输出

下面使用XMLOutParser来提示模型生成XML输出,然后将该输出解析为可用的格式。

xml输出

我们可以使用XMLOutputParser将默认的格式指令添加到提示中,并将输出的XML解析为字典:

from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
# pip install defusexml

model = ChatOpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-turbo",
    temperature=0
)

action_query = "生成周星驰的简化电影作品列表,按照最新的顺序降序"
parser = XMLOutputParser()
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
response = chain.invoke({"query": action_query})
xml_output = parser.parse(response.content)
print(response.content)

输出示例:

```xml
<movie_list>
    <movie>
        <title>美人鱼</title>
        <year>2016</year>
    </movie>
    <movie>
        <title>西游降魔篇</title>
        <year>2013</year>
    </movie>
    <movie>
        <title>长江七号</title>
        <year>2008</year>
    </movie>
    <movie>
        <title>功夫</title>
        <year>2004</year>
    </movie>
    <movie>
        <title>少林足球</title>
        <year>2001</year>
    </movie>
</movie_list>
```

我们还可以添加一些标签以根据我们的需求定制输出。可以在提示的其他部分中尝试添加自己的格式提示,以增强或替换默认指令:

指定字段

# 指定字段名称
from langchain_core.output_parsers import XMLOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
# pip install defusexml

model = ChatOpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-turbo",
    temperature=0
)

joke_query = "生成周星驰的简化电影作品列表,按照最新的顺序降序"
parser = XMLOutputParser(tags=["movies", "actor", "film", "name", "genre"])
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
response = chain.invoke({"query": joke_query})
xml_output = parser.parse(response.content)
print(response.content)

输出示例:

```xml
<movies>
    <actor>
        <name>周星驰</name>
        <film>
            <name>美人鱼</name>
            <genre>喜剧</genre>
        </film>
        <film>
            <name>西游降魔篇</name>
            <genre>奇幻, 喜剧</genre>
        </film>
        <film>
            <name>功夫</name>
            <genre>动作, 喜剧</genre>
        </film>
        <film>
            <name>少林足球</name>
            <genre>喜剧, 动作</genre>
        </film>
    </actor>
</movies>
```

YAML输出

我们使用PydanticYamlOutputParser输出指定的YAML格式

from langchain.output_parsers import YamlOutputParser
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
import os

class Joke(BaseModel):
    setup: str = Field(description="设置笑话的问题")
    punchline: str = Field(description="解决笑话的答案")


model = ChatOpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-turbo",
    temperature=0
)

joke_query = "告诉我一个笑话."
# 设置一个解析器 + 将指令注入到提示模板中.
parser = YamlOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
    template="回答用户的查询.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | model
print(parser.get_format_instructions())
response = chain.invoke({"query": joke_query})
print(response.content)

以上就是让大模型输出指定格式输出示例

源码地址

https://github.com/lys1313013/langchain-example/tree/main/08-output-parser

参考资料

B站:2025吃透LangChain大模型全套教程(LLM+RAG+OpenAI+Agent)第6集后半段

LangChain官网 JSON parser

LangChain官网 XML parser

LangChain官网 YAMLparser

### 构建任务失败解决方案 当遇到 `Execution failed for task ':app:shrinkReleaseRes'` 错误时,这通常意味着资源压缩过程中出现了问题。此错误可能由多种原因引起,包括但不限于配置不正确、依赖冲突或特定于项目的其他因素。 #### 可能的原因分析 1. **ProGuard 或 R8 配置不当** ProGuard R8 是用于优化混淆代码以及减少 APK 大小的工具。如果这些工具的配置存在问题,可能会导致资源无法正常处理[^1]。 2. **重复资源** 如果项目中有多个模块定义了相同的资源名称,可能导致冲突并引发该错误。检查是否存在重名的 drawable、string 等资源文件[^2]。 3. **第三方库兼容性** 某些第三方库可能当前使用的 Gradle 插件版本或其他库存在兼容性问题,从而影响到资源打包过程中的行为[^3]。 4. **Gradle 缓存问题** 有时旧缓存数据会干扰新编译的结果,尝试清理本地仓库重新同步项目可以帮助排除此类潜在障碍[^4]。 #### 推荐的操作方法 为了有效解决问题,建议按照以下步骤逐一排查: ```bash # 清理项目构建目录 ./gradlew clean # 删除 .gradle 文件夹下的所有内容以清除缓存 rm -rf ~/.gradle/caches/ ``` 调整 `build.gradle` 中的相关设置也是一个重要环节: ```groovy android { ... buildTypes { release { minifyEnabled true // 是否启用代码缩减 shrinkResources true // 是否开启资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 尝试禁用 shrinkResources 来测试是否为资源压缩引起的错误 // shrinkResources false } } } ``` 此外,在 `proguard-rules.pro` 文件内添加必要的保留规则,防止关键类被意外移除: ```text -keep class com.example.yourpackage.** { *; } # 替换为你自己的包路径 -dontwarn androidx.**,com.google.** # 忽略警告信息 ``` 最后,确保所使用的 Android Studio 版本是最新的稳定版,并且已经应用了所有的补丁更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶只有影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值