趋近智
大型语言模型(LLM)擅长生成人类可读文本,但有时难以持续生成严格定义、机器可读格式的数据,如JSON、XML或CSV。当LLM代理需要与其他软件系统、API或数据库交互时,或者当输出需要以程序方式存储和处理时,这种精确性通常是必要的。因此,构建协助LLM生成良好结构化数据的工具是提升代理能力的一个重大进展,使代理能够与其环境进行更可靠、更复杂的互动。
这些工具不会取代LLM的生成能力;相反,它们指导并约束LLM,以确保其输出符合预定义模式。这通常结合了对LLM的清晰指令、模式定义和验证机制。
构建结构化数据生成工具的第一步是明确定义您希望LLM生成的数据结构。这个定义,即模式,是LLM的蓝图,也是验证的基础。
对于JSON数据(这是一项常见需求),Pydantic等Python库非常有用。Pydantic允许您使用标准Python类型提示定义数据模式。
from pydantic import BaseModel, EmailStr, PositiveInt, field_validator
from typing import Optional, List
class UserProfile(BaseModel):
username: str
email: EmailStr
age: Optional[PositiveInt] = None
is_active: bool = True
tags: List[str] = []
score: float
@field_validator('username')
@classmethod
def username_must_be_alphanumeric(cls, v: str) -> str:
if not v.isalnum():
raise ValueError('用户名必须是字母数字且不含空格。')
return v
@field_validator('score')
@classmethod
def score_must_be_between_zero_and_one(cls, v: float) -> float:
if not (0.0 <= v <= 1.0):
raise ValueError('分数必须在0.0到1.0之间。')
return v
在这个UserProfile模型中:
str、PositiveInt、bool 和 float 定义了预期数据类型。EmailStr 是 Pydantic 提供的类型,用于验证电子邮件格式。Optional 指示并非严格必需的字段。List[str] 定义一个字符串列表。@field_validator)可以强制执行更具体的规则,例如 username 的格式或 score 的范围。对于CSV数据,模式可以像标题名称列表及其预期数据类型(如果需要)的指示一样简单。对于XML,您可以使用DTD或XSD,尽管指导LLM生成有效且复杂的XML可能更具挑战性,并且通常需要更详细的提示或后期处理。
一旦有了模式,工具就需要指导LLM生成符合该模式的数据。有效的提示在这里很重要。您给LLM的提示应包含:
username(字符串,字母数字)、email(字符串,有效电子邮件格式)、age(整数,正数,可选)、is_active(布尔值,默认为true)、tags(字符串列表,可选)和score(浮点数,0.0到1.0之间)。”目标是为LLM提供足够的上下文,使其理解所需内容和结构约束。
即使有仔细的提示,LLM有时可能会生成与模式不完全匹配的输出。因此,结构化数据生成工具的一个重要组成部分是验证步骤。
使用我们的Pydantic示例,在LLM生成JSON字符串后,工具会尝试解析并验证它:
import json
# 假设 'llm_generated_json_string' 是LLM的输出
# llm_generated_json_string = '{"username": "test_user", "email": "[email protected]", "score": 0.5}' # 用户名无效
# llm_generated_json_string = '{"username": "testuser", "email": "invalid-email", "score": 1.5}' # 电子邮件和分数无效
def parse_and_validate_profile(json_string: str) -> (Optional[UserProfile], Optional[str]):
try:
# Pydantic 可以直接使用 model_validate_json 解析 JSON 字符串
profile = UserProfile.model_validate_json(json_string)
return profile, None
except ValueError as e:
# 构建一个有用的错误消息。
# 在实际工具中,此错误消息可以反馈给LLM进行另一次尝试。
error_details = json.loads(e.json()) if hasattr(e, 'json') else str(e)
return None, f"验证错误:{error_details}"
# 使用示例:
# profile_instance, error = parse_and_validate_profile(llm_generated_json_string)
# if error:
# print(f"创建资料失败:{error}")
# # 此处,工具可以带着错误消息重新提示LLM进行修正。
# else:
# print("成功创建资料:")
# print(profile_instance.model_dump_json(indent=2))
如果验证失败,工具可以实现一个优化循环:
以下图表描绘了使用LLM生成结构化数据的常见工作流程:
此图表展示了一个代理请求结构化数据的情况。该工具使用LLM生成数据,然后验证输出。如果无效,则将反馈提供给LLM以进行优化。
虽然JSON应用广泛,但您的工具可能需要生成其他格式:
结构化数据生成工具有以下几个优点:
在设计此类工具时,请考虑:
通过整合协助结构化数据生成的工具,您可以使LLM代理执行更广泛的任务,这些任务依赖于精确、机器可读的数据格式,使它们更具通用性和效率。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造