趋近智
大语言模型(LLM)API 调用的成本通常按 token 计费,这占 RAG 系统运营开支的很大一部分。因此,有效管理 token 消耗是直接控制成本的手段。有多种方法可以减少 LLM token 使用,同时又不致过度影响 RAG 系统输出的质量和实用性。这些策略涵盖了从完善提示词到调整提供给 LLM 的上下文。
在优化之前,需要认识到 LLM 看待词语的方式与我们不同。它们将文本处理为“token”,token 可以是单词、单词的一部分,甚至单个字符,这取决于特定模型使用的分词器。大多数 LLM 提供商根据输入 token(上下文和提示词)和输出 token(生成的回复)的数量来计费。因此,节省的每个 token 都直接转化为成本的降低。
不同的模型使用不同的分词器。例如,一个短语对模型 A 来说可能是 10 个 token,而对模型 B 来说可能是 8 个或 12 个。务必查阅模型提供商的文档,以获取其分词和定价的详细信息。像 tiktoken(用于 OpenAI 模型)这样的库允许你以编程方式计算给定文本和模型的 token 数量,从而能在进行 API 调用前估算成本。
import tiktoken
def count_tokens(text: str, model_name: str = "gpt-3.5-turbo") -> int:
"""估算给定文本和 OpenAI 模型的 token 数量。"""
try:
encoding = tiktoken.encoding_for_model(model_name)
except KeyError:
# 对于不在 encoding_for_model 中的模型,使用备用方案
encoding = tiktoken.get_encoding("cl100k_base")
return len(encoding.encode(text))
# 使用示例:
prompt = "Summarize the following document in three bullet points."
retrieved_text = "This is a sample document retrieved by the RAG system. It contains several sentences that might be relevant to the user's query about LLM token optimization."
full_input_to_llm = f"Context: {retrieved_text}\n\nInstruction: {prompt}"
token_count = count_tokens(full_input_to_llm)
# print(f"估计输入 token 数量:{token_count}")
count_tokens函数提供 token 使用量的估算,这对于成本分析和 RAG 流水线中的预检非常有价值。
你构建提示词的方式显著影响所消耗的 token 数量,包括输入和 LLM 可能的输出。
避免在提示词中使用冗长或过于客套的措辞。直接清晰地说明任务。
尽管简洁很好,但不要牺牲清晰度。一个含糊不清的短提示词可能会导致不佳的输出,需要重试或更详细的后续提示词,最终会增加 token 使用量。
指导 LLM 采用特定角色可以隐含地引导其回复长度和风格,有时可减少提示词中对明确长度限制的需求。
请求特定的输出格式可以引导 LLM 生成更短、结构更清晰的回复。
持续监测提示词的 token 数量和 LLM 回复的质量。迭代优化你的提示词,以寻求 token 效率和期望输出质量之间的最佳平衡。措辞的微小调整有时可以带来显著的 token 节省。
提供给 LLM 的上下文(检索到的文档)通常是输入 token 数量的最大贡献者。优化此上下文是必要的。
确保你的检索系统高度准确。将不相关或微弱相关的文档传递给 LLM 不仅增加 token 数量,还可能使模型困惑并降低输出质量。
如果生成任务不需要检索到的文本块的完整细节,考虑在它们到达主 LLM 之前对其进行摘要或压缩。
下面的图表展示了上下文优化在 RAG 流水线中的位置:
上下文优化作为一个重要的中间步骤,它优化传递给主要 LLM 的信息,以减少 token 负载并可能提升回复质量。
对于进行多轮对话的 RAG 系统,累积的历史记录会迅速导致上下文过长。
你也可以通过管理 LLM 生成的 token 数量来降低成本。
max_tokens(或类似)参数大多数 LLM API 提供一个参数(例如 max_tokens、max_output_tokens),以限制生成的回复长度。
max_tokens 来突然截断它。明确要求 LLM 在回复中保持简洁。
尽管 LLM 并非总是能完美遵守精确的字数或句数,但此类指令通常会使输出更短。
并非所有任务都需要最强大(且最昂贵)的 LLM。
尽管并非严格意义上减少单次独立调用的 token,但缓存相同或非常相似的输入提示词(包括上下文)的回复可以完全消除冗余的 LLM 调用,从而在大规模应用中带来可观的成本节省。如果你经常遇到相同的问题和相同的检索上下文,缓存 LLM 生成的答案会非常有效。本方法在第四章“在 RAG 流水线中实施缓存策略”中进行更多介绍。
token 优化并非一次性设置。这是一个持续的过程。
通过系统地应用这些方法,你可以显著减少 RAG 系统与 LLM 交互的 token 足迹。这不仅降低了运营成本,还可以提高延迟,因为处理更少的 token 通常所需时间更短。重要的是找到恰当的平衡点,既保持高质量输出,又注意相关开支。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造