llama_index [Bug]:在BedrockEmbedding中,model_name与model之间的区别不会抛出错误,

sulc1iza  于 23天前  发布在  其他
关注(0)|答案(3)|浏览(16)

Bug描述

在BedrockEmbedding类中使用"model"而不是"model_name"导致自动选择默认模型,且不引发错误。这可能导致使用错误的模型。
以下代码调用默认模型,即"amazon.titan-embed-text-v1":
model = BedrockEmbedding(model = "cohere.embed-multilingual-v3")
以下代码调用所需的模型("cohere.embed-multilingual-v3"):
model = BedrockEmbedding(model_name = "cohere.embed-multilingual-v3")

版本

0.10.44

重现步骤

  1. 在Python脚本或笔记本中导入llama_index包中的BedrockEmbedding类
  2. 使用model而不是model_name示例化BedrockEmbedding类。这是导致自动选择默认模型的错误用法。
    model = BedrockEmbedding(model="cohere.embed-multilingual-v3")
  3. 由于参数model被错误地使用,BedrockEmbedding类应该自动选择所需模型("cohere.embed-multilingual-v3")而不是默认模型("amazon.titan-embed-text-v1")。不应有错误消息指示使用了错误的参数,这是bug的关键。
  4. 尝试使用正确的参数model_name示例化BedrockEmbedding类,以指定所需模型。
    model = BedrockEmbedding(model_name="cohere.embed-multilingual-v3")

相关日志/回溯

  • 无响应*
voase2hg

voase2hg1#

@anqma 你好!我在这里协助你解决任何问题或疑问。在等待人工维护者时,请随时寻求帮助。
为了确保在使用参数 `model` 而不是 `model_name` 的 `BedrockEmbedding` 类中引发错误,你可以修改 `BedrockEmbedding` 类的 `__init__` 方法,检查 `model` 参数是否存在,如果找到则引发一个 `ValueError`。以下是如何实现这一点的示例:

class BedrockEmbedding(BaseEmbedding):
model_name: str = Field(description="The modelId of the Bedrock model to use.")
# other fields...

def __init__(
    self,
    model_name: str = Models.TITAN_EMBEDDING,
    profile_name: Optional[str] = None,
    aws_access_key_id: Optional[str] = None,
    aws_secret_access_key: Optional[str] = None,
    aws_session_token: Optional[str] = None,
    region_name: Optional[str] = None,
    client: Optional[Any] = None,
    botocore_session: Optional[Any] = None,
    botocore_config: Optional[Any] = None,
    additional_kwargs: Optional[Dict[str, Any]] = None,
    max_retries: int = 10,
    timeout: float = 60.0,
    callback_manager: Optional[CallbackManager] = None,
    # base class
    system_prompt: Optional[str] = None,
    messages_to_prompt: Optional[Callable[[Sequence[ChatMessage]], str]] = None,
    completion_to_prompt: Optional[Callable[[str], str]] = None,
    pydantic_program_mode: PydanticProgramMode = PydanticProgramMode.DEFAULT,
    output_parser: Optional[BaseOutputParser] = None,
    **kwargs: Any,
):
    if 'model' in kwargs:
        raise ValueError("Use 'model_name' instead of 'model' to specify the model.")
    
    additional_kwargs = additional_kwargs or {}

    session_kwargs = {
        "profile_name": profile_name,
        "region_name": region_name,
        "aws_access_key_id": aws_access_key_id,
        "aws_secret_access_key": aws_secret_access_key,
        "aws_session_token": aws_session_token,
        "botocore_session": botocore_session,
    }

    try:
        import boto3
        from botocore.config import Config

        config = (
            Config(
                retries={"max_attempts": max_retries, "mode": "standard"},
                connect_timeout=timeout,
                read_timeout=timeout,
            )
            if botocore_config is None
            else botocore_config
        )
        session = boto3.Session(**session_kwargs)
    except ImportError:
        raise ImportError(
            "boto3 package not found, install with 'pip install boto3'"
        )

    if client is not None:
        self._client = client
    elif "bedrock-runtime" in session.get_available_services():
        self._client = session.client("bedrock-runtime", config=config)
    else:
        self._client = session.client("bedrock", config=config)

    super().__init__(
        model_name=model_name,
        max_retries=max_retries,
        timeout=timeout,
        botocore_config=config,
        profile_name=profile_name,
        aws_access_key_id=aws_access_key_id,
        aws_secret_access_key=aws_secret_access_key,
        aws_session_token=aws_session_token,
        region_name=region_name,
        botocore_session=botocore_session,
        additional_kwargs=additional_kwargs,
        callback_manager=callback_manager,
        system_prompt=system_prompt,
        messages_to_prompt=messages_to_prompt,
        completion_to_prompt=completion_to_prompt,
        pydantic_program_mode=pydantic_program_mode,
        output_parser=output_parser,
        **kwargs,
    )

此代码片段检查关键字参数( `kwargs` )中是否存在 `model` 参数。如果存在,则引发一个带有消息的 `ValueError`,指示应使用 `model_name` 而不是默认模型。这将通过确保使用正确的参数来防止意外使用默认模型。

* 要继续与 [Dosu](https://dosu.dev) 交谈,请提及 @dosu。*
dbf7pr2w

dbf7pr2w2#

这是Pydantic工作原理的一部分,也是kwargs滥用的部分原因。
解决这个问题的唯一方法是在代码中显式引发错误🤷🏻显然,model/model_name kwarg应该在LLMs和嵌入模型之间保持一致,但现在还没有实现。

6tr1vspr

6tr1vspr3#

kwargs滥用正在破坏这个库。很多意外的/被抑制的不良行为

相关问题