官宣:根据非常普遍的需求,OpenAI的API 中开始支持结构化输出。
在 API 中引入结构化输出 - 模型输出现在遵循开发人员提供的 JSON 模式。让大型语言模型(Large Language Models, LLMs)进行结构化输出是自然语言处理(NLP)领域中的一个重要目标。结构化输出指的是将自然语言转换成具有明确格式和结构的数据,如表格、数据库条目、JSON对象等。
快速进行尝试一个。这个真香,再也不用为没有固定返回格式发愁了。
通过实现这一点,不仅可以提高模型输出的可预测性和可用性,还能增强其在各种应用场景中的实用性。结构化输出有助于减少误差,提高数据处理效率,并确保在与其他系统和应用程序集成时的一致性和兼容性。这一特性对于自动化工作流程、数据分析、自然语言处理任务以及智能助手等方面尤为重要。
LLMs返回结构化的输出通常至关重要。这是因为LLMs的输出通常用于下游应用程序,其中需要特定的参数。为此,必须可靠地提供结构化输出。这不仅能确保数据的一致性和准确性,还能提高系统的整体效率和性能。通过结构化的输出,可以更容易地进行数据处理、分析和集成,从而更好地支持决策和业务流程的优化。
下面通过几个示例来看。
第一,用于思维链数学辅导的结构化输出。
from pydantic import BaseModel``from openai import OpenAI`` ``client = OpenAI()`` ``class Step(BaseModel):` `explanation: str` `output: str`` ``class MathReasoning(BaseModel):` `steps: list[Step]` `final_answer: str`` ``completion = client.beta.chat.completions.parse(` `model="gpt-4o-2024-08-06",` `messages=[` `{"role": "system", "content": "You are a helpful math tutor. Guide the user through the solution step by step."},` `{"role": "user", "content": "how can I solve 8x + 7 = -23"}` `],` `response_format=MathReasoning,``)`` ``math_reasoning = completion.choices[0].message.parsed
返回结果如下。
{` `"steps": [` `{` `"explanation": "Start with the equation 8x + 7 = -23.",` `"output": "8x + 7 = -23"` `},` `{` `"explanation": "Subtract 7 from both sides to isolate the term with the variable.",` `"output": "8x = -23 - 7"` `},` `{` `"explanation": "Simplify the right side of the equation.",` `"output": "8x = -30"` `},` `{` `"explanation": "Divide both sides by 8 to solve for x.",` `"output": "x = -30 / 8"` `},` `{` `"explanation": "Simplify the fraction.",` `"output": "x = -15 / 4"` `}` `],` `"final_answer": "x = -15 / 4"``}
第二,定义结构化字段以从非结构化输入数据(例如检索论文)中提取。
from pydantic import BaseModel``from openai import OpenAI`` ``client = OpenAI()`` ``class ResearchPaperExtraction(BaseModel):` `title: str` `authors: list[str]` `abstract: str` `keywords: list[str]`` ``completion = client.beta.chat.completions.parse(` `model="gpt-4o-2024-08-06",` `messages=[` `{"role": "system", "content": "You are an expert at structured data extraction. You will be given unstructured text from a research paper and should convert it into the given structure."},` `{"role": "user", "content": "..."}` `],` `response_format=ResearchPaperExtraction,``)`` ``research_paper = completion.choices[0].message.parsed
返回结果如下。
{` `"title": "Application of Quantum Algorithms in Interstellar Navigation: A New Frontier",` `"authors": [` `"Dr. Stella Voyager",` `"Dr. Nova Star",` `"Dr. Lyra Hunter"` `],` `"abstract": "This paper investigates the utilization of quantum algorithms to improve interstellar navigation systems. By leveraging quantum superposition and entanglement, our proposed navigation system can calculate optimal travel paths through space-time anomalies more efficiently than classical methods. Experimental simulations suggest a significant reduction in travel time and fuel consumption for interstellar missions.",` `"keywords": [` `"Quantum algorithms",` `"interstellar navigation",` `"space-time anomalies",` `"quantum superposition",` `"quantum entanglement",` `"space travel"` `]``}
结构化输出是JSON模式的演变。虽然两者都确保生成有效的 JSON,但只有结构化输出确保架构合规性。Chat Completions API、Assistants API、Fine-tuning API 和 Batch API 都支持结构化输出和 JSON 模式。
建议尽可能始终使用结构化输出而不是 JSON 模式。但是,只有 gpt-4o-mini、gpt-4o-mini-2024-07-18 和 gpt-4o-2024-08-06 模型快照及更高版本支持结构化输出。
最关心的还是价格,貌似挤牙膏,不是很理想,哈哈。
有热心网友整理的思维导图,赶紧收藏吧!
在此之前从中获取结构化输出的方法LLM,在Github上即可搜到。
LangChain和LlamaIndex 提供了大量结构化输出的方式,下面我们整理一下。
LangChain 的结构化输出方式。
JSON 输出:LangChain 支持通过特定格式和标签生成 JSON 格式的数据,方便后续处理和分析。
from typing import List``from langchain.prompts import PromptTemplate``from langchain_community.chat_models import ChatOpenAI``from langchain_core.output_parsers import JsonOutputParser``from langchain_core.pydantic_v1 import BaseModel, Field`` ``model = ChatOpenAI(temperature=0)`` ``# 定义所需的数据结构。``class Joke(BaseModel):` `setup: str = Field(description="问题以设置笑话")` `punchline: str = Field(description="回答以解决笑话")`` ``# 以提示模型填充数据结构的查询意图。``joke_query = "Tell me a joke."`` ``# 设置解析器+将说明注入提示模板。``parser = JsonOutputParser(pydantic_object=Joke)`` ``prompt = PromptTemplate(` `template="回答用户的查询。\n{format_instructions}\n{query}\n",` `input_variables=["query"],` `partial_variables={"format_instructions": parser.get_format_instructions()},``)`` ``chain = prompt | model | parser`` ``chain.invoke({"query": joke_query})
表格数据:可以生成 CSV 或 Excel 格式的表格数据,适用于各种数据分析和报告需求。
from langchain.output_parsers import CommaSeparatedListOutputParser``from langchain.prompts import PromptTemplate``from langchain_community.chat_models import ChatOpenAI`` ``output_parser = CommaSeparatedListOutputParser()`` ``format_instructions = output_parser.get_format_instructions()``prompt = PromptTemplate(` `template="List five {subject}.\n{format_instructions}",` `input_variables=["subject"],` `partial_variables={"format_instructions": format_instructions}``)`` ``model = OpenAI(temperature=0)`` ``_input = prompt.format(subject="ice cream flavors")``output = model(_input)`` ``result = output_parser.parse(output)`` ``# 输出:``# ['Vanilla', 'Chocolate', 'Strawberry', 'Mint Chocolate Chip', 'Cookies and Cream']
API 集成:通过与其他 API 集成,实现结构化数据的自动化传输和处理。
from langchain_community.chat_models import ChatOpenAI``from langchain_community.utils.openai_functions import (` `convert_pydantic_to_openai_function,``)``from langchain_core.prompts import ChatPromptTemplate``from langchain_core.pydantic_v1 import BaseModel, Field, validator`` ``class Joke(BaseModel):` `setup: str = Field(description="问题以设置笑话")` `punchline: str = Field(description="回答以解决笑话")`` ``openai_functions = [convert_pydantic_to_openai_function(Joke)]`` ``model = ChatOpenAI(temperature=0)`` ``prompt = ChatPromptTemplate.from_messages(` `[("system", "You are a helpful assistant"), ("user", "{input}")]``)
Pydantic声明:使用Pydantic声明你的数据模型。Pydantic的BaseModel就像是Python的数据类,但具有实际的类型检查和强制转换。
from typing import List`` ``from langchain.output_parsers import PydanticOutputParser``from langchain.prompts import PromptTemplate``from langchain_community.chat_models import ChatOpenAI``from langchain_core.pydantic_v1 import BaseModel, Field, validator`` `` ``model = ChatOpenAI(temperature=0)`` `` ``# 定义你期望的数据结构。``class Joke(BaseModel):` `setup: str = Field(description="设立笑话的问题")` `punchline: str = Field(description="解决笑话的答案")`` ``# 你可以轻松地用Pydantic添加自定义验证逻辑。``@validator("setup")``def question_ends_with_question_mark(cls, field):` `if field[-1] != "?":` `raise ValueError("问题格式不正确!")` `return field`` `` ``# 并且一个旨在提示语言模型填充数据结构的查询。``joke_query = "给我讲个笑话。"`` ``# 设置解析器 + 将指令注入提示模板。``parser = PydanticOutputParser(pydantic_object=Joke)`` ``prompt = PromptTemplate(` `template="回答用户查询。\n{format_instructions}\n{query}\n",` `input_variables=["query"],` `partial_variables={"format_instructions": parser.get_format_instructions()},``)`` ``chain = prompt | model | parser`` ``chain.invoke({"query": joke_query})
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。