用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较

文章目录

  • 1. 非流式输出与流式输出概述
  • 2. 非流式输出
    • 2.1 代码实例1
    • 2.2 代码实例2
  • 3. 流式输出
    • 3.1 流式输出的定义和作用
    • 3.2 流式输出适用的场景
    • 3.3 流式输出的实现方式与实现技术
    • 3.4 代码实例3
    • 3.5 代码实例4
  • 4. 小结


1. 非流式输出与流式输出概述

大模型收到输入后并不是一次性生成最终结果,而是逐步地生成中间结果,最终结果由中间结果拼接而成。
相比非流式输出,流式输出可以实时地将中间结果返回,您可以在模型进行输出的同时进行阅读,减少等待模型回复的时间;并且当输出内容较长时,有效降低请求超时的风险。

本文给出了使用Python requests库调用大型语言模型(LLM)API的非流式输出与流式输出的简单介绍和代码实例。

2. 非流式输出

2.1 代码实例1

下面直接给出非流式输出的代码实例。可以结合代码的运行输出过程来体验非流式输出那种让用户巴巴干等着的那种用户体验效果。

import requestsAUTH_VALUE = "sk-..."  # 替换为你的API Key
# api = "https://api.openai.com/v1/chat/completions"
url = "https://api.siliconflow.cn/v1/chat/completions"
headers = {"Content-Type": "application/json","Authorization": f"Bearer {AUTH_VALUE}" 
}while True:# 获取用户输入question = input("\n请输入您的问题 (Quit by typing q): ").strip()if question.lower() == 'q':print("程序已退出")breakjson_data = {"model": "deepseek-ai/DeepSeek-V3","messages": [{"role": "user", "content": question}],"stream": False,             # 非流式输出  default: false# "max_tokens": 2048,         # 最大输出长度 (2048), default: 512,  Required range: 1 < x < 8192# "temperature": 0.7,         # Determines the degree of randomness in the response. default: 0.7# "top_p": 0.7,               # 采样参数  default: 0.7# "top_k": 50,                # 采样参数  default: 50# "frequency_penalty": 0.5,   # 重复惩罚系数  default: 0.5# "n": 1,                     # Number of generations to return. default: 1# "response_format": {#     "type": "text"          # The type of the response format.# }}try:# 发送非流式请求response = requests.post(url=url, headers=headers, json=json_data, stream=False) response.raise_for_status()  # 检查响应状态response.encoding = "utf-8"# print(response.text)# print(response.status_code)print(response.json())except requests.RequestException as e:      # 捕获网络异常error_msg = f"请求错误: {str(e)}\n"print(error_msg)

运行程序,某次对话输出如下:

请输入您的问题 (Quit by typing q): 什么是分布式数据库系统?
{'id': '01954f50cae8185aeea97c360069222d', 'object': 'chat.completion', 'created': 1740792449, 'model': 'deepseek-ai/DeepSeek-V3', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': '**分布式数据库系统(Distributed Database System, DDBS)** 是一种由多个相互连接的数据库组成的系统,这些数据库分布在不同的物理位置或节点上,但对外提供统一的访问接口和数据管理功能。分布式数据库系统的核心目标是将数据存储和处理分布到多个节点上,以提高系统的可扩展性、可靠性和性能。\n\n### 分布式数据库系统的主要特征:\n1. **数据分布**:数据被分散存储在不同的节点上,可以是不同的地理位置或服务器。\n2. **数据透明性**:用户或应用程序无需知道数据具体存储在哪里,系统会自动处理数据的定位和访问。\n3. **节点自治性**:每个节点可以独立运行,拥有自己的局部数据库管理系统(DBMS)。\n4. **网络通信**:节点之间通过网络进行通信,协调数据的存储和查询。\n5. **一致性控制**:系统需要确保数据的一致性,通常通过分布式事务管理、副本控制等机制实现。\n6. **高可用性和容错性**:由于数据分布在多个节点上,系统可以容忍部分节点的故障,从而提高整体可用性。\n\n### 分布式数据库系统的架构:\n1. **全局模式**:描述整个分布式数据库的逻辑结构和数据分布。\n2. **局部模式**:描述每个节点上的局部数据库结构。\n3. **分布式事务管理器**:负责协调跨节点的事务,确保事务的原子性和一致性。\n4. **数据复制和分片**:\n   - **复制**:数据在多个节点上存储副本,以提高可用性和读取性能。\n   - **分片**:将数据分割成多个片段,分布到不同的节点上,以提高存储和处理的效率。\n\n### 分布式数据库系统的优点:\n1. **可扩展性**:可以通过增加节点来扩展存储容量和处理能力。\n2. **高性能**:数据可以就近访问,减少延迟,并通过并行处理提升查询性能。\n3. **高可用性**:数据的多副本存储和节点冗余可以提高系统的容错能力。\n4. **灵活性**:可以根据需求动态调整数据的分布和复制策略。\n\n### 分布式数据库系统的挑战:\n1. **复杂性**:系统设计、实现和管理比集中式数据库更为复杂。\n2. **一致性维护**:在分布式环境中,保证数据一致性需要复杂的协议和算法(如Paxos、Raft等)。\n3. **网络延迟和故障**:网络通信可能成为性能瓶颈,网络故障可能导致数据不可用或丢失。\n4. **安全性**:分布式环境下的数据安全性和隐私保护面临更大挑战。\n\n### 常见的分布式数据库系统:\n- **NoSQL数据库**:如Cassandra、MongoDB、Redis等。\n- **NewSQL数据库**:如Google Spanner、CockroachDB等。\n- **分布式关系数据库**:如MySQL Cluster、PostgreSQL的分布式扩展等。\n\n分布式数据库系统是处理大规模数据和高并发场景的重要技术,广泛应用于互联网、金融、物联网等领域。'}, 'finish_reason': 'stop'}], 'usage': {'prompt_tokens': 8, 'completion_tokens': 600, 'total_tokens': 608}, 'system_fingerprint': ''}

下面的内容是对上面代码实例1的输出内容的进一步提取的到结果

**分布式数据库系统(Distributed Database System, DDBS)** 是一种由多个相互连接的数据库组成的系统,这些数据库分布在不同的物理位置或节点上,但对外提供统一的访问接口和数据管理功能。分布式数据库系统的核心目标是将数据存储和处理分
布到多个节点上,以提高系统的可扩展性、可靠性和性能。### 分布式数据库系统的主要特征:
1. **数据分布**:数据被分散存储在不同的节点上,可以是不同的地理位置或服务器。
2. **数据透明性**:用户或应用程序无需知道数据具体存储在哪里,系统会自动处理数据的定位和访问。
3. **节点自治性**:每个节点可以独立运行,拥有自己的局部数据库管理系统(DBMS)。
4. **网络通信**:节点之间通过网络进行通信,协调数据的存储和查询。
5. **一致性控制**:系统需要确保数据的一致性,通常通过分布式事务管理、副本控制等机制实现。
6. **高可用性和容错性**:由于数据分布在多个节点上,系统可以容忍部分节点的故障,从而提高整体可用性。### 分布式数据库系统的架构:
2. **局部模式**:描述每个节点上的局部数据库结构。
3. **分布式事务管理器**:负责协调跨节点的事务,确保事务的原子性和一致性。
4. **数据复制和分片**:- **复制**:数据在多个节点上存储副本,以提高可用性和读取性能。- **分片**:将数据分割成多个片段,分布到不同的节点上,以提高存储和处理的效率。### 分布式数据库系统的优点:
1. **可扩展性**:可以通过增加节点来扩展存储容量和处理能力。
2. **高性能**:数据可以就近访问,减少延迟,并通过并行处理提升查询性能。
3. **高可用性**:数据的多副本存储和节点冗余可以提高系统的容错能力。
4. **灵活性**:可以根据需求动态调整数据的分布和复制策略。### 分布式数据库系统的挑战:
1. **复杂性**:系统设计、实现和管理比集中式数据库更为复杂。
3. **网络延迟和故障**:网络通信可能成为性能瓶颈,网络故障可能导致数据不可用或丢失。
4. **安全性**:分布式环境下的数据安全性和隐私保护面临更大挑战。### 常见的分布式数据库系统:
- **NoSQL数据库**:如Cassandra、MongoDB、Redis等。
- **NewSQL数据库**:如Google Spanner、CockroachDB等。
- **分布式关系数据库**:如MySQL Cluster、PostgreSQL的分布式扩展等。分布式数据库系统是处理大规模数据和高并发场景的重要技术,广泛应用于互联网、金融、物联网等领域。

2.2 代码实例2

import requestsAUTH_VALUE = "sk-..."  # 替换为你的API Key
# api = "https://api.openai.com/v1/chat/completions"
url = "https://api.siliconflow.cn/v1/chat/completions"
headers = {"Content-Type": "application/json","Authorization": f"Bearer {AUTH_VALUE}" 
}
while True:# 获取用户输入question = input("\n请输入您的问题 (Quit by typing q): ").strip()if question.lower() == 'q':print("程序已退出")breakjson_data = {"model": "deepseek-ai/DeepSeek-V3","messages": [{"role": "user", "content": question}],"stream": False,             # 非流式输出  default: false}try:# 发送非流式请求response = requests.post(url=url, headers=headers, json=json_data, stream=False) response.raise_for_status()  # 检查响应状态response.encoding = "utf-8"print("\nReply: \n")# print(response.text)# print(response.status_code)# print(response.json())print(response.json()["choices"][0]["message"]["content"])except requests.RequestException as e:      # 捕获网络异常error_msg = f"请求错误: {str(e)}\n"print(error_msg)

运行程序,某次对话输出如下:

请输入您的问题 (Quit by typing q): 简述数据库管理系统的存储引擎的概念和作用。Reply: 数据库管理系统(DBMS)的存储引擎(Storage Engine)是数据库系统中负责数据的存储、检索和管理的核心组件。它直接与底层存储介质(如磁盘、内存等)交互,为数据库提供数据的高效存储和访问能力。### 存储引擎的概念:
存储引擎是数据库管理系统中的一个模块或子系统,负责数据的物理存储和访问。它是数据库系统的“后端”,负责管理数据的存储结构、索引、事务处理、并发控制、恢复机制等。不同的存储引擎可能采用不同的存储结构和算法,以优化特定类型的工作负
载。### 存储引擎的作用:
1. **数据存储**:存储引擎负责将数据库中的数据以特定的格式存储在磁盘或内存中,并管理数据的物理布局。它使用各种数据结构(如B树、哈希表等)来组织数据,以提高存储和检索效率。2. **数据检索**:存储引擎处理查询请求,根据查询条件从存储介质中快速检索数据。它支持多种索引类型(如B+树索引、全文索引等),以加速数据查找。3. **事务管理**:许多存储引擎支持事务处理,确保数据的原子性、一致性、隔离性和持久性(ACID特性)。事务管理包括日志记录、回滚机制和锁管理等。4. **并发控制**:存储引擎管理多个用户或应用程序对数据的并发访问,确保数据的一致性和完整性。常见的并发控制机制包括锁机制、多版本并发控制(MVCC)等。5. **数据恢复与备份**:存储引擎支持数据恢复功能,通过日志文件(如redo log、undo log)在系统崩溃后恢复数据。它还支持数据的备份和恢复操作,以保障数据的安全性。6. **性能优化**:不同的存储引擎针对不同的应用场景进行了优化。例如,某些存储引擎适用于高并发的OLTP(联机事务处理)系统,而另一些则更适合大数据量的OLAP(联机分析处理)系统。用户可以根据需求选择合适的存储引擎以获得最佳性能。   ### 常见的存储引擎:
- **InnoDB**(MySQL):支持事务、行级锁、外键约束等,适合OLTP场景。
- **MyISAM**(MySQL):不支持事务和行级锁,但具有较高的读取性能,适合读密集型的应用。
- **RocksDB**:基于LSM树的存储引擎,适用于写密集型的高吞吐量场景。
- **WiredTiger**(MongoDB):支持文档级别的并发控制和压缩,适合NoSQL数据库。### 总结:
存储引擎是数据库管理系统的核心组件,负责数据的存储、检索、事务管理和并发控制等任务。不同的存储引擎提供了不同的功能和优化策略,用户可以根据具体需求选择最适合的存储引擎,以提高数据库的性能和可靠性。

3. 流式输出

3.1 流式输出的定义和作用

流式输出是一种处理数据的方式,允许程序在数据生成的同时逐步接收和处理数据,而不是等待所有数据完成后再处理。对于聊天模型而言,流式传输可以让用户实时看到模型的输出,而不是等到整个响应生成完毕‌。流式输出的主要作用包括:

  1. 实时反馈‌:用户可以即时看到模型的输出,而不是等待整个响应生成完毕。
  2. ‌减少等待时间‌:用户可以在模型进行输出的同时阅读内容,减少等待时间。
  3. ‌降低超时风险‌:当输出内容较长时,可以有效降低请求超时的风险‌。
  4. 在需要实时处理大量数据的场景中,如语音识别、视频分析等,使用stream参数可以显著提高效率和性能。例如,在语音识别应用中,流式传输可以实时处理用户的语音输入,而不需要等待整个录音文件处理完毕。
  5. 在大数据处理和分析中,流式传输可以分批处理数据,减少内存消耗,提高处理速度‌

3.2 流式输出适用的场景

流式输出通常用于以下几种场景:

  1. 实时数据更新,例如股票行情、社交媒体的实时消息流。
  2. 大数据处理,例如长时间查询或计算的结果逐步传输。
  3. 节省带宽,在网络环境不佳的情况下减少一次性传输大量数据的压力。

3.3 流式输出的实现方式与实现技术

流式输出的实现方式包括同步流式传输和异步流式传输:

  1. 同步流式传输‌:直接从模型的stream方法中获取数据,每次返回一个完整的输出。
  2. 异步流式传输‌:适用于需要更高并发性的应用,通过astream方法异步地接收模型的输出‌。

在具体实现流式输出时,常用的技术包括:

  1. HTTP 分块传输(Chunked Transfer Encoding):HTTP 协议支持将数据以分块的方式传输,每个数据块都会携带长度信息。后端可以在响应完成之前,逐步地发送多个数据块给前端。
  2. Server-Sent Events (SSE):SSE 是一种在服务器向客户端推送事件的技术,适合实时性要求高但传输频率不高的场景。
  3. WebSocket:WebSocket 是一个全双工协议,允许服务器和客户端相互通信,适合高频率的实时数据传输。

通过 OpenAI 兼容方式开启流式输出十分简便,只需在请求参数中设置 stream 为 true 即可。当然如果使用requests.post()请求方法,则亦应设置requests.post()方法的stream=True,以启用流式传输。针对IO之输出的缓冲功能,为即时显示各个响应回来的token内容(chunk),使用print()在终端输出时,建议加上参数flush=True以配合流式输出,即print(chunk, end='', flush=True);如果是将各个响应回来的token内容(chunk)进行持久化保存,则写入文件后,如file.write(chunk),也应该即时刷新输出缓冲区,如file.flush()。当然如此将各个token内容逐个写入文件导致了频繁的文件IO,此时就应该现在内存中得到一个完整的响应内容后,如full_content += chunk.choices[0].delta.content,再一次性地写入文件中。详情请参见以下示例代码。

3.4 代码实例3

仍然先直接给出下面的流式输出的代码实例。可以结合代码的运行输出过程来体验流式输出那种一个词一个词蹦出来的动态效果。仅此一点,用户体验大大提升。

import requests
import jsonAUTH_VALUE = "sk-..."  # 替换为你的API Key
# url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
# api = "https://api.openai.com/v1/chat/completions"
url = "https://api.siliconflow.cn/v1/chat/completions"
headers = {"Content-Type": "application/json","Authorization": f"Bearer {AUTH_VALUE}" 
}while True:# 获取用户输入question = input("\n请输入您的问题 (Quit by typing q): ").strip()if question.lower() == 'q':print("程序已退出")breakjson_data = {"model": "deepseek-ai/DeepSeek-V3","messages": [{"role": "user", "content": question}],"stream": True,             # 流式输出  default: false}try:# 发送流式请求response = requests.post(url=url, headers=headers, json=json_data, stream=True) # stream=True 启用流式传输response.raise_for_status()  # 检查响应状态response.encoding = "utf-8"print("\nReply: \n")print(response.text)except requests.RequestException as e:      # 捕获网络异常error_msg = f"请求错误: {str(e)}\n"print(error_msg)

运行程序,某次对话的部分输出如下:

请输入您的问题 (Quit by typing q): 请对乌克兰总统泽连斯基给出一个简要评价。Replydata: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"","reasoning_content":null,"role":"assistant"},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":0,"total_tokens":15}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"乌克兰","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":1,"total_tokens":16}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"总统泽","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":3,"total_tokens":18}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"连斯基","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":5,"total_tokens":20}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"自201","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":7,"total_tokens":22}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"9年","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":9,"total_tokens":24}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"担任","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":10,"total_tokens":25}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"总统以来","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":12,"total_tokens":27}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":",在国际","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":14,"total_tokens":29}}......data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"得以实现","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":155,"total_tokens":170}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"。","reasoning_content":null},"finish_reason":null,"content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":156,"total_tokens":171}}data: {"id":"01954fb21a95199efa284b55fb43912a","object":"chat.completion.chunk","created":1740798827,"model":"deepseek-ai/DeepSeek-V3","choices":[{"index":0,"delta":{"content":"","reasoning_content":null},"finish_reason":"stop","content_filter_results":{"hate":{"filtered":false},"self_harm":{"filtered":false},"sexual":{"filtered":false},"violence":{"filtered":false}}}],"system_fingerprint":"","usage":{"prompt_tokens":15,"completion_tokens":156,"total_tokens":171}}data: [DONE]

由上面print(response.text)语句的输出可知,AI大模型的流式输出单位是token‌。在自然语言处理中,token是对输入文本进行分割和编码时的最小单位,它可以是一个单词、子词或字符,具体取决于token化过程‌。流式输出是指模型在生成结果的过程中逐步返回中间结果,而不是等到所有结果生成完毕后再返回最终结果。这种方式可以实时返回中间结果,减少用户的等待时间,并降低请求超时的风险‌。

3.5 代码实例4

下面对上面的实例代码增加了对流式输出的token内容进行提取的部分。

import requests
import jsonAUTH_VALUE = "sk-..."  # 替换为你的API Key
# api = "https://api.openai.com/v1/chat/completions"
url = "https://api.siliconflow.cn/v1/chat/completions"
headers = {"Content-Type": "application/json","Authorization": f"Bearer {AUTH_VALUE}" 
}
while True:# 获取用户输入question = input("\n请输入您的问题 (Quit by typing q): ").strip()if question.lower() == 'q':print("程序已退出")breakjson_data = {"model": "deepseek-ai/DeepSeek-V3","messages": [{"role": "user", "content": question}],"stream": True,             # 流式输出  default: false}try:# 发送流式请求response_stream = requests.post(url=url, headers=headers, json=json_data, stream=True) # stream=True 启用流式传输response_stream.raise_for_status()  # 检查响应状态# response.encoding = "utf-8"print("\nReply: \n")# print(response.text)# 处理流式响应for line in response_stream.iter_lines():      # 逐行处理响应数据if line:line = line.decode('utf-8')if line.startswith('data: '):if line == 'data: [DONE]':  # Stream terminates with "data: [DONE]"continuetry:content = json.loads(line[6:])  # 去掉每一行的 'data: ' 前缀if content['choices'][0]['delta'].get('content'):chunk = content['choices'][0]['delta']['content']print(chunk, end='', flush=True)except json.JSONDecodeError as e:    # 处理 JSON 解析错误print("JSONDecodeError: " + e)continueexcept requests.RequestException as e:      # 捕获网络异常error_msg = f"请求错误: {str(e)}\n"print(error_msg)finally:# 在处理完流式数据后,关闭连接释放资源response_stream.close() 

下面是运行上面实例的一次会话情况。

请输入您的问题 (Quit by typing q): 请对乌克兰总统泽连斯基给出一个简要中肯的评价。Reply:乌克兰总统弗拉基米尔·泽连斯基(Volodymyr Zelensky)是一位备受关注的政治人物。他在2019年以政治素人的身份高票当选,此前以喜剧演员和政治讽刺节目《人民公仆》中的总统角色闻名。泽连斯基上任后的执政经历复杂且充满挑战。他初期承诺打击腐败、推动国内改革,并寻求解决东部顿巴斯地区冲突,但在实施过程中面临诸多阻力。2022年俄罗斯全面入侵乌克兰后,泽连斯基的领导力得到国际社会的广泛认可。他展现出坚定的抗敌决心,积极寻求
国际支持,并通过灵活的外交手段和公开演讲赢得了全球舆论的同情与支持。他的果断决策和团结民众的能力在战争期间发挥了重要作用,但也面临对内政经济重建和外交平衡的长期挑战。总体而言,泽连斯基是一位在危机中崛起的领导人,其执政表现受到战争背景的深刻影响,未来评价将取决于乌克兰的国家命运与他的政策成效。
----------------------------------------

输出语句print(chunk, end='', flush=True)中的参数flush=True 在 print 函数中的作用是强制刷新输出缓冲区,确保打印的内容立即显示。这在需要实时输出信息、调试程序或确保关键日志即时写入时非常有用。
Python 的标准输出(例如 print)通常是缓冲的,这意味着数据先写入内存中的缓冲区,然后再写入到最终目的地(如控制台、文件等)。通过调用 sys.stdout.flush() 或使用 flush=True 参数,可以强制立即刷新缓冲区,将数据写入到目的地。

在使用Python的requests库进行HTTP请求时,如果你希望以流式(streaming)的方式处理响应,这样可以避免一次性将整个响应内容加载到内存中,特别是在处理大文件或实时数据流时非常有用。
使用stream=True参数在requests.post()中开启流式响应后,requests库就会以流的形式接收数据,而不是一次性读取所有数据。
由于流式响应是分块(chunk)返回的,你可以通过迭代响应的iter_content()或iter_lines()方法来逐块处理数据。
如果你知道响应是以行为单位的(例如,文本数据),可以使用iter_lines(),它会按行返回数据。

for line in response.iter_lines():if line:  # 过滤掉空行decoded_line = line.decode('utf-8')print(decoded_line)

如果响应回来的数据是固定大小的分块(chunk),可以使用使用iter_content()来逐块处理数据。

for chunk in response.iter_content(chunk_size=8192):# 处理每个块,例如解码为字符串并打印if chunk:  # 确保块不为空decoded_chunk = chunk.decode('utf-8')print(decoded_chunk)

4. 小结

流式输出(Streaming Output)是一种使后端将数据分块、逐步发送到前端的技术。通过这种方法,前端应用能够即时接收和渲染数据,不必等到整个响应体生成完毕后再处理。
流式输出是一种强大的工具,能够显著改善数据传输体验,特别适用于实时和大数据场景。
市面上的GPT在回复我们的问题的时候基本上都是采用类似对话的流式传输方式。数据在生成后立即被发送给用户,而不是等待所有数据都生成完毕后再一次性发送。

流式 API 提供了即时响应的体验,允许用户在内容生成过程中即时查看部分结果。相比等待整个响应完成,流式输出极大提高了用户体验。适用于多种场景,例如:

  1. 实时内容生成:用户在等待生成大段文本时,可以即时查看部分内容。
  2. 渐进式加载:减少等待时间,提升交互性。
  3. 流式处理:流式 API 让开发者能够边生成边处理数据,尤其适用于实时应用。

关于流式输出的深入介绍,可以仔细阅读乐予吕在“稀土掘金”(一个帮助开发者成长的社区)上写的技术文章《解读大型语言模型(LLM)API:了解流式输出的工作原理》,

文章链接:https://juejin.cn/post/7436761388851937319

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27193.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浙大 DeepSeek 线上课学习笔记

目录 DeepSeek&#xff1a;回望AI三大主义与加强通识教育 从达特茅斯启航的人工智能三大主义 人工智能三剑客之一&#xff1a;符号主义人工智能的逻辑推理 人工智能三剑客之二&#xff1a;连接主义人工智能的数据驱动 人工智能三剑客之三&#xff1a;行为主义人工智能的百…

【Python机器学习】1.2. 线性回归理论:一元线性回归、最小化平方误差和公式(SSE)、梯度下降法

喜欢的话别忘了点赞、收藏加关注哦&#xff08;关注即可查看全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 1.2.1. 什么是回归分析(Regressive Analysis)? 一些例子 举一些例子吧&#xff1a; 下图是…

golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)

目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险&#xff1a; 5.2漏洞利用&#xff1a; 5.3JavaScript 与 Native 代码通信 六、Chr…

算法日常刷题笔记(3)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第三篇笔记 笔记时间为2月24日到3月2日 第一天 设计有序流 设计有序流https://leetcode.cn/problems/design-an-ordered-stream/ 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码

本文项目编号 T 098 &#xff0c;文末自助获取源码 \color{red}{T098&#xff0c;文末自助获取源码} T098&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

三数之和_算法

1.题目描述 首先我们分析下这道题目:假设给我们一个数组,让数组某三个不同下标的数相加最终得0,那么我就返回这三个数.但是如果返回的多个数组中的元素相同,那么我们还要删掉其中一个保留一个. 注意:这道题的重点是三个数的下标不能相等并且返回的数组中的元素也不能相等,通过…

关于Deepseek本地部署硬件环境检查教程

要在电脑上本地部署DeepSeek&#xff0c;需要关注以下硬件和软件配置&#xff1a; 硬件配置 CPU&#xff1a;至少4核CPU&#xff0c;推荐Intel i5/i7或AMD Ryzen 5/7系列处理器。内存&#xff1a;至少8GB DDR4内存&#xff0c;推荐16GB DDR4内存&#xff0c;对于大型模型建议…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)

前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会有一个InputAction类型的文件,名字为InputSystem_Ac…

250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置

A. 配置Docker中的代理 绿联NAS简单解决docker无法获取镜像-不用软路由 - 哔哩哔哩 B. 下载官网对应的镜像 群晖NAS用docker搭建SearXNG元搜索引擎_哔哩哔哩_bilibili C. 修改默认省略的参数&#xff0c;只配置Base_URL&#xff0c;删除其它默认的空缺项 searxng-docker/REA…

C++-第十九章:异常

目录 第一节&#xff1a;异常有哪些 第二节&#xff1a;异常相关关键字 2-1.抛出异常 2-2.捕获异常 2-3.异常的捕获规则 2-3-1.异常被最近的catch捕获 2-3-2.catch捕获的是异常的拷贝 2-3-3.异常为子类时&#xff0c;可以用父类引用接收 2-4.捕获任意异常 第三节&#xff1…

Redis详解(实战 + 面试)

目录 Redis 是单线程的&#xff01;为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序

新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式&#xff1f;二、 为什么要用命令模式&#xff1f;三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源&#xff0c;一块为控制电路和传感器电路供电&#xff0c;另一块单独为电机供电。分开供电这样做的好处&#xff0c;有利于减小干扰&#xff0c;提高系统稳定性。 LM7805是常用的三端稳压器件&#xff0c;顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章&#xff1a;通过Docker安装Redis&#xff0c;并自定义config文件以及mount data目录。第2章&#xff1a;介绍Redis持久化到磁盘&#xff0c;有4种方式&#xff1a;RDB / AOF / NONE / RDB AOF。第3章&#xff1a;使用Server自带的redis-cli工具连接。第4章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包&#xff0c;该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具&#xff0c;是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串&#xff08;这里的有序指的是强调数据排列顺序的重要&#xff0c;不是升序降序的意思&#xff09;&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;一个列表最多可以存储2^32-1个元素。在R…