跳转到内容

结构化输入

结构化数据的另一面,除了输出之外,还有输入:许多提示指南和最佳实践确实包含一些技术,例如对输入提示进行XML标记,以增强LLM对输入的理解。

LlamaIndex 为您提供了将输入内容原生格式化为 XML 片段的可能性,利用银行Jinja(请确保已安装 llama-index>=0.12.34)。

以下是一个使用 Pydantic 模型实现结构化输入的简单示例:

from pydantic import BaseModel
from llama_index.core.prompts import RichPromptTemplate
from llama_index.llms.openai import OpenAI
from typing import Dict
template_str = "Please extract from the following XML code the contact details of the user:\n\n```xml\n{{ user | to_xml }}\n```\n\n"
prompt = RichPromptTemplate(template_str)
class User(BaseModel):
name: str
surname: str
age: int
email: str
phone: str
social_accounts: Dict[str, str]
user = User(
name="John",
surname="Doe",
age=30,
email="john.doe@example.com",
phone="123-456-7890",
social_accounts={"bluesky": "john.doe", "instagram": "johndoe1234"},
)
## check how the prompt would look like
prompt.format(user=user)
llm = OpenAI()
response = llm.chat(prompt.format_messages(user=user))
print(response.message.content)

如您所见,为了使用结构化输出,我们需要通过to_xml过滤器(过滤操作符为|)来使用Jinja表达式(由{{}}界定)。

结构化输入与结构化输出的结合能够显著提升您大语言模型输出的一致性(从而增强可靠性)。

通过下面的代码片段,您可以看到如何将这两个数据结构化步骤串联起来。

from pydantic import Field
from typing import Optional
class SocialAccounts(BaseModel):
instagram: Optional[str] = Field(default=None)
bluesky: Optional[str] = Field(default=None)
x: Optional[str] = Field(default=None)
mastodon: Optional[str] = Field(default=None)
class ContactDetails(BaseModel):
email: str
phone: str
social_accounts: SocialAccounts
sllm = llm.as_structured_llm(ContactDetails)
structured_response = await sllm.achat(prompt.format_messages(user=user))
print(structured_response.raw.email)
print(structured_response.raw.phone)
print(structured_response.raw.social_accounts.instagram)
print(structured_response.raw.social_accounts.bluesky)

如果您想要更深入的结构化输入指南,请查看这个示例笔记本