结构化输入
结构化数据的另一面,除了输出之外,还有输入:许多提示指南和最佳实践确实包含一些技术,例如对输入提示进行XML标记,以增强LLM对输入的理解。
LlamaIndex 为您提供了将输入内容原生格式化为 XML 片段的可能性,利用银行和Jinja(请确保已安装 llama-index>=0.12.34)。
以下是一个使用 Pydantic 模型实现结构化输入的简单示例:
from pydantic import BaseModelfrom llama_index.core.prompts import RichPromptTemplatefrom llama_index.llms.openai import OpenAIfrom 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 Fieldfrom 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)如果您想要更深入的结构化输入指南,请查看这个示例笔记本。