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

看如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

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)

 返结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#######################

请严格按照以下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']}}),便于程序直接提取数据,无需手动正则匹配。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐