llama_index [Bug]: OpenAIAgentWorkers get_all_messages 函数可能会超出内容窗口

wztqucjr  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(30)

Bug描述

大家好,
在我的例子应用中,我遇到了以下错误:
raise self._make_status_error_from_response(err.response) from None openai.BadRequestError: Error code: 400 - {'error': {'message': "This model's maximum context length is 16385 tokens. However, your messages resulted in 17195 tokens (17141 in the messages, 54 in the functions). Please reduce the length of the messages or functions.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}}
我认为这是由于 OpenAIAgentWorkersget_all_messages 的实现方式有误。

def get_all_messages(self, task: Task) -> List[ChatMessage]:
        return (
            self.prefix_messages
            + task.memory.get()
            + task.extra_state["new_memory"].get_all()
        )

添加这三种类型的消息并没有使用默认的 ChatMemoryBuffer 的剪枝功能,导致向 LLM 发送查询时溢出。
是否有解决这个问题的方法,如果没有,是否可以修复?
提前感谢大家的帮助。

版本

0.10.42

重现步骤

使用 create-llama 模板,并按照以下方式定义您的聊天引擎:

def get_chat_engine():
    system_prompt = os.getenv("SYSTEM_PROMPT")
    top_k = os.getenv("TOP_K", 3)

    index = get_index()
    if index is None:
        raise HTTPException(
            status_code=500,
            detail=str(
                "StorageContext is empty - call 'poetry run generate' to generate the storage first"
            ),
        )

    return index.as_chat_engine(
        similarity_top_k=int(top_k),
        system_prompt=system_prompt,
        chat_mode=ChatMode.OPENAI,
        response_synthesizer=NoLLM()
    )

您可以在此处找到 NoLLM() 响应合成器:

14439 (review)

相关日志/回溯

  • 无响应*
jslywgbw

jslywgbw1#

嘿 @Laktus 👋,我在这里帮助你解决任何错误、问题或贡献。请稍等,我会在等待人类维护者时帮助你。
要解决 OpenAIAgentWorkersget_all_messages 函数超过模型最大上下文长度的问题,你可以修改该函数以包含消息修剪。这确保了消息的总令牌计数不会超过模型的限制。
以下是如何修改 get_all_messages 函数的示例:

from typing import List
from llama_index.legacy.llms.ai21_utils import ai21_model_to_context_size

def get_all_messages(model_name: str, messages: List[ChatMessage]) -> List[ChatMessage]:
    max_context_size = ai21_model_to_context_size(model_name)
    current_context_size = 0
    truncated_messages = []

    for message in reversed(messages):
        message_dict = message_to_ai21_message(message)
        message_size = len(openai.Completion.create(prompt=message_dict['content'], max_tokens=0)['choices'][0]['logprobs']['tokens'])

        if current_context_size + message_size > max_context_size:
            break

        truncated_messages.append(message)
        current_context_size += message_size

    return list(reversed(truncated_messages))

在这段代码中:

  1. ai21_model_to_context_size 用于获取给定模型的最大上下文大小。
  2. 以相反的顺序迭代消息,以便优先考虑最近的消息。
  3. 计算并检查每条消息的大小是否超过剩余的上下文大小。
  4. 如果添加另一条消息会超过上下文大小限制,则截断消息。
    此外,你还可以使用 LlamaIndex 框架中的 PromptHelper 类来管理提示大小,并确保它不会超过模型的令牌限制。以下是如何集成 PromptHelper 的示例:
from llama_index import PromptHelper

def get_all_messages(model_name: str, messages: List[ChatMessage]) -> List[ChatMessage]:
    max_context_size = ai21_model_to_context_size(model_name)
    prompt_helper = PromptHelper(max_input_size=max_context_size, num_output=0, max_chunk_overlap=0)
    current_context_size = 0
    truncated_messages = []

    for message in reversed(messages):
        message_dict = message_to_ai21_message(message)
        message_size = len(openai.Completion.create(prompt=message_dict['content'], max_tokens=0)['choices'][0]['logprobs']['tokens'])

        if current_context_size + message_size > max_context_size:
            break

        truncated_messages.append(message)
        current_context_size += message_size

    return list(reversed(truncated_messages))

这种方法确保消息的总令牌计数不会超过模型的限制,从而防止出现 context_length_exceeded 错误 1(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/llms/llama-index-llms-openai/llama_index/llms/openai/utils.py)2(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_06_02_23.json)3(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_05_25_23.json)4(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/llms/llama-index-llms-ai21/llama_index/llms/ai21/utils.py)5(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/llms/ai21_utils.py)。

  • 要继续与 Dosu 对话,请提及 @dosu。*
xcitsw88

xcitsw882#

例如,这样的前缀消息、任务内存和任务.extra_state["new_memory"]配置会导致以下错误:
<Task finished name='Task-42452' coro=<Dispatcher.span..async_wrapper() done, defined at /Users/saltukkezer/Library/Caches/pypoetry/virtualenvs/app-WTiBYyDQ-py3.11/lib/python3.11/site-packages/llama_index/core/instrumentation/dispatcher.py:212> exception=BadRequestError('Error code: 400 - {'error': {'message': "This model's maximum context length is 16385 tokens. However, your messages resulted in 16411 tokens (16357 in the messages, 54 in the functions). Please reduce the length of the messages or functions.", 'type': 'invalid_request_error', 'param': 'messages', 'code': 'context_length_exceeded'}}')>

hm2xizp9

hm2xizp93#

当额外状态的内存超过16k时(使用gpt-3.5-turbo),同样存在问题,因为多次使用相同的工具,例如

相关问题