当前位置: 首页 > news >正文

用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

相关文章:

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

文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...

JavaEE基础之- 过滤器和监听器Filter and Listener

目录 1. 过滤器 Filter 1.1. 初识过滤器 1.1.1. 过滤器概念 1.1.2. 过滤器例子 1.2. 过滤器详解 1.2.1. 过滤器生命周期 1.2.2. FilterConfig 1.2.3. FilterChain 1.1.4. 过滤器执行顺序 1.2.5. 过滤器应用场景 1.2.6. 过滤器设置目标资源 1.2.7. 过滤器总结 1.3 过滤…...

JavaAdv01——字节流和字符流

一、核心概念解析 1. 字节流&#xff08;Byte Streams&#xff09; 字节流家族&#xff1a; 输入流&#xff1a;InputStream&#xff08;抽象类&#xff09; FileInputStream ByteArrayInputStream BufferedInputStream 输出流&#xff1a;OutputStream FileOutputStream…...

HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法

【高心星出品】 文章目录 多线程Worker和Sendable的使用方法开发步骤运行结果 多线程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一种多线程的实现方式&#xff0c;它允许开发者在后台线程中执行长耗时任务&#xff0c;从而避免阻塞主线程并提高应用的响应性。 S…...

AI赋能传热学研究:创新与乐趣的深度融合

在科技飞速发展的当下&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到各个领域&#xff0c;为不同行业带来了前所未有的变革与机遇。对于传热学研究而言&#xff0c;AI的介入不仅极大地提高了研究效率&#xff0c;还为研究者带来了全新的体验和思考。本文将深入探…...

Hive-03之传参、常用函数、explode、lateral view、行专列、列转行、UDF

大数据分析利器之hive 一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1、hive的参数传递 1、Hive命令行 语法结构 hive [-hiveconf xy]* [<-i filename&…...

如何将Vue项目部署至 nginx

一、准备工作 1.确保安装了开发软件VS Code&#xff08;此处可查阅安装 VS Code教程&#xff09;&#xff0c;确保相关插件安装成功 2.安装Node.js和创建Vue项目&#xff08;此处可查阅安装创建教程&#xff09; 3.成功在VS Code运行一个Vue项目&#xff08;此处可查阅运行教…...

SwiftUI之状态管理全解析

文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…...

Java-servlet(一)Web应用与服务端技术概念知识讲解

Java-servlet&#xff08;一&#xff09;Web应用与服务端技术概念知识讲解 前言一、Web 应用1.WEB CS BS 对比2.WEB 介绍3.web 与 http 的关系 二、servlet服务端技术1. 公共网关接口&#xff08;CGI&#xff09;2. servlet 是什么3.servlet 作用4. servlet 特性 前言 在当今时…...

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点&#xff1a; 能更容易地对其进行归档和备份.打印时可以选择双面打印&#xff0c;减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf&#xff0c;双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …...

数据集笔记:新加坡停车费

data.gov.sg 该数据集包含 新加坡各停车场的停车费&#xff0c;具体信息包括&#xff1a; 停车场名称&#xff08;Carpark&#xff09;&#xff1a;如 Toa Payoh Lorong 8、Ang Mo Kio Hub、Bras Basah Complex 等。停车区域类别&#xff08;Category&#xff09;&#xff1a…...

易错点abc

在同一个输入流上重复创建Scanner实例可能会导致一些问题&#xff0c;包括但不限于输入流的混乱。尤其是在处理标准输入&#xff08;System.in&#xff09;时&#xff0c;重复创建Scanner对象通常不是最佳实践&#xff0c;因为这可能导致某些输入数据丢失或者顺序出错。 为什么…...

leetcode第39题组合总和

原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以…...

【iOS】小蓝书学习(七)

小蓝书学习&#xff08;七&#xff09; 前言第47条&#xff1a;熟悉系统框架第48条&#xff1a;多用枚举块&#xff0c;少用for循环第50条&#xff1a;构建缓存使选用NSCache而非NSDictionary第51条&#xff1a;精简initialize与load的实现代码第52条&#xff1a;别忘了NSTimer…...

基于第三方SDK的Windows平台全功能RTMP|RTSP直播播放器深度解析

一、引言 在当今数字化时代&#xff0c;直播技术的应用场景不断拓展&#xff0c;从娱乐直播到教育、医疗、工业等多个领域&#xff0c;都对直播播放器的功能和性能提出了更高的要求。本文将介绍一款基于第三方SDK实现的全功能直播播放器&#xff0c;从技术实现、功能特点、用户…...

命名实体识别与文本生成算法

在自然语言处理&#xff08;NLP&#xff09;的浩瀚星空中&#xff0c;命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;与文本生成算法如同两颗璀璨的星辰&#xff0c;各自闪耀&#xff0c;又相互辉映&#xff0c;共同推动着人工智能技术在语言理解与生成领…...

题解 | 牛客周赛83 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…...

样式和ui(待更新)

element-plus 先在项目下执行安装语句执行按需导入的命令按照官方文档修改vitest.json sass样式定制 npm -i sass -D在项目下准备定制的样式文件 styles/element/index.scss(!注意这里是.scss文件在vitest.json 修改配置文件 Components({resolvers: [ElementPlusResolver(…...

「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」

Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时&#xff0c;操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能&#xff0c;让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…...

C++的类和对象入门

目录 目录 目录 一、类 1.1类的定义 1.2访问限定符 1.3类域 1.4类的命名规范 1.5class和struct的默认访问权限 二、类的实例化 2.2对象的大小和存储 2.3空类的大小 三、this指针 3.1this指针的定义 3.2this指针的作用 3.2.1区分同名变量和局部变量 3.2.2返回对象…...

【清华大学】DeepSeek从入门到精通完整版pdf下载

DeepSeek从入门到精通.pdf 一共104页完整版 下载链接: https://pan.baidu.com/s/1-gnkTTD7EF2i_EKS5sx4vg?pwd1234 提取码: 1234 或 链接&#xff1a;https://pan.quark.cn/s/79118f5ab0fd 一、DeepSeek 概述 背景与定位 DeepSeek 的研发背景 核心功能与技术特点&#xff08…...

deepseek使用记录18——文化基因之文化融合

文明长河中的生命浪花 在洛阳白马寺的银杏树下&#xff0c;年轻母亲指着"农禅并重"碑刻给孩子讲述祖辈耕作的故事&#xff1b;在哔哩哔哩的直播间里&#xff0c;00后女孩穿着汉服跳起街舞&#xff0c;弹幕飘过"这才是文化缝合怪"。当文明交融的宏大叙事照…...

Java 大视界 -- Java 大数据在智慧文旅游客流量预测与景区运营优化中的应用(110)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

面试题:说一下你对DDD的了解?

面试题:说一下你对DDD的了解? 在面试中,关于 DDD(领域驱动设计,Domain-Driven Design) 的问题是一个常见的技术考察点。DDD 是一种软件设计方法论,旨在通过深入理解业务领域来构建复杂的软件系统。以下是一个清晰、详细的回答模板,帮助你在面试中脱颖而出: DDD 的定义…...

网络编程——UDP

UDP编程使用套接字&#xff08;Socket&#xff09;进行通信。下面是基于UDP协议进行网络编程的基本步骤。 1. 创建套接字 首先&#xff0c;客户端和服务器都需要通过 socket() 系统调用创建一个UDP套接字。 2. 配置地址和端口 UDP是无连接的&#xff0c;因此你不需要像TCP一…...

【网络安全 | 渗透测试】GraphQL精讲二:发现API漏洞

未经许可,不得转载。 推荐阅读:【网络安全 | 渗透测试】GraphQL精讲一:基础知识 文章目录 GraphQL API 漏洞寻找 GraphQL 端点通用查询常见的端点名称请求方法初步测试利用未清理的参数发现模式信息使用 introspection探测 introspection运行完整的 introspection 查询可视化…...

代码随想录Day23 | 39.组合总和、40.组合总和II、131.分割回文串

39.组合总和 自己写的代码&#xff1a; class Solution { public:vector<int> path;vector<vector<int>> res;int sum0;void backtracking(vector<int>& candidates,int target,int startIndex){if(sum>target) return;if(sumtarget){res.pus…...

MyBatis 新手入门教程:基础操作篇

MyBatis 新手入门教程&#xff1a;基础操作篇 适合人群&#xff1a;无 MyBatis 使用经验者 &#xff08;完整版3.3准时发&#xff0c;此篇为新手入门的基础操作&#xff09; 一、MyBatis 是什么&#xff1f; 简单理解&#xff1a; MyBatis 是一个帮你操作数据库的工具&#x…...

zjbdt

嵌入式软件工程师可以通过考取相关职业证书来提升专业能力和职业竞争力。以下是几种含金量较高且广受认可的证书&#xff1a; 1. NIEH 嵌入式技术工程师证书 颁发机构&#xff1a;教育部考试中心级别&#xff1a;初级、中级、高级内容&#xff1a;涵盖嵌入式系统的基础理论、开…...

行为型模式 - 中介者模式 (Mediator Pattern)

行为型模式 - 中介者模式 (Mediator Pattern) 中介者模式的核心思想是将对象之间的复杂交互封装到一个中介者对象中&#xff0c;从而降低对象之间的耦合度。 import java.util.ArrayList; import java.util.List;// 抽象中介者类 abstract class TowerMediator {public abstra…...

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…...

同步类型对比

同步类型对比 特性准同步 (Quasi-Synchronization)完全同步 (Complete Synchronization)渐进同步 (Asymptotic Synchronization)定义系统状态在有限时间内接近同步&#xff0c;但存在微小误差。系统状态在有限时间内完全一致。系统状态随时间趋近于同步&#xff0c;但可能需要…...

python爬虫Scapy框架(1)

简介 什么是框架&#xff1f; 所谓的框&#xff0c;其实说白了就是一个【项目的半成品】&#xff0c;该项目的半成品需要被集成了各种功能且具有较强的通用性。 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;非常出名&#xff0c;非…...

java容器 LIst、set、Map

Java容器中的List、Set、Map是核心数据结构&#xff0c;各自适用于不同的场景 一、List&#xff08;有序、可重复&#xff09; List接口代表有序集合&#xff0c;允许元素重复和通过索引访问&#xff0c;主要实现类包括&#xff1a; ArrayList 底层结构&#xff1a;动态数组…...

2W8000字 LLM架构文章阅读指北

❝ 大模型架构专栏已经更新了30多篇文章。完整的专栏内容欢迎订阅&#xff1a; LLM 架构专栏 1、LLM大模型架构专栏|| 从NLP基础谈起 2、 LLM大模型架构专栏|| 自然语言处理&#xff08;NLP&#xff09;之建模 3、 LLM大模型架构之词嵌入&#xff08;Part1&#xff09; 3、 LLM…...

Milkv-duo256 接入tuya 云并实现远程智能控制

tuyaopen-embedded-core 是将 https://github.com/tuya/tuyaopen 连接 tuya 云相关核心组件重新组织&#xff0c;可快速嵌入至各种嵌入式平台使用。 tuyaopen-embedded-core 可通过 WiFi、有线以太网、CAT-1、4G 等多种方式接入涂鸦云&#xff0c;实现设备远程控制、OTA 等功能…...

Hadoop之02:MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…...

YOLOv8目标检测推理流程及C++代码

这部分主要是使用c++对Onnx模型进行推理,边先贴代码,过段时间再详细补充下代码说明。 代码主要分成三部分,1.main_det.cpp推理函数主入口;2.inference_det.h 头文件及inference_det.cpp具体函数实现;3.CMakeList.txt. 1.main_det 推理配置信息全部写在config.txt中,执行…...

【AVRCP】深入解析AVRCP应用层:功能支持与映射

在最近的项目开发中&#xff0c;深入研究了Audio/Video Remote Control Profile&#xff08;AVRCP&#xff09;的应用层特性。在蓝牙音频/视频远程控制规范&#xff08;AVRCP&#xff09;的架构中&#xff0c;应用层扮演着至关重要的角色&#xff0c;它定义了符合该规范的设备所…...

springboot之HTML与图片生成

背景 后台需要根据字段动态生成HTML&#xff0c;并生成图片&#xff0c;发送邮件到给定邮箱 依赖 <!-- freemarker模板引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifa…...

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…...

链表的概念和结构

文章目录 1. 链表的概念2. 链表的分类3. 单向不带头非循环链表3.1 接口设计&#xff08;SList.h&#xff09;3.2 接口实现&#xff08;SList.c&#xff09;1&#xff09;打印和创建结点2&#xff09;头尾插入删除3&#xff09;查找和插入4&#xff09;删除和销毁 3.3 完整代码S…...

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难&#xff1f; 我总结了四篇近期的研究论文&#xff0c;来展示AI是如何以及为什么侵蚀我们的批判性思维能力。 作者使用AI制作的图像 前言&#xff1a;作者在这篇文章中&#xff0c;借AI技术的崛起&#xff0c;揭示了一场悄然发生的思想博弈。表面…...

Github 2025-03-02 php开源项目日报Top10

根据Github Trendings的统计,今日(2025-03-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1JavaScript项目1Nextcloud服务器:安全的数据之家 创建周期:2796 天开发语言:PHP, JavaScript协议类型:GNU Affero Gene…...

智能座舱介绍

目录 智能座舱智能座舱的核心技术组成车载信息娱乐系统(IVI)数字仪表盘与HUD(抬头显示)语音交互与AI助手多屏联动与场景化交互生物识别技术智能座舱的发展趋势沉浸式体验情感化与个性化多模态交互融合车联网(V2X)生态扩展应用场景挑战与未来硬件系统软件系统关键技术智能…...

2025年能源工作指导意见

2025年是“十四五”规划收官之年&#xff0c;做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署&#xff0c;以能源高质量发展和高水平安全助力我国经济持续回升向好&#xff0c;满足人民群众日益增长的美好生活用能需求&#xff0c;制定本意见。 一、总体要求…...

​豪越科技:智慧园区后勤单位消防安全管理,实时告警与整改闭环

在当今数字化、智能化飞速发展的时代&#xff0c;智慧园区已成为现代产业发展的重要载体。而园区后勤单位的消防安全管理&#xff0c;作为保障园区安全运营的关键环节&#xff0c;正面临着前所未有的挑战与机遇。豪越科技凭借其先进的技术和丰富的经验&#xff0c;为智慧园区后…...

zookeeper-docker版

Zookeeper-docker版 1 zookeeper概述 1.1 什么是zookeeper Zookeeper是一个分布式的、高性能的、开源的分布式系统的协调&#xff08;Coordination&#xff09;服务&#xff0c;它是一个为分布式应用提供一致性服务的软件。 1.2 zookeeper应用场景 zookeeper是一个经典的分…...

华为手机自助维修的方法

测试环境&#xff1a;华为荣耀 &#xff08;全文完&#xff09;...

基于Springboot博物馆文博资源库系统【附源码】

基于Springboot博物馆文博资源库系统 效果如下&#xff1a; 系统登陆页面 文物信息管理页面 流动申请页面 文物报修页面 个人信息页面 文物保修管理页面 系统主页面 文物类型页面 研究背景 随着信息技术的飞速发展&#xff0c;博物馆文博资源的管理与利用日益受到重视。传统…...