# 模型的输出格式化

大语言模型能够生成任意文本,这使得模型能够是单独个响应广泛的输入范围,但是对于某些用例,限制大语言模型的输出为特定的格式活结构是有用的。这被称为结构化输出

最常用的输出格式是json,其他格式如yaml也可能很有用。

方式1:.with_stractured_output()

一些langchain聊天模型支持.with_stractured_output()方法。需要指定一个输出模式。

from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI

from dotenv import load_dotenv
import os
load_dotenv()
class ContactInfo(BaseModel):
    """Contact information for a person."""
    name: str = Field(description="The name of the person")
    age: int = Field(description="The age address of the person")
    phone: str = Field(description="The phone number of the person")

llm = ChatOpenAI(
    base_url=os.getenv('OPENAI_BASE_URL'),
    api_key=os.getenv('OPENAI_API_KEY'),
    model=os.getenv('OPENAI_MODEL'),
    temperature=0.5
)

llm_with_structure = llm.with_structured_output(ContactInfo)
res = llm_with_structure.invoke('给我马斯克的信息')
print(res)

输出:

name='埃隆·马斯克' age=52 phone='+1-123-456-7890'

国内的一些模型可能不支持这种方式,可以是哦那个方式2


方式2:提示词加解析器

解析器from langchain_core.output_parsers

使用解析器 必须在提示词里指明输出格式

from pydantic import BaseModel, Field
from typing import Optional
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import SimpleJsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from dotenv import load_dotenv
import os
load_dotenv()

llm = ChatOpenAI(
    base_url=os.getenv('OPENAI_BASE_URL'),
    api_key=os.getenv('OPENAI_API_KEY'),
    model=os.getenv('OPENAI_MODEL'),
)

prompt = ChatPromptTemplate.from_template(
    "尽可能回答用户问题"
    "你的输出必须是一个包含'name','age','sex'键的JSON对象"
    "{question}"
)

chain = prompt | llm | SimpleJsonOutputParser()

resp = chain.invoke({"question":"介绍一下特朗普"})

print(resp)
    

输出

{'name': '唐纳德·特朗普', 'age': 77, 'sex': '男'}