AI工程师必备:RAG原生应用开发的最佳实践——从架构设计到落地优化的全流程指南
元数据框架
- 标题:AI工程师必备:RAG原生应用开发的最佳实践——从架构设计到落地优化的全流程指南
- 关键词:RAG(检索增强生成)、原生应用、向量数据库、检索策略、生成优化、知识增强、实践指南
- 摘要:
检索增强生成(RAG)作为大模型时代的核心技术范式,已成为AI原生应用的“知识引擎”。本文针对AI工程师的实际需求,从第一性原理出发,系统拆解RAG原生应用的架构设计、实现机制与落地优化流程。内容涵盖:RAG的理论本质与问题边界、向量数据库的选型与优化、检索策略的设计(混合检索/重排序)、生成层的上下文融合技巧、多模态扩展与实时性优化等关键议题。通过生产级代码示例、Mermaid架构图与真实案例分析,为工程师提供“可复制、可落地”的最佳实践框架,解决RAG应用中“检索不准、生成幻觉、性能瓶颈”等核心痛点。
1. 概念基础:RAG与原生应用的本质关联
1.1 领域背景化:为什么需要RAG?
大语言模型(LLM)的“预训练-微调”范式存在三大致命局限:
- 幻觉问题:依赖内部参数化知识,易生成不符合事实的内容(例如:“地球半径约1亿公里”);
- 实时性缺失:无法获取训练数据截止后的最新信息(例如:2024年的科技新闻);
- 领域适配难:对于专业领域(如医疗、法律),预训练知识的深度与准确性不足。
RAG(Retrieval-Augmented Generation)的出现,本质是用“外部知识检索”弥补LLM的“内部知识局限”,其核心逻辑可概括为:
用户查询 → 检索外部知识库(结构化/非结构化数据) → 将检索结果作为上下文输入LLM → 生成符合事实的回答
1.2 历史轨迹:从“信息检索”到“知识增强生成”
RAG的演化可分为三个阶段:
- 传统信息检索(IR):1950s-2010s,基于关键词匹配(如BM25)的搜索引擎(Google、百度),解决“找信息”问题;
- 深度学习检索:2010s-2022,基于向量嵌入(如BERT、Sentence-BERT)的语义检索(如Pinecone、Milvus),解决“理解信息”问题;
- RAG范式:2022年至今,由Meta提出的《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》论文奠定基础,将“检索”与“生成”深度融合,解决“用信息生成价值”问题。
1.3 问题空间定义:RAG原生应用的核心挑战
原生应用(Native App)指从需求设计初期就将RAG作为核心组件的应用(而非后期嫁接),其核心问题空间包括:
- 检索有效性:如何从海量数据中快速召回与查询最相关的信息?
- 上下文融合:如何将检索结果高效整合到LLM的生成过程中,避免“信息过载”或“上下文无关”?
- 性能与成本:如何在低延迟(<2秒)与高吞吐量(>1000 QPS)下,平衡向量数据库的存储与计算成本?
- 动态更新:如何处理实时数据(如新闻、库存),确保知识库的时效性?
1.4 术语精确性
- 向量嵌入(Vector Embedding):将文本、图像等非结构化数据转换为高维向量的过程(如OpenAI的text-embedding-3-small、Google的PaLM Embedding),向量的余弦相似度表示数据的语义相关性;
- 召回率(Recall):检索系统从知识库中召回相关文档的比例(例如:100条相关文档中召回90条,召回率为90%);
- 重排序(Reranking):对初始检索结果(如向量检索的Top100)进行二次排序(如用Cross-Encoder模型),提升相关性;
- 上下文窗口(Context Window):LLM能处理的最大输入长度(如GPT-4 Turbo为128k tokens),决定了检索结果的数量上限。
2. 理论框架:RAG的第一性原理与数学建模
2.1 第一性原理推导:RAG的核心逻辑
RAG的本质是**“信息论”与“生成模型”的结合**,其第一性原理可拆解为以下两条公理:
- 公理1:生成模型的输出质量(Q)取决于输入信息的相关性(R)与完整性(C),即 ( Q = f(R, C) ),其中 ( f ) 为单调递增函数;
- 公理2:外部知识库的信息熵(H)低于LLM内部参数化知识的信息熵(( H_{\text{外部}} < H_{\text{内部}} )),因此检索外部知识可降低生成的不确定性。
基于以上公理,RAG的优化目标可定义为:
在上下文窗口约束(( |C| \leq L ),L为LLM最大输入长度)下,最大化检索结果的相关性得分(R-score)与信息覆盖率(C-coverage)。
2.2 数学形式化:检索与生成的联合优化
假设用户查询为 ( q ),知识库中的文档集合为 ( D = {d_1, d_2, …, d_n} ),向量嵌入模型为 ( E(\cdot) ),则:
- 检索阶段:计算查询向量与文档向量的余弦相似度,召回Top-K文档:
[
\text{Top-K}(q) = \arg\max_{d \in D} \cos(E(q), E(d)) \quad (K \leq L/\text{avg}(|d|))
] - 生成阶段:将查询与Top-K文档拼接为上下文 ( C = [q; d_1; d_2; …; d_K] ),输入LLM生成回答 ( a ),其概率分布为:
[
P(a|q, D) = P(a|C) = \prod_{t=1}^{T} P(a_t|a_1,…,a_{t-1}, C)
] - 联合优化目标:最大化生成回答的似然度(Likelihood)与事实准确率(Factuality):
[
\max_{E, K, C} \left( \log P(a|C) + \lambda \cdot \text{Fact}(a, D) \right)
]
其中 ( \lambda ) 为平衡系数,( \text{Fact}(a, D) ) 表示回答与知识库的事实一致性(如用F1-score衡量)。
2.3 理论局限性:RAG的边界
- 检索依赖症:若知识库中无相关信息,RAG的性能会退化至纯LLM水平;
- 上下文过载:当K过大时,LLM无法有效整合所有信息(例如:128k窗口下输入100篇文档,生成的回答可能逻辑混乱);
- 动态性不足:传统向量数据库的更新延迟(如Pinecone的实时更新需要1-2秒),无法处理亚秒级实时数据(如股票价格)。
2.4 竞争范式分析:RAG vs 微调 vs 提示工程
维度 | RAG | 微调(Fine-tuning) | 提示工程(Prompt Engineering) |
---|---|---|---|
知识更新 | 实时(更新知识库即可) | 需重新训练模型(成本高) | 依赖Prompt中的静态信息 |
领域适配 | 灵活(切换知识库即可) | 需领域数据(数据获取难) | 需手动设计Prompt(效率低) |
幻觉问题 | 低(依赖外部知识) | 中(依赖模型参数) | 高(依赖模型“想象”) |
成本 | 中(向量数据库+LLM调用) | 高(模型训练+存储) | 低(仅LLM调用) |
结论:RAG是“动态性”“领域适配性”与“成本”平衡的最优解,适合原生应用的长期迭代。
3. 架构设计:RAG原生应用的系统分解与组件交互
3.1 系统分解:四层架构模型
RAG原生应用的架构可分为数据层、检索层、生成层、应用层,每层的核心组件与职责如下:
graph TD
A[应用层:用户界面/API] --> B[生成层:LLM+Prompt工程]
B --> C[检索层:混合检索+重排序]
C --> D[数据层:知识库+向量数据库]
D --> C[反馈更新:用户反馈/实时数据]
B --> A[输出:回答/结果]
- 数据层:负责知识的存储与管理,包括原始数据(文本、图像、音频)、预处理 pipeline(清洗、分割、嵌入)、向量数据库(存储向量与元数据);
- 检索层:负责从数据层召回相关信息,包括检索策略(向量检索、关键词检索、混合检索)、重排序模型(Cross-Encoder)、上下文压缩(截断/摘要);
- 生成层:负责将检索结果与查询融合生成回答,包括LLM选型(闭源如GPT-4、开源如Llama 3)、Prompt设计(Few-shot、Chain-of-Thought)、上下文融合(顺序/逻辑拼接);
- 应用层:负责与用户交互,包括API接口(如FastAPI)、用户界面(如Web/APP)、反馈循环(收集用户对回答的评分,用于优化检索与生成)。
3.2 组件交互模型:从查询到回答的全流程
以“企业内部知识库问答”为例,组件交互流程如下:
- 用户查询:用户输入“如何申请年假?”;
- 检索触发:应用层将查询传递给检索层,检索层调用向量数据库(如Milvus)进行语义检索,召回Top20文档;
- 重排序:用Cross-Encoder模型(如BERT-base)对Top20文档进行二次排序,得到Top5最相关文档;
- 上下文生成:将查询与Top5文档拼接为上下文(如“用户问如何申请年假,相关政策如下:1. … 2. …”);
- 生成回答:将上下文输入LLM(如GPT-4 Turbo),生成结构化回答(如“申请年假需登录OA系统,填写申请表,经部门经理审批后生效”);
- 反馈更新:用户对回答评分(如“有用”),应用层将反馈传递给数据层,更新向量数据库的文档权重(如增加该政策文档的检索优先级)。
3.3 设计模式应用:提升架构灵活性
- 管道模式(Pipeline Pattern):将数据预处理、检索、生成拆分为独立步骤,通过管道串联(如LangChain的RAG Pipeline),便于扩展(如添加多模态检索);
- 观察者模式(Observer Pattern):当知识库更新时(如新增政策文档),自动触发向量数据库的重新嵌入与索引,确保检索结果的时效性;
- 策略模式(Strategy Pattern):为检索层提供多种检索策略(如向量检索、BM25、混合检索),根据查询类型(如“事实性问题”“开放性问题”)动态选择。
3.4 可视化表示:RAG系统架构图
graph LR
subgraph 数据层
D1[原始数据:文本/图像/音频] --> D2[预处理:清洗/分割/嵌入]
D2 --> D3[向量数据库:Milvus/Pinecone]
D3 --> D4[元数据存储:PostgreSQL]
end
subgraph 检索层
C1[查询解析:意图识别/实体提取] --> C2[检索策略:混合检索(向量+BM25)]
C2 --> C3[重排序:Cross-Encoder]
C3 --> C4[上下文压缩:TextRank/LLM摘要]
end
subgraph 生成层
B1[Prompt设计:Few-shot+CoT] --> B2[LLM选型:GPT-4 Turbo/Llama 3]
B2 --> B3[上下文融合:逻辑拼接/注意力加权]
B3 --> B4[生成优化:温度参数调整/重复抑制]
end
subgraph 应用层
A1[用户界面:Web/APP] --> A2[API接口:FastAPI]
A2 --> A3[反馈系统:用户评分/点击追踪]
A3 --> A4[监控 dashboard:召回率/准确率/延迟]
end
D3 --> C2[检索数据来源]
C4 --> B3[上下文输入]
B4 --> A2[回答输出]
A3 --> D3[反馈更新知识库]
4. 实现机制:从代码到优化的关键步骤
4.1 算法复杂度分析:检索与生成的性能瓶颈
- 向量检索:采用近似最近邻(ANN)算法(如HNSW、IVF),时间复杂度为 ( O(log n) )(n为文档数量),但索引构建时间为 ( O(n log n) )(需预计算向量);
- 重排序:采用Cross-Encoder模型,时间复杂度为 ( O(K \cdot m) )(K为初始检索结果数量,m为文档平均长度),若K=100、m=500 tokens,则每查询需处理50,000 tokens;
- 生成:LLM的生成时间复杂度为 ( O(T \cdot L) )(T为生成 tokens 数量,L为上下文长度),若T=100、L=10,000,则每查询需处理1,000,000 tokens。
优化方向:
- 向量检索:选择低延迟的ANN算法(如HNSW的efSearch参数调整);
- 重排序:限制K值(如K=50),采用轻量级Cross-Encoder模型(如MiniLM);
- 生成:压缩上下文长度(如用LLM摘要将10,000 tokens压缩至2,000 tokens)。
4.2 优化代码实现:基于LangChain的RAG示例
以下是生产级RAG应用的核心代码(基于LangChain 0.2.0、Milvus 2.3.0、GPT-4 Turbo):
from langchain_community.vectorstores import Milvus
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. 数据预处理:分割文档并生成向量
def process_data(raw_texts):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_documents(raw_texts)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = Milvus.from_documents(
documents=chunks,
embedding=embeddings,
connection_args={"host": "localhost", "port": "19530"}
)
return vector_store
# 2. 构建检索链:混合检索+重排序
def build_retrieval_chain(vector_store):
# 混合检索:向量检索(Top100)+ BM25(Top100)
retriever = vector_store.as_retriever(
search_type="hybrid",
search_kwargs={"k": 100, "bm25_k1": 1.5, "bm25_b": 0.75}
)
# 重排序:用Cross-Encoder提升相关性
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
compressor = CrossEncoderReranker(
model_name="cross-encoder/miniLM-L6-H384-uncased",
top_n=5
)
compression_retriever = ContextualCompressionRetriever(
base_retriever=retriever,
base_compressor=compressor
)
return compression_retriever
# 3. 构建生成链:Prompt工程+上下文融合
def build_generation_chain(retriever):
prompt_template = """你是企业内部知识库的问答助手,请根据以下上下文回答用户的问题。如果上下文没有相关信息,请回答“抱歉,我无法找到相关信息”。
上下文:{context}
问题:{question}
回答:"""
prompt = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"]
)
llm = OpenAI(
model_name="gpt-4-turbo",
temperature=0.1, # 降低温度,减少幻觉
max_tokens=500
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 将上下文直接填入Prompt
retriever=retriever,
chain_type_kwargs={"prompt": prompt},
return_source_documents=True # 返回引用的文档,提升可信度
)
return qa_chain
# 4. 应用入口:处理用户查询
if __name__ == "__main__":
# 假设raw_texts是从企业知识库获取的文档集合(如PDF、Word)
raw_texts = [...] # 实际应用中需从数据库或文件系统读取
vector_store = process_data(raw_texts)
retriever = build_retrieval_chain(vector_store)
qa_chain = build_generation_chain(retriever)
# 处理用户查询
user_query = "如何申请年假?"
result = qa_chain.invoke({"query": user_query})
# 输出结果
print("回答:", result["result"])
print("引用文档:", [doc.metadata["source"] for doc in result["source_documents"]])
代码说明:
- 数据预处理:用
RecursiveCharacterTextSplitter
分割文档(避免长文档超过LLM窗口),用OpenAIEmbeddings
生成向量; - 混合检索:结合向量检索(语义相关)与BM25(关键词相关),提升召回率;
- 重排序:用
CrossEncoderReranker
对初始检索结果进行二次排序,保留Top5最相关文档; - 生成优化:用
stuff
链类型将上下文直接填入Prompt(适合短上下文),设置temperature=0.1
减少幻觉,返回source_documents
提升回答可信度。
4.3 边缘情况处理:避免应用崩溃的关键
- 检索结果为空:在Prompt中添加“如果上下文没有相关信息,请回答‘抱歉,我无法找到相关信息’”,避免LLM生成幻觉;
- 多轮对话上下文:用
ConversationBufferMemory
存储历史对话,将历史查询与当前查询拼接为新的查询(如“之前问了如何申请年假,现在问审批流程需要多久”); - 敏感信息过滤:在数据预处理阶段用
Presidio
(微软的隐私保护工具)识别并替换敏感信息(如身份证号、手机号); - 文档过期:在元数据中添加
expiry_date
字段,检索时过滤过期文档(如“2023年的年假政策”)。
4.4 性能考量:低延迟与高吞吐量的平衡
- 缓存优化:用
Redis
缓存高频查询的检索结果与生成回答(如“如何申请年假”的回答缓存1小时); - 异步处理:用
Celery
将检索与生成任务异步化(如用户查询触发异步任务,处理完成后通过WebSocket推送结果); - 水平扩展:向量数据库(如Milvus)支持水平扩展(增加节点),提升检索吞吐量;LLM调用(如GPT-4 Turbo)支持批量处理(一次调用处理10个查询),降低单位成本。
5. 实际应用:从MVP到规模化部署的策略
5.1 实施策略:从最小可行产品(MVP)开始
RAG原生应用的实施应遵循**“小步快跑、快速迭代”的原则,MVP阶段的核心目标是验证检索与生成的有效性**,具体步骤如下:
- 选择场景:选择一个具体的业务场景(如“企业内部知识库问答”“电商产品推荐”),避免泛化;
- 构建知识库:收集该场景下的核心数据(如企业政策文档、产品说明书),数量控制在100-1000篇;
- 实现基础RAG:用LangChain或LlamaIndex构建基础的RAG流程(向量检索+生成),无需复杂优化;
- 验证效果:邀请10-20名目标用户(如企业员工、电商客服)测试,收集“检索相关性”“生成准确性”“用户满意度”等指标;
- 迭代优化:根据用户反馈优化检索策略(如增加BM25混合检索)、生成Prompt(如添加Few-shot示例)。
5.2 集成方法论:结合业务场景定制RAG
不同业务场景的RAG需求差异较大,以下是两个典型场景的集成示例:
-
场景1:电商产品推荐
- 知识库:产品说明书、用户评论、竞品信息;
- 检索策略:结合用户查询(如“适合跑步的运动鞋”)与用户行为(如浏览历史、购买记录),用个性化向量检索(如将用户向量与产品向量拼接);
- 生成优化:生成结构化推荐结果(如“推荐以下3款适合跑步的运动鞋:1. 品牌A,特点:轻便、缓震;2. 品牌B,特点:透气、耐磨”),并添加“用户评价”(如“90%的用户认为这款鞋跑步很舒服”)。
-
场景2:医疗问答
- 知识库:医学教材、临床指南、药品说明书;
- 检索策略:用领域专用向量嵌入(如BioBERT)提升医学术语的语义相关性;
- 生成优化:生成符合医疗规范的回答(如“根据《2024年高血压诊疗指南》,建议服用XX药物,剂量为XX”),并添加“风险提示”(如“请在医生指导下使用”)。
5.3 部署考虑因素:云服务与 scalability
- 云服务选择:
- 向量数据库:优先选择托管型向量数据库(如AWS Kendra、阿里云向量数据库),降低运维成本;
- LLM调用:闭源模型(如GPT-4 Turbo)选择官方API(如OpenAI API),开源模型(如Llama 3)选择模型托管服务(如AWS SageMaker、Google Vertex AI);
- 应用层:用Serverless架构(如AWS Lambda、阿里云函数计算)提升 scalability,降低 idle 成本。
- Scalability设计:
- 向量数据库:采用**分片(Sharding)**技术,将文档按主题(如“产品”“政策”)分片存储,提升检索效率;
- 应用层:用负载均衡(如Nginx、AWS ELB)分配用户请求,避免单点故障;
- 缓存:用分布式缓存(如Redis Cluster)存储高频查询结果,提升吞吐量。
5.4 运营管理:监控与迭代
- 监控指标:
- 检索层:召回率(Recall@K)、精确率(Precision@K)、检索延迟(<200ms);
- 生成层:事实准确率(Factuality,用FactCheck工具衡量)、生成延迟(<2秒)、用户满意度(CSAT,用1-5分评分);
- 系统层:吞吐量(QPS)、错误率(<1%)、成本(每查询成本<0.01元)。
- 迭代流程:
- 收集数据:通过监控 dashboard 收集指标数据,通过用户反馈收集定性数据;
- 分析问题:例如,若召回率低(<80%),则优化向量嵌入模型(如换用更大的模型)或检索策略(如增加BM25混合检索);
- 验证优化:在 staging 环境测试优化效果,确保指标提升(如召回率提升至90%);
- 部署上线:用蓝绿部署(Blue-Green Deployment)或滚动部署(Rolling Deployment)将优化后的版本上线,避免影响用户。
6. 高级考量:RAG的未来演化与风险
6.1 扩展动态:多模态RAG与实时RAG
- 多模态RAG:支持文本、图像、音频等多模态数据的检索与生成(如“根据用户上传的产品图片,生成产品描述”),核心挑战是多模态向量嵌入(如CLIP模型)与多模态上下文融合(如将图像特征与文本上下文拼接);
- 实时RAG:支持流式数据的实时检索与生成(如“根据最新的新闻,生成股票分析”),核心挑战是低延迟向量数据库(如Redis Vector DB,延迟<100ms)与实时数据预处理(如用Flink处理流式数据,实时生成向量)。
6.2 安全影响:避免恶意利用与数据泄露
- 恶意检索:攻击者可能通过构造恶意查询(如“如何制造炸弹”)检索知识库中的敏感信息,需在检索层添加内容过滤(如用OpenAI的Content Moderation API);
- 数据泄露:向量数据库中的文档可能包含敏感信息(如企业机密),需采用加密存储(如Milvus的加密功能)与访问控制(如IAM角色,限制只有授权用户能访问);
- 模型滥用:攻击者可能通过RAG生成恶意内容(如虚假新闻),需在生成层添加输出审核(如用Google的Perspective API检测毒性内容)。
6.3 伦理维度:公平性与透明度
- 公平性:RAG的检索结果可能受知识库数据分布的影响(如知识库中男性相关内容多于女性),需采用公平性评估工具(如IBM的AI Fairness 360)检测并纠正偏差;
- 透明度:用户有权知道回答的来源(如“该回答基于企业2024年的年假政策”),需在生成结果中添加来源引用(如代码示例中的
source_documents
); - 责任性:若RAG生成的回答导致用户损失(如医疗建议错误),需明确责任主体(如应用开发者、LLM提供商),并建立赔偿机制。
6.4 未来演化向量:从“规则驱动”到“自学习”
RAG的未来演化方向是**“自学习RAG”**(Self-Learning RAG),核心特征是:
- 自动知识库更新:通过爬虫或API自动收集实时数据(如新闻、社交媒体),并更新向量数据库;
- 自动检索优化:通过强化学习(RL)自动调整检索策略(如K值、重排序模型),最大化生成质量;
- 自动生成优化:通过微调(Fine-tuning)自动优化LLM的生成策略(如Prompt tuning),提升事实准确率。
7. 综合与拓展:RAG的跨领域应用与开放问题
7.1 跨领域应用:从企业到消费级产品
- 企业级应用:内部知识库问答、客户服务聊天机器人、合同审核系统;
- 消费级应用:智能助手(如Siri、Alexa)、教育辅导(如作业帮、猿辅导)、旅游规划(如携程、飞猪);
- 科研领域:文献综述生成、实验设计辅助、学术论文写作。
7.2 研究前沿:RAG的未解决问题
- 多轮对话中的上下文管理:如何在多轮对话中有效管理上下文(如避免重复检索),提升对话连贯性;
- 长文档的检索与生成:如何处理长文档(如100页的合同),避免上下文过载;
- 跨语言RAG:如何支持多语言检索与生成(如中文查询检索英文文档,生成中文回答);
- RAG与微调的结合:如何将RAG与微调结合(如用RAG生成的回答微调LLM),提升模型的领域适配性。
7.3 战略建议:AI工程师的能力培养
- 技术栈:掌握向量数据库(Milvus、Pinecone)、LLM框架(LangChain、LlamaIndex)、云服务(AWS、阿里云);
- 业务理解:深入理解所在领域的业务需求(如医疗、电商),定制RAG策略;
- 伦理意识:关注RAG的安全与伦理问题,避免技术滥用;
- 持续学习:跟踪RAG的最新研究(如ArXiv的论文、LangChain的更新),保持技术领先。
结语
RAG作为AI原生应用的核心技术,其价值不仅在于“解决大模型的幻觉问题”,更在于“构建可扩展、可迭代的知识引擎”。对于AI工程师而言,掌握RAG的最佳实践,不仅能提升应用的性能与用户体验,更能在大模型时代占据技术制高点。
本文从概念基础到架构设计,从代码实现到规模化部署,为工程师提供了“全流程、可落地”的RAG实践框架。未来,随着多模态RAG、实时RAG等技术的发展,RAG将进一步渗透到更多领域,成为AI应用的“基础设施”。
参考资料:
- 《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(Meta, 2022);
- LangChain官方文档:https://python.langchain.com/;
- Milvus官方文档:https://milvus.io/;
- 《RAG: A Survey on Retrieval-Augmented Generation》(ArXiv, 2023);
- OpenAI API文档:https://platform.openai.com/docs/。