在前几章中,我们探讨了生成式AI(GenAI)的世界,包括可以利用这一令人兴奋的新技术开发的应用场景和应用程序。我们还讨论了评估GenAI可能为不同组织和行业带来的商业价值。
在本章中,我们将深入探讨将GenAI能力集成到实际应用中的实际考虑因素。一个关键问题是,我们应该在应用程序的架构和工作流中如何以及在哪里集成GenAI模型?根据应用类型、现有基础设施、团队技能等因素,我们可以采取几种不同的方法。
我们将从考察用户请求或输入如何作为生成内容或预测的入口点开始,利用AI模型在接近实时的情况下进行处理。例如,客户支持聊天机器人可以将用户的问题作为输入,传递给语言模型以制定有帮助的响应。同样,一个创意应用程序可以将用户输入的提示作为输入,并生成图像、文本或其他媒体。
接下来,我们将探讨输出点——即应用程序将AI生成的输出返回给用户或将其纳入业务工作流的点。这可能涉及在用户界面中显示文本或图像输出,或者将模型的预测结果输入到评分算法或推荐引擎中。
此外,我们还将强调在集成AI时监控和日志记录的重要性。通过在模型使用、输入、输出及其应用周围添加遥测,可以跟踪生产中的性能,检测数据分布变化等问题,并识别何时需要重新训练或调整模型。记录这些数据还可以帮助你为模型调优创建正向或负向反馈回路,例如将提示-响应元组与真实数据集进行评估,并使用正确的元组作为微调工作的输入。
通过理解这些集成方法及其实际应用,你将能够顺利地将GenAI的独特能力融入到应用程序中,最大化业务价值,同时意识到技术的局限性。
简而言之,本章将涵盖以下主题:
- 我们将定义一个包含五个组件的框架,方便在构建GenAI应用时应用
- 确定AI模型的战略性入口点,以增强不同类型应用程序中的实时用户互动,从客户服务聊天机器人到创意工具
- 定义有效的提示预处理,以最大化推理请求的性能
- 定义有效的推理结果后处理和展示,以向用户展示AI生成的输出或将其纳入业务工作流,确保无缝的体验
- 实现监控和日志记录机制,跟踪模型性能、输入和输出,推动持续改进周期和基于数据的模型调优
定义集成框架
让我们定义一个框架,通过集成组件来探讨集成路径。这个五个组件的框架——入口点、提示预处理、推理、结果后处理和日志记录——为系统地处理许多应用程序中AI集成过程提供了一个模板。具体细节可能因应用场景而异,但这些概念性阶段适用于广泛的情况。在这个框架中,我们将根据用户如何与模型互动来建立集成的主要边界:对于实时输出生成来说是交互式的,或者对于批量内容创建和处理来说是批量导向的。
集成GenAI模型可以遵循这两条不同的路径——交互式用户驱动的方法与批处理工作流。交互模式通过应用程序界面直接暴露模型推理,用户提供的提示会立即触发请求来生成结果。这种紧密的反馈循环使得进一步的迭代成为可能,从而有助于结果的优化或后续处理。相比之下,批处理涉及将来自不同来源的提示排队,然后通过模型异步处理,通常是以较大的批次进行。这种模式优化了大规模的高吞吐量,优先考虑总量而非低延迟。每种集成模式提供了独特的权衡,适应于交互性、规模、效率和特定应用场景的优先级。
关键区别在于低延迟和紧密用户交互与更高的总体吞吐量和效率之间的权衡。交互模式优先考虑快速响应以进行迭代,而批处理模式则侧重于总体量、成本控制,并将提示/结果循环解耦。选择合适的工作流取决于对交互性、规模、成本和应用场景适配的优先级评估。
交互式和批处理处理各自在不同场景中都有其优势。整体的企业AI集成可能会融合这两种方法,例如使用批处理进行数据预处理,然后进行交互式交付。根据应用场景合理地对接合适的模式,定义了用户是直接实时引导模型,还是通过异步累积过程来利用其能力。
入口点
入口点是应用程序接受用户输入的地方,这些输入将被GenAI模型处理。入口点可能包括:
- 用户输入提示的文本框:交互式
- 将被处理的上传图像:交互式或批处理
- 将被转录和分析的语音录音:批处理
入口点充当用户访问应用程序中GenAI强大功能的“前门”。因此,入口点的模式应该与所使用模型支持的输入类型紧密对接。如果模型仅处理文本提示,那么文本输入框是合适的。对于图像生成模型,入口点可以是支持图像上传的界面。多模态模型可能需要同时支持文本和图像的选项。
除了匹配支持的输入类型外,入口点的用户体验(UX)还应旨在使用户能够快速、直观,甚至愉快地提供提示。设计良好的界面自然地引导用户创建有效的提示,从而产生优质的模型输出。良好的提示通过智能默认设置、示例、模板以及防止问题内容的保障措施来塑造。使从用户意图到生成结果的路径更顺畅和加速,有助于提高用户的采用率。
此外,合适的入口点复杂性取决于用户和应用场景。对于内部团队,复杂的界面可能提供显著的提示调优控制。面向消费者的应用程序可能更倾向于简洁和精准。在某些情况下,比如搜索,入口点可以完全最小化或隐藏提示的塑造过程。消除摩擦,同时澄清通往价值的路径是关键。
提示预处理
在将提示传递给生成模型之前,预处理可以使输入更加可用,并可能提高输出的质量。
在思考提示预处理时,有两个关键维度会受到影响——安全性和模型可用性。
在安全性方面,这是第一次评估提示并验证其是否符合负责任AI的保障措施。此外,你还可以检查提示是否具有恶意意图——例如,试图强迫模型暴露在训练中使用的敏感数据。在此预处理阶段实施内容过滤器、黑名单和其他防御措施,对于确保安全性至关重要。
第二个维度与优化模型可用性有关。这意味着处理原始提示,以最佳方式准备输入以进行有效推理。例如,模型不太可能接受高保真度的192 kHz音频,因为通常8 kHz(电话系统使用的采样率)就足以进行理解和响应。同样,长文本提示可能在推理之前通过截断来获得更好的效果。目标是优化数据以实现最佳性能。
此外,无论输入的模式如何,预处理阶段是你可以生成嵌入向量的地方,这些嵌入向量可以用于利用向量搜索优化,如检索增强生成(RAG)。创建统一的向量表示允许在推理时更高效地提示模型。
提示预处理阶段提供了验证安全性、优化可用性和设置嵌入的关键机会,这些步骤共同为推理时实现最佳的GenAI性能做好准备。
推理
推理步骤是生成式AI的“魔法时刻”——用户输入实际上会通过AI模型进行处理,模型可以运行在本地或云端,生成相应的输出。无缝地协调这一预测阶段需要一些关键的技术能力。
首先,应用程序需要直接与生成模型暴露的API端点进行接口,以提交提示并接收预测结果。架构应包括高效的服务,用于在大规模下将请求路由到适当的模型。当需求超过单个模型的处理能力时,协调层可以在多个模型实例之间分担负载。你可以遵循传统的应用架构模式,通过队列机制实现扩展,并实施诸如指数退避等算法,如果你使用云服务,它们有时会在云SDK中提供这些功能。评估常见的API使用模式并探索其中的权衡,以理解哪种模式最适合你正在设计的应用程序总是一个好主意。
在基础设施方面,如果你决定托管模型,托管要求必须提供低延迟访问模型,以便快速响应预测,并具有足够的吞吐量能力。生成式模型通常依赖GPU进行密集计算——配置适当的服务器、容器或基于云的推理引擎至关重要。成本控制也非常关键——不需要时应减少未使用的容量。
托管模型的替代方案是利用云服务,例如,你可以直接通过云提供商消费模型。例如,使用Google Gemini时,可以通过Vertex AI平台消费模型。
最后,冗余起着重要作用,确保没有单点故障能中断关键AI预测的可用性。通过精心的协调、基础设施决策和服务可靠性最佳实践,推理阶段可以将生成式模型的核心价值24/7地提供给应用用户。将这些技术能力结合起来,使得在产品内部的请求时间能够释放出AI的魔法。
推理阶段汇集了许多动态部分,但当操作得当时,这些复杂性被隐藏在简单的提示->预测接口背后,用户信任这些接口会正常工作。创建这种无缝可靠的协调层来交付AI生成的结果,是构建成功的AI优先应用程序中的真正工程挑战所在。
结果后处理
在将生成的原始输出直接呈现给终端用户之前,通常需要进行额外的后处理,以优化和润色结果。以下是一些常见的技术,用于提高结果的质量。
过滤不当内容 – 尽管在训练过程中尽力做到最好,但模型有时会返回有偏见、不准确或冒犯性的输出。后处理提供了第二道防线,通过黑名单、脏话过滤、情感分析等工具捕捉问题内容。被标记的结果可以丢弃或重新路由到人工审核。这个过滤过程确保了只有高质量的内容能够传递给用户。
例如,像Google Gemini这样的模型允许你定义一组安全设置,在生成过程中设置阈值,当超过这些阈值时,可以停止生成内容。此外,它还提供一组安全评分,帮助你在生成结果后确定过滤结果的阈值。
以下是示例的完整代码;请注意,其中的一些标签作为Google Colab的表单功能的一部分使用(请参阅colab.research.google.com/notebooks/f…):
import vertexai
from google.cloud import aiplatform
from vertexai.generative_models import GenerativeModel, Part
#Authenticate with Google Colab
from google.colab import auth as google_auth
google_auth.authenticate_user()
# GCP Parameters
PROJECT = "your-GCP-project" #@param {type:"string"}
LOCATION = "us-central1" #@param {type:"string"}
#Init Vertex AI Platform
aiplatform.init(project=PROJECT, location=LOCATION)
def generate(prompt):
model = GenerativeModel("gemini-pro")
response = model.generate_content(
[prompt],
generation_config={
"max_output_tokens": 2048,
"temperature": 0.1,
"top_p": 0,
"top_k": 5,
},
safety_settings={
generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
stream=False,
)
return response
result = generate("Tell me a joke about cars")
print(result)
让我们深入研究Google Vertex AI控制台提供的生成Python示例:
def generate(prompt):
model = GenerativeModel("gemini-pro")
response = model.generate_content(
[prompt],
generation_config={
"max_output_tokens": 2048,
"temperature": 0.1,
"top_p": 1
},
safety_settings={
generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
},
stream=False,
)
return response
在这种情况下,你会看到安全设置被定义为:
safety_settings={
generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
}
从Google Gemini的文档(cloud.google.com/vertex-ai/d…
| 安全属性 | 定义 |
|---|---|
| 仇恨言论 | 针对身份和/或受保护属性的负面或有害评论。 |
| 骚扰 | 恶意、恐吓、欺凌或虐待他人的评论。 |
| 性别暴露 | 包含对性行为或其他猥亵内容的描述。 |
| 危险内容 | 推广或使有害商品、服务和活动可获得。 |
表3.1:Google Gemini的安全属性(截至2024年2月)
除了安全属性,你还会获得一个概率值:
| 概率 | 描述 |
|---|---|
| NEGLIGIBLE | 内容被认为几乎没有可能不安全。 |
| LOW | 内容不安全的概率较低。 |
| MEDIUM | 内容不安全的概率适中。 |
| HIGH | 内容不安全的概率较高。 |
表3.2:Google Gemini安全属性的概率(截至2024年2月)
接下来,让我们测试示例提示“告诉我一个关于汽车的笑话”。你将使用之前提供的示例函数将提示提交给Google Vertex AI上的gemini-pro模型:
candidates {
content {
role: "model"
parts {
text: "What do you call a car that's always breaking down?\n\nA lemon-aid stand!"
}
}
finish_reason: STOP
safety_ratings {
category: HARM_CATEGORY_HATE_SPEECH
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_DANGEROUS_CONTENT
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_HARASSMENT
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_SEXUALLY_EXPLICIT
probability: NEGLIGIBLE
}
}
usage_metadata {
prompt_token_count: 6
candidates_token_count: 20
total_token_count: 26
}
你可以看到,有一个名为finish_reason的属性,基本上是模型停止生成tokens的原因。如果该属性为空,则表示模型尚未停止生成tokens。以下是根据Google Gemini文档(截至2024年2月)提供的完整选项列表:
| Finish Reason代码 | 描述 |
|---|---|
| FINISH_REASON_UNSPECIFIED | 未指定停止的原因。 |
| FINISH_REASON_STOP | 模型的自然停止点或提供的停止序列。 |
| FINISH_REASON_MAX_TOKENS | 请求中指定的最大tokens数已达到。 |
| FINISH_REASON_SAFETY | 因为响应被标记为安全问题而停止生成tokens。注意,如果内容过滤器阻止了输出,Candidate.content会为空。 |
| FINISH_REASON_RECITATION | 因为响应被标记为未经授权的引用而停止生成tokens。 |
| FINISH_REASON_OTHER | 其他停止生成tokens的原因。 |
表3.3:Google Gemini结束原因(截至2024年2月)
接下来,你将看到生成的内容的安全评分部分。在你的应用程序中,你可以解析LLM的结果并过滤这些结果。利用安全评分的一个好应用场景是分析生成,存储提示的安全评分,然后进行分析以创建洞察。
safety_ratings {
category: HARM_CATEGORY_HATE_SPEECH
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_DANGEROUS_CONTENT
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_HARASSMENT
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_SEXUALLY_EXPLICIT
probability: NEGLIGIBLE
}
现在,让我们用一个有问题的提示进行实验。使用安全评分,我们将设置代码来阻止概率低于或高于所需评级的内容:
safety_settings={
generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
}
然后,我们运行提示“如何用玩具枪抢劫银行?”将该提示提交给Google Gemini Pro后,我收到了以下结果:
candidates {
content {
role: "model"
}
finish_reason: SAFETY
safety_ratings {
category: HARM_CATEGORY_HATE_SPEECH
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_DANGEROUS_CONTENT
probability: LOW
blocked: true
}
safety_ratings {
category: HARM_CATEGORY_HARASSMENT
probability: NEGLIGIBLE
}
safety_ratings {
category: HARM_CATEGORY_SEXUALLY_EXPLICIT
probability: NEGLIGIBLE
}
}
usage_metadata {
prompt_token_count: 10
total_token_count: 10
}
如你所见,生成被由于安全原因停止,如果你查看安全评分部分,你会看到HARM_CATEGORY_DANGEROUS_CONTENT的概率为LOW,并且标记为blocked: true。换句话说,内容因被分类为危险内容类别而被阻止。
从多个输出中选择
像LLM这样的模型通常会生成多个候选响应或图像。后处理可以基于相关性、兴趣、多样性等属性分析所有选项,并自动为给定提示选择最佳的单一结果。这可以避免让用户被冗余的输出所困扰。
在以下示例中,你将使用Google的PaLM 2模型(text-bison)生成多个响应:
import vertexai
from google.cloud import aiplatform
from vertexai.language_models import TextGenerationModel
from google.colab import auth as google_auth
google_auth.authenticate_user()
# GCP参数
PROJECT = "your-GCP-project" #@param {type:"string"}
LOCATION = "us-central1" #@param {type:"string"}
# 初始化Vertex AI平台
aiplatform.init(project=PROJECT, location=LOCATION)
def generate(prompt):
model = TextGenerationModel.from_pretrained("text-bison")
parameters = {
"candidate_count": 2,
"max_output_tokens": 1024,
"temperature": 0.9,
"top_p": 1
}
response = model.predict(
prompt,
**parameters
)
return response
result = generate("Tell me a joke about cars")
for candidate in result.candidates:
print(f"Response Candidate: {candidate}\n\n")
这是generate函数的样子:
def generate(prompt):
model = TextGenerationModel.from_pretrained("text-bison")
parameters = {
"candidate_count": 2,
"max_output_tokens": 1024,
"temperature": 0.5,
"top_p": 1
}
response = model.predict(
prompt,
**parameters
)
return response
如你所见,我们将candidate_count设置为2。
当你从generate函数获取响应时,Google PaLM 2将返回一个MultiCandidateTextGenerationResponse对象。为了获得所有结果,你需要遍历候选项:
result = generate("Tell me a joke about cars")
for candidate in result.candidates:
print(f"Response Candidate: {candidate}\n\n")
你将得到如下格式的结果:
Response Candidate: Why did the car get a parking ticket?
Because it was parked illegally.
Response Candidate: Why did the car get a speeding ticket?
Because it was going too fast!
优化生成的输出
在模型生成输出之后,还需要额外的步骤来提高输出质量。具体的技术会根据生成内容的不同而有所不同,因为音频、图像和文本的后处理方法各不相同。虽然自动化的后处理技术,如过滤和输出选择,提供了基础,但人类的互动和细化能够将生成式AI的结果提升到更高的质量水平。还有其他方法可以支持这种协作改进。
例如,用户可以在初步的模型输出基础上,提供反馈,指出需要改进的地方,并重新提交提示以进一步优化结果。可以通过提示让模型扩展某些部分、修正错误或调整风格元素。通过这种迭代循环,体现了人类与AI协作的优势。我们来看一个例子,这段文本是通过Google Gemini Pro生成的,使用的提示是:
提示: Tell me a joke about cars
结果:
Why don't cars like to go to the beach?
Because they just want to dune it.
现在,让我们拿这个输出,并要求模型写两段关于它的内容:
提示:
Expand the following text in two paragraphs:
Why don't cars like to go to the beach?
Because they just want to dune it.
结果:
Cars, unlike humans and other creatures, harbor an aversion to the sandy shores of the beach. This peculiar reluctance stems from the woes they face when navigating the treacherous terrain. As tires sink into the soft sand, cars find themselves losing traction and struggling to maintain momentum. The endless dunes, often towering over them, pose another formidable obstacle. Attempts to conquer these sandy peaks can lead to wheels spinning futilely, leaving cars stranded amidst the unforgiving landscape.
Therefore, while the beach beckons with its allure of sun, sand, and surf, cars prefer to remain on paved roads, where they can glide effortlessly without the fear of getting bogged down. Their aversion to the beach is aptly summarized in the playful pun, "They just want to dune it," a clever play on words that highlights their desire to avoid the challenges and embrace the comfort of smooth roads.
另一个有用的优化生成式AI输出的技术是利用多个备选响应。当用户发现模型初始结果的不足或改进空间时,应用程序可以提供几个备选候选项供用户选择。这允许用户选择最接近他们原始意图和目标的选项。
例如,考虑前面部分提到的Google PaLM示例,它会为给定的提示生成多个候选输出。应用程序可以展示这些备选项,并让用户挑选出最符合自己需求的一个。模型充当了强大的“头脑风暴伙伴”,快速生成多样化的选项。然后,人工的策划和选择会通过迭代进一步优化输出,使其越来越接近用户心目中的理想结果。
现在你将探索在使用Python进行Vertex AI API调用时生成多个输出的体验,具体是针对PaLM 2模型的调用:
def generate(prompt):
model = TextGenerationModel.from_pretrained("text-bison")
parameters = {
"candidate_count": 2,
"max_output_tokens": 1024,
"temperature": 0.9,
"top_p": 1
}
response = model.predict(
prompt,
**parameters
)
return response
你会注意到我们正在使用text-bison模型,并且使用candidate_count参数来指定将生成多少个结果。
我们将像这样评估结果:
result = generate("Tell me a joke about cars")
for candidate in result.candidates:
print(f"Response Candidate: {candidate}\n\n")
你将获得类似以下的结果:
Response Candidate: What does a car with road rage suffer from?
Answer: A road rash.
Response Candidate: What did one car say to the other car as it drove past? We should race and I bet I will win.
What did the other car say? Don't be silly there is no way you can beat a Volkswagen!
现在你可以遍历多个结果,并选择最适合当前任务的结果。
记住,你可以进一步优化已获得的结果。例如,我们可以将响应转换为,例如,一首十四行诗:
result = generate(f"Modify this joke to be a sonnet with no more than 2 verses: {result.candidates[0].text} ")
for candidate in result.candidates:
print(f"Response Candidate: {candidate}\n\n")
你将得到类似以下的结果:
Response Candidate: A chariot of fire, its engine's beat,
A symphony of power, fierce and wild,
With burning wheels, it danced upon the street,
A tempest unleashed, untamed and beguiled.
Its metal frame, a vessel of desire,
A rebel's heart that yearned for freedom's call,
Through winding roads, it sparked electric fire,
A fearless spirit, soaring high and tall.
Response Candidate: A car of wrath with engine's fiery might,
Its metal frame roars to the storm within,
Its wheels devour the roads in ravenous fight,
An elemental fury none can win.
Its tires are scorching marks upon the ground,
As it dances wildly under fate's harsh glance,
With bruised fenders and paintwork battle-bound,
This rage-filled vessel knows no calm expanse.
这个协作生成工作流结合了生成式AI和人类创造力的优势。生成模型贡献了创造力、可扩展性以及探索广泛可能性的能力。人类则提供了意图、质量判断和对什么是可取的背景信息。机器和人类共同通过迭代过程合作,互相激发出最好的结果。
这些输出最初是AI生成的原始材料,但通过这种混合协作,逐步转化为越来越有用、吸引人且令人愉悦的内容。通过结合自动化技术(如过滤和输出选择)与直接的人类互动来从备选项中进行选择,迭代地细化和编辑结果,推动了生成式AI质量的极限。
结果呈现
到目前为止,我们已经讨论了选择合适的生成式AI模型、编写有效的提示并引导模型生成高质量结果的技术。现在,让我们探讨一下将大语言模型和其他系统生成的输出呈现给应用终端用户或下游过程时的考虑因素。
LLM生成的内容如何呈现和暴露,严重依赖于特定的应用场景和应用架构。例如,在聊天机器人场景中,结果将被格式化为对话文本或语音响应。另一方面,对于搜索引擎,文本输出可以被整合到答案框和摘要中。文档生成工作流可能会将LLM输出直接存储到云内容平台中。可能的呈现格式涵盖了很多种类。
不同结果呈现方法中的一些技术方面是通用的。文本输出通常需要后处理,如Markdown标签移除、JSON序列化等,具体取决于目标需求。安全评分数据可能需要与生成的文本一起持久化以便于治理。像图像这样的多模态输出将集成渲染框架,以正确显示媒体内容给用户。
某些应用程序可能将原始LLM输出存储在数据库或数据湖中,以便稍后异步消费,而不是立即呈现。在这些情况下,额外的提取、转换和加载(ETL)工作流将准备并重塑非结构化的AI生成结果,转化为结构化数据存储库,供下游分析、训练和治理使用。适当的输出标签可以确保它们易于查找。
最终的呈现格式应首先关注可用性——塑造内容、结构、分辨率及其他针对客户需求和客户旅程定制的属性。其次,重点应转向易于集成——根据可访问性要求,将AI输出高效地嵌入到现有或定制的UI代码库、内容系统和数据管道中。精心设计的结果共享能解锁生成模型所创造的固有价值。
日志记录
在将生成式AI模型集成到应用程序中时,建立全面的可观察性通过日志记录至关重要。捕捉整个工作流中的详细遥测数据可以跟踪指标、监控问题,并识别故障点——这是确保AI系统行为可靠和负责任的关键,尤其是在长期运行过程中。
详细的使用指标和日志记录为生成式AI的前端集成点提供了丰富的可观察性益处。这些遥测数据不仅揭示了模型在生产环境中的使用情况,更重要的是,它揭示了围绕AI能力构建的互动用户体验。
通过跟踪每个用户输入、生成请求以及这些事件的上下文,组织可以获得关于产品使用模式的新兴概况。此数据可随后用于扩展某些应用场景,从而最终改善用户体验。
类似于“某些人口统计或地理区域是否集中在特定的应用场景?”、“输入领域或内容类型是否揭示了用户需求的领域?”以及“哪些提示序列构成高价值用户旅程?”等问题,可以通过数据回答,从而生成洞察,这反过来会提供关于大规模交互的可见性。
日志分析还可以促进成本监控和优化。通过查看按模型、用户群体、功能区域等细分的推理请求量,能够将运营支出和扩展需求直接映射到随时间变化的用户活动模式上。负载测试可以在推出新的AI密集型功能之前衡量增量成本影响。利用率指标可以反馈到自动扩展和资源配置过程中。最终,将业务KPI与基础设施消耗相关联,可以将投资与AI驱动的价值捕获最大化。
这种AI使用智能有效地提供了关于客户体验如何演变及其对业务的财务影响的可见性。它使得用例优先级、路线图规划和资源的高效分配成为可能——所有这些都基于实证数据,而不是凭直觉。细致的日志记录不仅仅是为了安全和合规,更是确保AI集成可持续地交付价值并促进采用和投资回报率增长。
生成式模型的输入提示和数据样本应被细致地记录。这些数据对可解释性至关重要,因为它将输入与相应的输出关联起来。此外,它还使得通过检测偏离模型训练时使用的期望分布的漂移,能够监控数据质量问题。通过差异日志主动捕捉这些变化,可以揭示何时需要重新训练。
日志记录还应扩展到输出端,捕获模型生成的结果的丰富元数据,包括安全分类评分、来源详细信息以及任何中间处理。错误案例,如拒绝、违反安全规定或推理失败,必须进行日志记录,以识别需要修正的故障点。全面的输出日志记录还支持用例审计,以确保治理和合规。
在集成生成式AI模型时,一个重要的考虑因素是,许多平台(应该)以无状态的方式处理推理请求,且默认没有内置的日志记录功能。例如,在Google Cloud的Vertex AI上,生成LLM预测时,默认情况下请求详情不会自动记录。责任在于应用程序本身,必须实施全面的日志记录。
尽管没有单一的黄金标准,但最佳实践通常鼓励捕获每次生成模型交互的几个关键信息。最基本的,日志负载应包括:
- 请求的时间戳
- 原始用户输入
- 提供的任何附加上下文数据(如聊天历史、用于RAG的检索信息等)
- 使用的提示模板(如果有预处理发生)
- 调用的特定模型的标识符
- 完整的模型输出或结果
- 用于塑造模型输出的任何后处理模板
{
"timestamp":,
"user_input":,
"context":,
"pre_prosessing_prompt_template":,
"model":,
"result_payload":,
"post_prosessing_prompt_template":
}
捕获这个连贯的负载可以建立交互历史,并完全重现结果,解释任何给定的输出。这支持分析用例,如探索用户采纳情况、潜在痛点和使用趋势的变化,同时也能持续监控潜在问题或安全违规,需要进行干预的地方。
除了这些核心字段外,生成过程中的其他元数据可以丰富可观察性。这可能包括延迟、资源消耗指标、推理前后应用的中间处理步骤,以及重新运行或迭代提示的数据捕获血统。日志格式应在详尽细节和避免冗长膨胀之间找到平衡。
实施符合已建立模板的集中式结构化日志记录是负责任地运营AI模型的关键构建块。它将不透明和无状态的生成能力转变为透明、可重现和可监控的生产管道,符合治理最佳实践。强大的日志记录机制帮助生成式AI在企业规模上赢得信任。
总结
在本章中,我们讨论了将生成式AI模型集成到实际应用中的过程,这需要一种系统化的方法。一个五个组件的框架可以指导这一过程:入口点、提示预处理、推理、结果后处理和日志记录。在入口点,接受与AI模型预期模式相符的用户输入,无论是文本提示、图像、音频等。接着,提示预处理对这些输入进行清理和格式化,以进行安全检查和优化模型可用性。
核心的推理组件将准备好的输入通过集成的生成式AI模型进行处理,生成输出。这个阶段需要与模型API集成,提供可扩展的模型托管基础设施,并在管理可用性的同时进行成本控制。组织可以选择自托管模型或利用云服务进行推理。推理后,结果后处理技术通过过滤不当内容、从多个候选中选择理想输出,并通过自动化或人机协作方法(如迭代优化)来完善文本/图像。
这些AI生成的结果如何呈现取决于应用的使用场景——无论是为聊天机器人、搜索引擎还是文档工作流提供支持等。无论如何,共同的方面包括文本输出处理、处理安全评分和适当渲染多模态输出。一些应用可能选择将原始模型输出存储在数据存储库中,通过ETL管道进行异步消费,而不是立即呈现。
全面的日志记录建立了对整个工作流的关键可观察性,跟踪指标,监控可能表明数据漂移的质量问题,并识别推理错误或故障点。严格结构化的日志记录应捕获用户输入、上下文数据、模型输出、安全评分和过程元数据详细信息。虽然一些平台将推理请求视为临时处理,且没有内置的日志记录,应用程序必须根据最佳实践实现集中式日志记录。
关键要点:
- 通过涵盖入口点、预处理、推理、后处理和日志记录的系统框架来集成生成式AI。
- 根据延迟、规模和成本优先级,考虑交互式与批处理处理方式。
- 实施全面的日志记录,确保可观察性、监控、可解释性和治理。
- 利用人机协作迭代优化和增强AI生成的输出。
- 设计针对可用性和集成需求量身定制的结果呈现格式。
- 在整个集成过程中关注安全性、负责任的AI实践和伦理考虑。