chatchat-space / Langchain-Chatchat

Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain
Apache License 2.0
31.83k stars 5.55k forks source link

zhipu-api无法流式输出 #3437

Closed SSTato closed 7 months ago

SSTato commented 7 months ago

使用zhipu-api的时候无法流式输出,使用别的api或者本地大模型时可以正常流式输出,这是为什么? image

dosubot[bot] commented 7 months ago

嘿,@SSTato!好久不见,欢迎回来。希望你一切都好!

根据我对Langchain-Chatchat代码库的理解,你在使用zhipu-api时无法流式输出的原因可能是在do_chat方法中,流式功能被明确禁用了。在发送POST请求到API的data字典中,stream参数被设置为False

data = {
    "model": params.version,
    "messages": params.messages,
    "max_tokens": params.max_tokens,
    "temperature": params.temperature,
    "stream": False  # 这里禁用了流式输出
}

此外,处理流式响应的代码部分(使用服务器发送事件,Server-Sent Events,SSE)被注释掉了:

# with connect_sse(client, "POST", url, json=data) as event_source:
#     for sse in event_source.iter_sse():
#         chunk = json.loads(sse.data)
#         if len(chunk["choices"]) != 0:
#             text += chunk["choices"][0]["delta"]["content"]
#             yield {"error_code": 0, "text": text}

要启用流式输出,你需要在data字典中设置"stream": True,并取消注释处理SSE的代码部分。这样客户端就可以在消息到达时接收和处理消息,而不是等待整个响应。

你可以在以下链接中查看相关代码:

至于zhipu-api是否设计支持流式输出,从提供的代码来看,zhipu-api是支持流式输出的。这从do_chat方法中的ChatGLMWorker类的注释部分可以看出,其中一个名为connect_sse的上下文管理器用于处理通过服务器发送事件(SSE)的流式HTTP响应。connect_sse函数封装了httpx.Client.stream方法,以产生一个EventSource,这是专门用来处理流式响应的。

因此,流式输出的能力是通过设计实现的,而不是API本身的限制。当前在do_chat方法中的实现,不使用流式输出(在数据负载中"stream": False),代表了一种选择,而不是API强加的约束。

Sources

#### About Dosu This response is meant to be useful and save you time. It is **not meant to be a precise solution**, but rather a starting point for your own research. Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant. If you want to continue the conversation, start your reply with @dosu-bot.
zRzRzRzRzRzRzR commented 7 months ago

因为zhipu 流输出有bug,所以在程序里写成了非流,这个没办法

liuhuatao commented 7 months ago

我也遇到了,打开了注释代码,本地是可以实现对话的。但是一直报错ERROR: TypeError: Caught exception: object of type 'NoneType' has no len()

SSTato commented 7 months ago

Lib\site-packages\langchain_community\chat_models\openai.py中的493加一个判断就不会报ERROR了 image

SSTato commented 7 months ago

因为zhipu 流输出有bug,所以在程序里写成了非流,这个没办法

我这样改还会有bug吗

liuhuatao commented 7 months ago

@SSTato 确实不会报错了 但是这个是langchain依赖的 langchain_community 貌似不好提取到项目中吧

zyy26-zyy commented 7 months ago

我按照以下这样改api可以流式输出,webui页面不可以,但是我也不用页面所以我按照以下方式改的 model_config.py配置如下: 20240326-093956 然后在./server/utils.py文件的get_ChatOpenAI()函数里这样改,就可以api调用zhipu流式了: 20240326-094003

jersonal commented 4 months ago

我按照以下这样改api可以流式输出,webui页面不可以,但是我也不用页面所以我按照以下方式改的 model_config.py配置如下: 20240326-093956 然后在./server/utils.py文件的get_ChatOpenAI()函数里这样改,就可以api调用zhipu流式了: 20240326-094003

你好,请问generate_token()函数在哪儿调用的啊