langchain ``` ChatOpenAI with_structured output breaks Runnable ConfigurableFields ```

vhipe2zx  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(71)

检查其他资源

  • 为这个问题添加了一个非常描述性的标题。
  • 使用集成搜索在LangChain文档中进行搜索。
  • 使用GitHub搜索查找类似的问题,但没有找到。
  • 我确信这是LangChain中的一个bug,而不是我的代码。
  • 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。

示例代码

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_core.runnables import ConfigurableField

class Joke(BaseModel):
    setup: str = Field(description="The setup of the joke")
    punchline: str = Field(description="The punchline to the joke")

model = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=2, api_key="API-KEY").configurable_fields(
    temperature=ConfigurableField(id="temperature", name="Temperature", description="The temperature of the model")
)
structured_llm = model.with_structured_output(Joke)

## This line does not raise an exception meaning the temperature field is not passed to the llm
structured_llm.with_config(configurable={"temperature" : 20}).invoke("Tell me a joke about cats")

## This raises exception as expected, as temperature is above 2
model.with_config(configurable={"temperature" : 20}).invoke("Tell me a joke about cats")

错误信息和堆栈跟踪(如果适用)

  • 无响应*

描述

在使用 .with_config(configurable={}).with_structured_output() 在ChatOpenAI中时,破坏了传播可配置字段的功能。
这个问题可能存在于其他提供程序实现中。

系统信息

langchain==0.2.3
langchain-anthropic==0.1.15
langchain-community==0.2.4
langchain-core==0.2.5
langchain-google-vertexai==1.0.5
langchain-openai==0.1.8
langchain-text-splitters==0.2.1

bvjxkvbb

bvjxkvbb1#

是的,我遇到了和你相同的问题。即使没有使用with_structured_output,with_config也无法传播参数。

v8wbuo2f

v8wbuo2f2#

是的,我遇到了和你一样的这个问题。即使没有使用with_structured_output,with_config也无法传播参数。
你有没有使用过其他替代实现?

ttp71kqs

ttp71kqs3#

如果有人遇到相同的问题,可以尝试以下解决方法:

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_openai.chat_models.base import convert_to_openai_tool
from langchain_core.runnables import ConfigurableField
from typing import Dict, Any, Optional
from langchain_core.output_parsers.openai_tools import PydanticToolsParser

class Joke(BaseModel):
    setup: str = Field(description="The setup of the joke")
    punchline: str = Field(description="The punchline to the joke")

class ChatOpenAIWithStructedOutput(ChatOpenAI):
    output_structure: Optional[Dict[str, Any] ] = None
    
    @property
    def _default_params(self) -> Dict[str, Any]:
        """Get the default parameters for calling OpenAI API."""
        params = {
            "model": self.model_name,
            "stream": self.streaming,
            "n": self.n,
            "temperature": self.temperature,
            **self.model_kwargs,
        }
        if self.output_structure is not None:
            tools = [self.output_structure]
            tool_choice = {"type" : "function", "function" : {"name" : tools[0]["function"]["name"]}}
            params["tools"] = tools
            params["tool_choice"] = tool_choice
        if self.max_tokens is not None:
            params["max_tokens"] = self.max_tokens
        return params

model = ChatOpenAIWithStructedOutput(model="gpt-3.5-turbo-0125", temperature=2, api_key="API_KEY").configurable_fields(
                                temperature=ConfigurableField(id="temperature", name="Temperature", description="The temperature of the model"), 
                                output_structure=ConfigurableField(id="output_structure", name="output_structure", description="The output schema of the model"))

structured_llm = model.with_config(configurable={"output_structure" : convert_to_openai_tool(Joke)}) | PydanticToolsParser(tools=[Joke], first_tool_only=True)

structured_llm.with_config(configurable={"temperature" : 1}).invoke("Tell me a joke about cats")

相关问题