Skip to content

dspy.Adapter

dspy.Adapter(callbacks: list[BaseCallback] | None = None, use_native_function_calling: bool = False)

Source code in dspy/adapters/base.py
def __init__(self, callbacks: list[BaseCallback] | None = None, use_native_function_calling: bool = False):
    self.callbacks = callbacks or []
    self.use_native_function_calling = use_native_function_calling

函数

__call__(lm: LM, lm_kwargs: dict[str, Any], signature: type[Signature], demos: list[dict[str, Any]], inputs: dict[str, Any]) -> list[dict[str, Any]]

Source code in dspy/adapters/base.py
def __call__(
    self,
    lm: "LM",
    lm_kwargs: dict[str, Any],
    signature: type[Signature],
    demos: list[dict[str, Any]],
    inputs: dict[str, Any],
) -> list[dict[str, Any]]:
    processed_signature = self._call_preprocess(lm, lm_kwargs, signature, inputs)
    inputs = self.format(processed_signature, demos, inputs)

    outputs = lm(messages=inputs, **lm_kwargs)
    return self._call_postprocess(processed_signature, signature, outputs)

acall(lm: LM, lm_kwargs: dict[str, Any], signature: type[Signature], demos: list[dict[str, Any]], inputs: dict[str, Any]) -> list[dict[str, Any]] async

Source code in dspy/adapters/base.py
async def acall(
    self,
    lm: "LM",
    lm_kwargs: dict[str, Any],
    signature: type[Signature],
    demos: list[dict[str, Any]],
    inputs: dict[str, Any],
) -> list[dict[str, Any]]:
    processed_signature = self._call_preprocess(lm, lm_kwargs, signature, inputs)
    inputs = self.format(processed_signature, demos, inputs)

    outputs = await lm.acall(messages=inputs, **lm_kwargs)
    return self._call_postprocess(processed_signature, signature, outputs)

format(signature: type[Signature], demos: list[dict[str, Any]], inputs: dict[str, Any]) -> list[dict[str, Any]]

为LM调用格式化输入消息。

该方法将DSPy结构化输入以及少量示例和对话历史转换为LM所期望的多轮消息。对于自定义适配器,可以重写此方法以定制输入消息的格式。

通常我们建议消息采用以下结构:

[
    {"role": "system", "content": system_message},
    # 开始少量示例
    {"role": "user", "content": few_shot_example_1_input},
    {"role": "assistant", "content": few_shot_example_1_output},
    {"role": "user", "content": few_shot_example_2_input},
    {"role": "assistant", "content": few_shot_example_2_output},
    ...
    # 结束少量示例
    # 开始对话历史
    {"role": "user", "content": conversation_history_1_input},
    {"role": "assistant", "content": conversation_history_1_output},
    {"role": "user", "content": conversation_history_2_input},
    {"role": "assistant", "content": conversation_history_2_output},
    ...
    # 结束对话历史
    {"role": "user", "content": current_input},
]

系统消息应包含字段描述、字段结构和任务描述。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化输入消息的DSPy签名。

必填
demos list[dict[str, Any]]

少量示例的列表。

必填
inputs dict[str, Any]

DSPy模块的输入参数。

必填

返回:

类型 描述
list[dict[str, Any]]

LM所期望的多轮消息列表。

Source code in dspy/adapters/base.py
def format(
    self,
    signature: type[Signature],
    demos: list[dict[str, Any]],
    inputs: dict[str, Any],
) -> list[dict[str, Any]]:
    """Format the input messages for the LM call.

    This method converts the DSPy structured input along with few-shot examples and conversation history into
    multiturn messages as expected by the LM. For custom adapters, this method can be overridden to customize
    the formatting of the input messages.

    In general we recommend the messages to have the following structure:
    ```
    [
        {"role": "system", "content": system_message},
        # Begin few-shot examples
        {"role": "user", "content": few_shot_example_1_input},
        {"role": "assistant", "content": few_shot_example_1_output},
        {"role": "user", "content": few_shot_example_2_input},
        {"role": "assistant", "content": few_shot_example_2_output},
        ...
        # End few-shot examples
        # Begin conversation history
        {"role": "user", "content": conversation_history_1_input},
        {"role": "assistant", "content": conversation_history_1_output},
        {"role": "user", "content": conversation_history_2_input},
        {"role": "assistant", "content": conversation_history_2_output},
        ...
        # End conversation history
        {"role": "user", "content": current_input},
    ]

    And system message should contain the field description, field structure, and task description.
    ```


    Args:
        signature: The DSPy signature for which to format the input messages.
        demos: A list of few-shot examples.
        inputs: The input arguments to the DSPy module.

    Returns:
        A list of multiturn messages as expected by the LM.
    """
    inputs_copy = dict(inputs)

    # If the signature and inputs have conversation history, we need to format the conversation history and
    # remove the history field from the signature.
    history_field_name = self._get_history_field_name(signature)
    if history_field_name:
        # In order to format the conversation history, we need to remove the history field from the signature.
        signature_without_history = signature.delete(history_field_name)
        conversation_history = self.format_conversation_history(
            signature_without_history,
            history_field_name,
            inputs_copy,
        )

    messages = []
    system_message = (
        f"{self.format_field_description(signature)}\n"
        f"{self.format_field_structure(signature)}\n"
        f"{self.format_task_description(signature)}"
    )
    messages.append({"role": "system", "content": system_message})
    messages.extend(self.format_demos(signature, demos))
    if history_field_name:
        # Conversation history and current input
        content = self.format_user_message_content(signature_without_history, inputs_copy, main_request=True)
        messages.extend(conversation_history)
        messages.append({"role": "user", "content": content})
    else:
        # Only current input
        content = self.format_user_message_content(signature, inputs_copy, main_request=True)
        messages.append({"role": "user", "content": content})

    messages = split_message_content_for_custom_types(messages)
    return messages

format_assistant_message_content(signature: type[Signature], outputs: dict[str, Any], missing_field_message: str | None = None) -> str

格式化助手消息内容。

此方法格式化助手消息内容,可用于格式化少样本示例和对话历史记录。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化助手消息内容的DSPy签名。

必填
outputs dict[str, Any]

需要格式化的输出字段。

必填
missing_field_message str | None

当字段缺失时使用的消息。

None

返回:

类型 描述
str

包含助手消息内容的字符串。

Source code in dspy/adapters/base.py
def format_assistant_message_content(
    self,
    signature: type[Signature],
    outputs: dict[str, Any],
    missing_field_message: str | None = None,
) -> str:
    """Format the assistant message content.

    This method formats the assistant message content, which can be used in formatting few-shot examples,
    conversation history.

    Args:
        signature: The DSPy signature for which to format the assistant message content.
        outputs: The output fields to be formatted.
        missing_field_message: A message to be used when a field is missing.

    Returns:
        A string that contains the assistant message content.
    """
    raise NotImplementedError

format_conversation_history(signature: type[Signature], history_field_name: str, inputs: dict[str, Any]) -> list[dict[str, Any]]

格式化对话历史记录。

此方法将对话历史和当前输入格式化为多轮消息。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化对话历史的DSPy签名。

必填
history_field_name str

签名中历史字段的名称。

必填
inputs dict[str, Any]

DSPy模块的输入参数。

必填

返回:

类型 描述
list[dict[str, Any]]

一个多轮消息列表。

Source code in dspy/adapters/base.py
def format_conversation_history(
    self,
    signature: type[Signature],
    history_field_name: str,
    inputs: dict[str, Any],
) -> list[dict[str, Any]]:
    """Format the conversation history.

    This method formats the conversation history and the current input as multiturn messages.

    Args:
        signature: The DSPy signature for which to format the conversation history.
        history_field_name: The name of the history field in the signature.
        inputs: The input arguments to the DSPy module.

    Returns:
        A list of multiturn messages.
    """
    conversation_history = inputs[history_field_name].messages if history_field_name in inputs else None

    if conversation_history is None:
        return []

    messages = []
    for message in conversation_history:
        messages.append(
            {
                "role": "user",
                "content": self.format_user_message_content(signature, message),
            }
        )
        messages.append(
            {
                "role": "assistant",
                "content": self.format_assistant_message_content(signature, message),
            }
        )

    # Remove the history field from the inputs
    del inputs[history_field_name]

    return messages

format_demos(signature: type[Signature], demos: list[dict[str, Any]]) -> list[dict[str, Any]]

格式化少样本示例。

该方法将少样本示例格式化为多轮消息。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化少样本示例的DSPy签名。

必填
demos list[dict[str, Any]]

一个少样本示例列表,每个元素都是一个字典,包含签名输入和输出字段的键。

必填

返回:

类型 描述
list[dict[str, Any]]

一个多轮消息列表。

Source code in dspy/adapters/base.py
def format_demos(self, signature: type[Signature], demos: list[dict[str, Any]]) -> list[dict[str, Any]]:
    """Format the few-shot examples.

    This method formats the few-shot examples as multiturn messages.

    Args:
        signature: The DSPy signature for which to format the few-shot examples.
        demos: A list of few-shot examples, each element is a dictionary with keys of the input and output fields of
            the signature.

    Returns:
        A list of multiturn messages.
    """
    complete_demos = []
    incomplete_demos = []

    for demo in demos:
        # Check if all fields are present and not None
        is_complete = all(k in demo and demo[k] is not None for k in signature.fields)

        # Check if demo has at least one input and one output field
        has_input = any(k in demo for k in signature.input_fields)
        has_output = any(k in demo for k in signature.output_fields)

        if is_complete:
            complete_demos.append(demo)
        elif has_input and has_output:
            # We only keep incomplete demos that have at least one input and one output field
            incomplete_demos.append(demo)

    messages = []

    incomplete_demo_prefix = "This is an example of the task, though some input or output fields are not supplied."
    for demo in incomplete_demos:
        messages.append(
            {
                "role": "user",
                "content": self.format_user_message_content(signature, demo, prefix=incomplete_demo_prefix),
            }
        )
        messages.append(
            {
                "role": "assistant",
                "content": self.format_assistant_message_content(
                    signature, demo, missing_field_message="Not supplied for this particular example. "
                ),
            }
        )

    for demo in complete_demos:
        messages.append({"role": "user", "content": self.format_user_message_content(signature, demo)})
        messages.append(
            {
                "role": "assistant",
                "content": self.format_assistant_message_content(
                    signature, demo, missing_field_message="Not supplied for this conversation history message. "
                ),
            }
        )

    return messages

format_field_description(signature: type[Signature]) -> str

为系统消息格式化字段描述。

该方法格式化系统消息的字段描述。它应返回一个字符串,其中包含输入字段和输出字段的字段描述。

参数:

名称 类型 描述 默认值
signature type[Signature]

要格式化字段描述的Dspy签名。

必填

返回:

类型 描述
str

一个包含输入字段和输出字段描述信息的字符串。

Source code in dspy/adapters/base.py
def format_field_description(self, signature: type[Signature]) -> str:
    """Format the field description for the system message.

    This method formats the field description for the system message. It should return a string that contains
    the field description for the input fields and the output fields.

    Args:
        signature: The DSPy signature for which to format the field description.

    Returns:
        A string that contains the field description for the input fields and the output fields.
    """
    raise NotImplementedError

format_field_structure(signature: type[Signature]) -> str

格式化系统消息的字段结构。

该方法格式化系统消息的字段结构。它应返回一个字符串,用于指定输入字段应提供给语言模型的格式,以及输出字段在响应中的格式。 请参考ChatAdapter和JsonAdapter作为示例。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化字段结构的DSPy签名。

必填
Source code in dspy/adapters/base.py
def format_field_structure(self, signature: type[Signature]) -> str:
    """Format the field structure for the system message.

    This method formats the field structure for the system message. It should return a string that dictates the
    format the input fields should be provided to the LM, and the format the output fields will be in the response.
    Refer to the ChatAdapter and JsonAdapter for an example.

    Args:
        signature: The DSPy signature for which to format the field structure.
    """
    raise NotImplementedError

format_task_description(signature: type[Signature]) -> str

为系统消息格式化任务描述。

该方法格式化系统消息的任务描述。在大多数情况下,这只是一个对signature.instructions的简单封装。

参数:

名称 类型 描述 默认值
signature type[Signature]

DSpy模块的DSPy签名。

必填

返回:

类型 描述
str

描述任务的字符串。

Source code in dspy/adapters/base.py
def format_task_description(self, signature: type[Signature]) -> str:
    """Format the task description for the system message.

    This method formats the task description for the system message. In most cases this is just a thin wrapper
    over `signature.instructions`.

    Args:
        signature: The DSPy signature of the DSpy module.

    Returns:
        A string that describes the task.
    """
    raise NotImplementedError

format_user_message_content(signature: type[Signature], inputs: dict[str, Any], prefix: str = '', suffix: str = '', main_request: bool = False) -> str

格式化用户消息内容。

该方法格式化用户消息内容,可用于格式化少样本示例、对话历史记录和当前输入。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于格式化用户消息内容的DSPy签名。

必填
inputs dict[str, Any]

DSPy模块的输入参数。

必填
prefix str

用户消息内容的前缀。

''
suffix str

用户消息内容的后缀。

''

返回:

类型 描述
str

包含用户消息内容的字符串。

Source code in dspy/adapters/base.py
def format_user_message_content(
    self,
    signature: type[Signature],
    inputs: dict[str, Any],
    prefix: str = "",
    suffix: str = "",
    main_request: bool = False,
) -> str:
    """Format the user message content.

    This method formats the user message content, which can be used in formatting few-shot examples, conversation
    history, and the current input.

    Args:
        signature: The DSPy signature for which to format the user message content.
        inputs: The input arguments to the DSPy module.
        prefix: A prefix to the user message content.
        suffix: A suffix to the user message content.

    Returns:
        A string that contains the user message content.
    """
    raise NotImplementedError

parse(signature: type[Signature], completion: str) -> dict[str, Any]

将语言模型输出解析为输出字段的字典。

该方法将语言模型输出解析为输出字段的字典。

参数:

名称 类型 描述 默认值
signature type[Signature]

用于解析语言模型输出的DSPy签名。

必填
completion str

待解析的语言模型输出。

必填

返回:

类型 描述
dict[str, Any]

输出字段的字典。

Source code in dspy/adapters/base.py
def parse(self, signature: type[Signature], completion: str) -> dict[str, Any]:
    """Parse the LM output into a dictionary of the output fields.

    This method parses the LM output into a dictionary of the output fields.

    Args:
        signature: The DSPy signature for which to parse the LM output.
        completion: The LM output to be parsed.

    Returns:
        A dictionary of the output fields.
    """
    raise NotImplementedError

:::

优云智算