AI开发-python-langchain框架(1-13 返回xml-格式解析器)

有的时候xml格式也是开发中是比较普遍的数据格式,如何让大模型返回的数据是标准的xml格式?

看如下代码:

复制代码
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.output_parsers import XMLOutputParser
import os

llm = ChatOpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("BASE_URL"),
    model="deepseek-v3:671b",
    temperature=0.7,
    max_tokens=1024
)

# 修正 XML 格式指令:结束标签必须是 </xml>
format_instructions = """请严格按照以下XML格式返回结果,仅输出XML内容,不要包含任何其他文字或说明:

<xml>
  <movie>电影名称1</movie>
  <movie>电影名称2</movie>
  <!-- 可包含多个 movie 标签 -->
</xml>"""

prompt = PromptTemplate(
    template="{format_instructions}\n\n用户请求:{query}",
    input_variables=["query"],
    partial_variables={"format_instructions": format_instructions},
)

actor_query = "生成陈道明的电影目录。"

#输出提示词
print('#######################')
print(prompt.invoke({"query": actor_query}).text)
print('#######################')



chain = prompt | llm | XMLOutputParser()


result = chain.invoke({"query": actor_query})
print('----------------------')
print("解析成功,结果:")
print(result)

返结果:

复制代码
#######################
请严格按照以下XML格式返回结果,仅输出XML内容,不要包含任何其他文字或说明:

<xml>
  <movie>电影名称1</movie>
  <movie>电影名称2</movie>
  <!-- 可包含多个 movie 标签 -->
</xml>

用户请求:生成陈道明的电影目录。
#######################
----------------------
解析成功,结果:
{'xml': [{'movie': '英雄'}, {'movie': '无间道3:终极无间'}, {'movie': '归来'}, {'movie': '唐山大地震'}, {'movie': '康熙王朝'}, {'movie': '围城'}, {'movie': '我的1919'}, {'movie': '楚汉传奇'}]}

一个标准的xml格式返回

更多学习资料尽在老虎网盘资源:http://resources.kittytiger.cn/ 老虎网盘资源

重点知识:

代码结构与功能概述

本段代码构建了一个基于 LangChain 的结构化数据生成管道,核心目标是让大语言模型(LLM)以严格标准的 XML 格式 返回陈道明参演的电影列表。整个流程通过提示词工程、模型调用与输出解析三步协同,确保最终结果可直接被程序解析使用,避免非结构化文本带来的处理负担。

提示词模板:强制 XML 格式输出

代码通过 PromptTemplate 显式定义格式指令(format_instructions),要求模型:

  1. 仅输出 XML 内容 ,禁止附加说明、注释或多余文字;
  2. 使用标准 XML 标签结构 ,以 <xml> 为根节点,每个电影名称包裹在独立的 <movie> 子标签中;
  3. 严格闭合标签 ,如 </xml> 结束根节点,避免格式错误。
    这种设计从源头约束模型行为,大幅降低后续解析失败风险。

模型调用:定向生成结构化内容

选用 deepseek-v3:671b 模型并设置 temperature=0.7,在保证创造性的同时维持输出稳定性。关键点在于:

  • 提示词中明确用户请求("生成陈道明的电影目录")与格式指令分离,使模型聚焦于内容生成格式遵循 双重任务;
  • 通过 max_tokens=1024 限制输出长度,避免冗余信息干扰 XML 结构完整性。

输出解析器:验证并转换 XML 数据

XMLOutputParser 作为链式调用的最终环节,承担双重职责:

  1. 格式校验 :自动检测 XML 标签闭合性、嵌套合法性,若模型输出不符合标准(如缺失结束标签),将抛出解析异常;
  2. 结构化转换 :将原始 XML 字符串转换为 Python 字典(如 {'xml': {'movie': ['电影A', '电影B']}}),便于程序直接提取数据,无需手动正则匹配。