趋近智
对大型语言模型(LLM)生成的输出进行妥善处理,对于构建安全的应用来说非常重要。LLM 基于从大量数据集中学到的模式生成文本,但它们缺乏对安全影响、上下文 (context)边界或其生成内容对下游系统可能造成的影响的内在理解。原始的LLM输出绝不应被盲目信任,也不应直接传递给敏感功能或执行环境。安全的输出处理和解析构成了抵御LLM应用特有多种漏洞的主要防御层。
未能妥善处理和解析LLM输出,可能使您的应用面临重要风险:
实施输出处理涉及多层防御,通常会结合 LangChain 的解析组件和自定义验证逻辑。
在可能的情况下,引导 LLM 以可预测的结构化格式(如 JSON 或 YAML)生成输出,并使用 LangChain 专为这些格式设计的 OutputParser 实现。这比解析自由格式文本要安全得多。
PydanticOutputParser: 这通常是处理复杂数据结构的首选。定义一个表示预期输出模式的 Pydantic 模型。解析器将尝试将 LLM 的输出字符串解析为此模型的一个实例,自动验证您的 Pydantic 模型中定义的数据类型、必填字段和约束。
from pydantic import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
# 定义您期望的数据结构。
class AnalysisResult(BaseModel):
sentiment: str = Field(description="文本情感(积极、消极、中性)")
key_topics: list[str] = Field(description="讨论的主要话题列表")
confidence_score: float = Field(description="置信度评分(0.0到1.0)")
# 设置解析器
parser = PydanticOutputParser(pydantic_object=AnalysisResult)
# 定义带有格式指令的提示
prompt_template = """
Analyze the following text:
{user_text}
{format_instructions}
"""
prompt = PromptTemplate(
template=prompt_template,
input_variables=["user_text"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
# 示例用法(假设 'llm' 是一个已初始化的 LLM)
# llm = ChatOpenAI(model="gpt-4o", temperature=0)
# chain = prompt | llm | parser
# try:
# result: AnalysisResult = chain.invoke({"user_text": "LangChain is great for building LLM apps!"})
# print(f"情感: {result.sentiment}, 置信度: {result.confidence_score}")
# except Exception as e:
# print(f"输出解析失败: {e}")
SimpleJsonOutputParser / JsonOutputParser: 适用于 Pydantic 可能过于繁琐的简单 JSON 对象,不过 PydanticOutputParser 通常提供更强的验证功能。
自定义解析器: 对于内置解析器未涵盖的独特格式或复杂验证逻辑,可继承自 BaseOutputParser 并实现自定义的 parse 逻辑(如第1章所述)。
仅有解析是不够的。务必验证解析后输出的内容和结构。
html.escape)以防止跨站脚本(XSS)攻击。DROP TABLE、UNION SELECT 这样的 SQL 注入关键词),或仅允许预期模式/值。这对自由格式文本来说有难度,但对结构化数据字段而言更可行。一个安全处理 LLM 输出的典型流程,在使用到下游系统之前,包含解析、验证、净化和错误处理。
如果您的应用依赖 LLM 生成可执行代码:
eval() 或类似功能。现代 LLM 通常支持通过函数或工具调用功能生成结构化输出(如第2章所述)。提示模型使用带有已定义模式的特定工具/函数,可促使它生成符合该模式的输出(通常是 JSON)。LangChain 通过 with_structured_output 方法抽象了这些能力,允许您直接将 Pydantic 模型或模式传递给 LLM,以原生方式强制执行输出格式。这相较于仅在主提示文本中进行指令,显著提升了获得结构化、可解析输出的可靠性。
解析和验证有时会失败。请为此做好计划:
try...except 块中,以优雅地处理错误,而非导致程序崩溃。OutputFixingParser 等策略,它尝试将错误反馈给 LLM 以修正输出。请谨慎使用重试,因为它们会增加延迟和成本。将 LLM 输出视为不可信输入是安全 LLM 应用开发的一个基本原则。结合结构化解析、严格验证、上下文 (context)感知的净化、安全执行实践(如果适用)以及全面的错误处理,您可以显著降低与不可预测或潜在恶意模型生成相关的风险。这种多层方法可确保集成到应用逻辑中的输出既可用又安全。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•