ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零开始学 Dify ,本文教你如何避免 LLM 上下文长度超限错误,零基础小白建议收藏!!

从零开始学 Dify ,本文教你如何避免 LLM 上下文长度超限错误,零基础小白建议收藏!! 前言在构建基于大语言模型LLM的应用时context_length_exceeded错误是最常见且令人头疼的问题之一。当输入提示包括对话历史、系统指令和当前查询加上预期输出 Token 数超过模型的最大上下文窗口时就会发生这种错误。接下来将深入剖析 Dify 内部的 Token 计算和上下文管理逻辑。学习如何优雅地解决了这个问题。Token。一个 Token 可以是一个单词、单词的一部分或标点符号。每个模型都有一个硬性限制即单次请求能处理的 Token 数量这被称为上下文窗口。例如OpenAI 的gpt-4-turbo的上下文窗口为 128,000 个 Token而 Anthropic 的 Claude 3.5 Sonnet 的上下文窗口为 200,000 个 Token 。如果应用程序发送的请求过大提供商的 API 会拒绝该请求。因此一个健壮的应用程序必须在发送请求之前计算 Token并智能地管理其上下文以保持在限制范围内。二、Dify 的 Token 管理流程Dify 充当用户和 LLM 提供商之间的智能中介。它确保发送给模型的最终负载始终有效。下图展示了这个过程逻辑详解配置收集当请求开始时Dify 加载所选模型的配置。这包括两个关键数字模型最大上下文context_size模型支持的理论最大 token 数如 128,000。用户定义的输出 Tokenmax_tokens开发者在 Dify 界面中设置的值为模型的答案保留一部分上下文窗口。预算计算Dify 使用简单公式计算提示的可用预算可用提示 Token 数 模型最大上下文 - 用户定义的输出 Token 数Token 化和计数这是实现的核心。Dify 使用 OpenAI 的tiktoken库进行精确的 Token 计算。上下文截断如果当前上下文的 Token 计数超过可用提示 Token 数Dify 会智能地截断它。对于聊天应用这通常涉及从对话历史中删除最旧的消息直到总 Token 计数适合预算。最终 API 调用只有在验证和潜在截断之后Dify 才会将负载发送给 LLM 提供商确保请求有效并避免context_length_exceeded错误。三、与提供商模型配置的关系Dify 的 Token 计算逻辑与提供商模型配置中的参数有着密切的关系在 Dify 中每个模型都有以下关键配置参数# 模型配置示例model_config{context_size:128000,# 模型的最大上下文窗口max_tokens:4096,# 用户设置的最大输出 token 数model_name:gpt-4-turbo,# 模型名称用于选择正确的 tokenizerprovider:openai# 提供商决定使用哪种 token 化方法}Dify 的 Token 计算流程四、代码分析核心实现1. 预先计算剩余 Token在base_app_runner.py中get_pre_calculate_rest_tokens方法负责计算可用的 Token 预算defget_pre_calculate_rest_tokens(self,app_record,model_config,prompt_template_entity,inputs,files,query):# 获取模型实例model_instanceModelInstance(provider_model_bundlemodel_config.provider_model_bundle,modelmodel_config.model)# 获取模型最大上下文 token 数model_context_tokensmodel_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE)# 获取用户定义的输出 max_tokensmax_tokens0forparameter_ruleinmodel_config.model_schema.parameter_rules:ifparameter_rule.namemax_tokensor(parameter_rule.use_templateandparameter_rule.use_templatemax_tokens):max_tokens(model_config.parameters.get(parameter_rule.name)ormodel_config.parameters.get(parameter_rule.use_template or))or0# 获取不包含记忆和上下文的提示消息prompt_messages,stopself.organize_prompt_messages(app_recordapp_record,model_configmodel_config,prompt_template_entityprompt_template_entity,inputsinputs,filesfiles,queryquery,)# 计算当前提示消息的 token 数prompt_tokensmodel_instance.get_llm_num_tokens(prompt_messages)# 计算剩余可用 token 数rest_tokens:intmodel_context_tokens-max_tokens-prompt_tokensifrest_tokens0:raiseInvokeBadRequestError(Query or prefix prompt is too long, you can reduce the prefix prompt, or shrink the max token, or switch to a llm with a larger token limit size.)returnrest_tokens2. 重新计算最大 Token 数如果提示 Token 数加上最大输出 Token 数超过模型上下文限制Dify 会自动调整max_tokens参数defrecalc_llm_max_tokens(self,model_config,prompt_messages):# 获取模型实例model_instanceModelInstance(provider_model_bundlemodel_config.provider_model_bundle,modelmodel_config.model)# 获取模型最大上下文 token 数model_context_tokensmodel_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE)# 获取用户定义的输出 max_tokensmax_tokens0forparameter_ruleinmodel_config.model_schema.parameter_rules:ifparameter_rule.namemax_tokensor(parameter_rule.use_templateandparameter_rule.use_templatemax_tokens):max_tokens(model_config.parameters.get(parameter_rule.name)ormodel_config.parameters.get(parameter_rule.use_template or))or0# 计算当前提示消息的 token 数prompt_tokensmodel_instance.get_llm_num_tokens(prompt_messages)# 如果提示 token 数加上最大输出 token 数超过模型上下文限制则调整 max_tokensifprompt_tokensmax_tokensmodel_context_tokens:max_tokensmax(model_context_tokens-prompt_tokens,16)forparameter_ruleinmodel_config.model_schema.parameter_rules:ifparameter_rule.namemax_tokensor(parameter_rule.use_templateandparameter_rule.use_templatemax_tokens):model_config.parameters[parameter_rule.name]max_tokens3. 计算剩余 Token在prompt_transform.py中_calculate_rest_token方法负责计算剩余可用的 Token 数def_calculate_rest_token(self,prompt_messages,model_config):rest_tokens2000model_context_tokensmodel_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE)ifmodel_context_tokens:model_instanceModelInstance(provider_model_bundlemodel_config.provider_model_bundle,modelmodel_config.model)curr_message_tokensmodel_instance.get_llm_num_tokens(prompt_messages)max_tokens0forparameter_ruleinmodel_config.model_schema.parameter_rules:ifparameter_rule.namemax_tokensor(parameter_rule.use_templateandparameter_rule.use_templatemax_tokens):max_tokens(model_config.parameters.get(parameter_rule.name)ormodel_config.parameters.get(parameter_rule.use_template or))or0 rest_tokensmodel_context_tokens-max_tokens-curr_message_tokens rest_tokensmax(rest_tokens,0)returnrest_tokens4. 管理对话历史上下文管理的智能策略分层截断策略。在token_buffer_memory.py中get_history_prompt_messages方法负责获取对话历史并在必要时进行截断defget_history_prompt_messages(self,max_token_limit2000,message_limitNone):# 获取对话历史消息messagesquery.limit(message_limit).all()thread_messagesextract_thread_messages(messages)messageslist(reversed(thread_messages))prompt_messages[]# 将消息转换为提示消息formessageinmessages:# 处理消息内容和文件# ...# 如果提示消息的 token 数超过最大限制则进行截断curr_message_tokensself.model_instance.get_llm_num_tokens(prompt_messages)ifcurr_message_tokensmax_token_limit:pruned_memory[]whilecurr_message_tokensmax_token_limitandlen(prompt_messages)1:pruned_memory.append(prompt_messages.pop(0))curr_message_tokensself.model_instance.get_llm_num_tokens(prompt_messages)returnprompt_messages5. Token 计算的核心tiktokenDify 使用 OpenAI 的tiktoken库进行精确的 Token 计算。这是一个快速的 BPEByte Pair Encodingtokenizer专为 OpenAI 模型设计。在large_language_model.py中get_num_tokens方法负责获取提示消息的 Token 数defget_num_tokens(self,model,credentials,prompt_messages,toolsNone):ifdify_config.PLUGIN_BASED_TOKEN_COUNTING_ENABLED:plugin_model_managerPluginModelClient()returnplugin_model_manager.get_llm_num_tokens(tenant_idself.tenant_id,user_idunknown,plugin_idself.plugin_id,providerself.provider_name,model_typeself.model_type.value,modelmodel,credentialscredentials,prompt_messagesprompt_messages,toolstools,)return0五、模型配置与 Token 计算的关系Dify 中的模型配置参数直接影响 Token 计算和限制处理ModelPropertyKey.CONTEXT_SIZE定义模型的最大上下文窗口大小如 GPT-4 的 128,000 或 Claude 的 200,000。max_tokens 参数用户在 Dify 界面中设置的值为模型的回答保留一部分上下文窗口。模型名称决定使用哪种 tokenizer因为不同模型使用不同的 token 化规则。提供商不同提供商如 OpenAI、Anthropic的模型可能有不同的 token 化方法和限制。六、总结Dify 的 Token 管理优势Dify 的 Token 管理机制提供了几个关键优势自动化处理开发者无需手动计算 Token 或担心上下文限制。智能截断当上下文过长时Dify 会自动截断历史消息确保请求有效。适应性调整如果提示 Token 数加上最大输出 Token 数超过模型上下文限制Dify 会自动调整max_tokens参数。多模型支持Dify 支持多种 LLM 提供商和模型并为每个模型使用正确的 tokenizer。错误预防通过预先计算和验证 Token 数Dify 有效防止了context_length_exceeded错误。通过这种方式Dify 为开发者提供了一个无缝的体验使他们能够专注于构建应用程序而不必担心底层的 Token 管理复杂性。这种抽象层次的提升是 Dify 作为 LLM 应用开发平台的核心优势之一。最后为什么要学AI大模型当下⼈⼯智能市场迎来了爆发期并逐渐进⼊以⼈⼯通⽤智能AGI为主导的新时代。企业纷纷官宣“ AI ”战略为新兴技术⼈才创造丰富的就业机会⼈才缺⼝将达 400 万DeepSeek问世以来生成式AI和大模型技术爆发式增长让很多岗位重新成了炙手可热的新星岗位薪资远超很多后端岗位在程序员中稳居前列。与此同时AI与各行各业深度融合飞速发展成为炙手可热的新风口企业非常需要了解AI、懂AI、会用AI的员工纷纷开出高薪招聘AI大模型相关岗位。最近很多程序员朋友都已经学习或者准备学习 AI 大模型后台也经常会有小伙伴咨询学习路线和学习资料我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频全系列的学习资料这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】AI大模型系统学习路线在面对AI大模型开发领域的复杂与深入精准学习显得尤为重要。一份系统的技术路线图不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点还能提供一条高效、有序的学习路径。但知道是一回事做又是另一回事初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性在这基础上找到高质量的学习资源不浪费时间、不走弯路又是重中之重。AI大模型入门到实战的视频教程项目包看视频学习是一种高效、直观、灵活且富有吸引力的学习方式可以更直观地展示过程能有效提升学习兴趣和理解力是现在获取知识的重要途径光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。海量AI大模型必读的经典书籍PDF阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。600AI大模型报告实时更新这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。AI大模型面试真题答案解析我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表