中国那些企业做网站做得好/百度关键词的费用是多少

中国那些企业做网站做得好,百度关键词的费用是多少,bs网站开发,传奇页游开服文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…

文章目录

  • 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.mzph.cn/web/71080.shtml

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

相关文章

大模型技术:重塑未来的力量

大模型技术之所以成为当今科技领域的热点&#xff0c;是因为它拥有改变游戏规则的能力。以ChatGPT为例&#xff0c;这款由OpenAI开发的大型语言模型&#xff0c;首次实现了基于语言的智能涌现&#xff0c;推动了通用人工智能的技术飞跃和快速进化。大模型通过强大的数据处理能力…

框架模块说明 #09 日志模块_02

背景 上篇我们介绍了系统日志处理方式&#xff0c;也结合我们实际和日志系统集成的需求&#xff0c;将我们的日志文件配置成json格式。这次我们针对我们操作日志的处理进行一些介绍。 还是采用传统的aop的形式进行操作日志的保存&#xff0c;并按业务类型进行定义保存到mongodb…

记Android12上一个原生bug引起的system_server crash

欢迎使用Markdown编辑器 一. 现象描述 近日测试上报一个几乎必现的crash&#xff0c;描述如下: 现象: launcher编辑状态与锁屏解锁交互时系统概率性重启 操作步骤: 进入launcher组件编辑状态按电源键灭屏后亮屏&#xff0c;锁屏界面上滑解锁launcher编辑状态向右或向左滑动重…

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

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

《Qt动画编程实战:轻松实现头像旋转效果》

《Qt动画编程实战&#xff1a;轻松实现头像旋转效果》 Qt 提供了丰富的动画框架&#xff0c;可以轻松实现各种平滑的动画效果。其中&#xff0c;旋转动画是一种常见的 UI 交互方式&#xff0c;广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…

8 SpringBootWeb(下):登录效验、异步任务和多线程、SpringBoot中的事务管理@Transactional

文章目录 案例-登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术2.2.3 JWT令牌(Token)2.2.3.…

mysql系列10—mysql锁

背景 mysql中锁机制核心是保证数据的一致性以及并发控制。锁机制的实现与存储引擎有关&#xff0c;本文介绍的是INNODB存储引擎的锁机制&#xff1b;其他存储引擎如myISAM和memory等仅支持表锁不支持行锁&#xff0c;不是本文关注的重点。 本文介绍mysql数据库提供的锁机制&am…

Redis7——基础篇(八)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

yolov12 部署瑞芯微 rk3588、RKNN 部署工程难度小、模型推理速度快

yolov12 部署又来了。 特别说明&#xff1a;如有侵权告知删除&#xff0c;谢谢。 完整代码&#xff1a;包括onnx转rknn和测试代码、rknn板端部署C代码&#xff1a; 【onnx转rknn和测试代码】 【rknn板端部署C代码】 1 模型训练 yolov12训练官方开源的已经非常详细了&#…

windows本地化部署Dify+Deepseek

Windows本地化部署DifyDeepseek 一、下载Docker 前往 Docker 官网 下载 Docker Desktop&#xff0c;按序安装。 1.1启用WSL 打开本机的控制面板>程序>启用或关闭 Windows 功能,勾选: Linux 的 Windows 子系统虚拟机平台&#xff08;若无该选择则勾选 Hyper-V &#…

第二十四:5.2【搭建 pinia 环境】axios 异步调用数据

第一步安装&#xff1a;npm install pinia 第二步&#xff1a;操作src/main.ts 改变里面的值的信息&#xff1a; <div class"count"><h2>当前求和为&#xff1a;{{ sum }}</h2><select v-model.number"n">  // .number 这里是…

使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流

在现代工作与学习中&#xff0c;可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本&#xff0c;结合 Typora 快速生成流程图和甘特图&#xff0c;并通过 Markdown 格式生成思维导图&#xff0c;最终…

【数据集】ACM数据集

ACM&#xff08;Association for Computing Machinery&#xff09;数据集是计算机科学领域常用于研究学术论文、作者关系、引文网络、推荐系统、图神经网络&#xff08;GNN&#xff09;等任务的数据集之一。该数据集通常包含学术论文、作者、研究领域以及它们之间的关系&#x…

SQL server配置ODBC数据源(本地和服务器)

本地配置 1. 控制面板中找到系统ODBC数据源&#xff08;打开控制面板直接搜&#xff09; 2. 选择“系统DSN”&#xff0c;点击“添加” 3. 选择“SQL server” 4. 名称和描述自己填&#xff0c;服务器选择本机设备名称 5. 选择ID和密码验证&#xff0c;并填写本地SQL server登…

使用 Postman 访问 Keycloak 端点

1. 引言 在本教程中&#xff0c;我们将首先快速回顾 OAuth 2.0、OpenID 和 Keycloak。然后&#xff0c;我们将了解 Keycloak REST API 以及如何在 Postman 中调用它们。 2. OAuth 2.0 OAuth 2.0 是一个授权框架&#xff0c;它允许经过身份验证的用户通过令牌向第三方授予访问…

微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发

目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP&#xff08;高级消息队列协议&#xff09;应用开发的一套工具集&#xff0c;主要针对RabbitMQ等消息中间件的集成…

WPF高级 | WPF 与数据库交互:连接、查询与数据更新

WPF高级 | WPF 与数据库交互&#xff1a;连接、查询与数据更新 前言一、数据库交互基础概念1.1 数据库简介1.2 数据访问技术 二、WPF 与数据库连接2.1 连接字符串2.2 建立连接 三、WPF 中的数据查询3.1 使用ADO.NET进行数据查询3.2 使用 Entity Framework 进行数据查询3.3 使用…

【ESP32S3接入讯飞在线语音识别】

【ESP32S3接入讯飞在线语音识别】 1. 前言1.1 步骤概括1.2 硬件介绍1.3 接线2. 操作流程2.1 创建语音识别应用2.2 记录API秘钥3. JSON语音接入api3.1 JSON格式3.2 交互流程3.2 ESP32S3 Sense接入代码1. 核心功能2. 主要模块3. 工作流程4. 典型应用场景5. 关键技术点6. 待完善功…

学生管理前端

文章目录 首页student.html查询功能 首页 SpringBoot前端html页面放在static文件夹下&#xff1a;/src/main/resources/static 默认首页为index.html&#xff0c;我们可以用两个超链接或者两个button跳转到对应的页面。这里只是单纯的跳转页面&#xff0c;不需要提交表单等其…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…