OpenAI流式解析

OpenAI 流式的代碼:

首選一般請使用os.getenv 去讀環境變量的內容

注意使用pip install python-dotenv 的安裝方法

load_dotenv 是這個庫提供的一個函數,用于讀取 .env 文件并將其中定義的鍵值對設置為系統的環境變量。

默認情況下,load_dotenv() 會自動查找當前目錄下的 .env 文件。如果文件不在默認路徑,可以通過參數指定,例如 load_dotenv(‘/path/to/.env’)。

為什么代碼里用 dotenv 而不是 python_dotenv?

在 Python 中,導入模塊時使用的是庫的模塊名,而不是 PyPI 上的包名。python-dotenv 這個包安裝后,提供了一個名為 dotenv 的模塊供導入。這是由庫開發者決定的命名約定。例如:

  • PyPI 包名:python-dotenv
  • 導入時的模塊名:dotenv

流式代碼 類 (一鍵運行)

from openai import  AsyncOpenAI
from dotenv import load_dotenv
import osload_dotenv()class AsyncOpenAIOut:def __init__(self):self.api_key = os.getenv("OPENAI_API_KEY")self.base_url = os.getenv("OPENAI_BASE_URL")self.oai_client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url)self.model = os.getenv("OPENAI_MODEL")async def gpt_stream(self, user_message: str,model: str = os.getenv("OPENAI_MODEL"),history: list[dict] = [],system_prompt: str = "") :messages = []if history:messages.extend(history)if system_prompt:messages.extend([{"role": "system", "content": system_prompt}])messages.append({"role": "user", "content": user_message})response = await self.oai_client.chat.completions.create(model=model,messages=messages,stream=True)async for chunk in response:if chunk.choices[0].delta.content:yield chunk.choices[0].delta.contentasync_openai_out = AsyncOpenAIOut()if __name__ == "__main__":async def test_gpt_stream():async for chunk in async_openai_out.gpt_stream(user_message="寫300字作文",system_prompt="You are a helpful assistant."):print(chunk)import asyncioasyncio.run(test_gpt_stream())

這里面有幾點需要注意:

簡短回答:print(chunk) 是 同步操作會在當前事件循環中執行完畢后才繼續但它不是 I/O 密集型操作,所以不會造成實際的“阻塞”問題,特別是在異步函數中逐步輸出內容的場景下,它是可接受的。

想確保異步非阻塞輸出:

        async for chunk in async_openai_out.gpt_stream(user_message="寫300字作文",system_prompt="You are a helpful assistant."):# print(chunk)await asyncio.to_thread(print, chunk)  # 在后臺線程執行 print

異步生成器(Async Generator) 的用法,結合了 Python 的異步編程(async for)和生成器(yield)機制。

在異步迭代 response 中的每個 chunk,如果它有內容,就通過 yield 一塊一塊地“流式返回”。

async for chunk in response:if chunk.choices[0].delta.content:yield chunk.choices[0].delta.content

對比for : 普通for是同步迭代

async for是異步迭代,比如網絡流、WebSocket、OpenAI 的 Stream 響應等。

yield 是生成器的關鍵,它不是“返回”值,而是“產出”值(可以被迭代一次)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據抓取的緩存策略:減少重復請求與資源消耗

在數據采集領域,爬蟲效率是決定項目成敗的關鍵因素之一。傳統的爬蟲架構往往因請求頻繁、資源消耗較大以及重復抓取等問題,導致效率低下。這些問題不僅拖慢了數據獲取的速度,還可能引發目標服務器的過載風險,甚至導致爬蟲被限制。…

k8s部署argocd

前言 ArgoCD是一個基于Kubernetes的GitOps持續交付工具,應用的部署和更新都可以在Git倉庫上同步實現,并自帶一個可視化界面。本文介紹如何使用GitHelmArgocd方式來實現在k8s中部署和更新應用服務; 安裝Argocd 準備一個k8s集群,然…

【Linux】MAC幀

目錄 一、MAC幀 (一)IP地址和MAC地址 (二)MAC幀格式 (三)MTU對IP協議的影響、 (四)MTU對UDP協議的影響 (五)MTU對TCP協議的影響 二、以太網協議 &…

MySQL - 數據庫基礎操作

SQL語句 結構化查詢語言(Structured Query Language),在關系型數據庫上執行數據操作、數據檢索以及數據維護的標準語言。 分類 DDL 數據定義語言(Data Definition Language),定義對數據庫對象(庫、表、列、索引)的操作。 DML 數據操作語言(Data Manip…

GraalVM原生鏡像支持:Spring Cloud應用啟動速度提升90%

引言:當Spring Cloud遇見GraalVM,啟動時間進入秒級時代 傳統Spring Cloud應用因動態類加載、反射等機制導致啟動緩慢(通常超過30秒),在Serverless和Kubernetes滾動更新場景下成為性能瓶頸。Spring Cloud 2023.x通過**G…

【Unity3D】攝像機適配場景以及Canvas適配

目錄 寬度不變策略 高度不變策略 寬度不變策略 開發分辨率 750*1334 (寬高比:0.56) 真機分辨率 1170*2532 (寬高比:0.46) 真機寬高比<開發寬高比&#xff0c;采用寬度不變策略 理由&#xff1a;小于代表真機高度比開發高度更大&#xff0c;因此不需要擔心高度上…

HarmonyOS:基于axios實現文件的下載以及下載進度的監聽

#前言&#xff1a;項目開發中&#xff0c;避免不了實現文件下載功能&#xff0c;其他平臺的下載都很成熟&#xff0c;網上的例子也比較多&#xff0c;我就自己項目中實現的下載功能做個總結&#xff0c;你可以參考我的寫法實現功能。 下載封裝基于axios實現的下載功能。 1.下載…

簡單一周日期展示及選擇切換

醫院掛號&#xff0c;可能需要切換日期&#xff0c;選擇一周內的某一天。 提供一周內的日期段&#xff0c;通過點擊&#xff0c;切換到不同天。 簡單的js&#xff0c;html實例。切換玩調用后臺接口&#xff0c;實現后續邏輯。 使用Vue,插值語法&#xff0c;更簡單。 一周日歷…

二叉樹的前,中,后序遍歷

我們來了解一下二叉樹的遍歷&#xff0c;話不多說 二叉樹的遍歷的概念&#xff1a; 二叉樹有四種遍歷方式&#xff0c;分別為前序遍歷&#xff0c;中序遍歷&#xff0c;后序遍歷和層序遍歷&#xff0c;但我們今天談談前三種&#xff0c;并實現它 前序遍歷&#xff1a; 按照根…

golang Error的一些坑

golang Error的一些坑 golang error的設計可能是被人吐槽最多的golang設計了。 最經典的err!nil只影響代碼風格設計&#xff0c;而有一些坑會導致我們的程序發生一些與我們預期不符的問題&#xff0c;開發過程中需要注意。 ?? errors.Is?判斷error是否Wrap不符合預期 ?…

逼用戶升級Win11,微軟開始給Win10限速

隨著Windows10的支持時間越來越短&#xff0c;微軟也加大了對Win10用戶的驅趕力度。 最近&#xff0c;微軟官宣了將要在今年6月份降低OneNote for Windows 10的同步速度。軟件也將和Windows10在今年的10月14日一同停止支持和維護。 這將影響實時協作和多設備訪問。 對OneNote…

SpringMVC_day02

一、SSM 整合 核心步驟 依賴管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 數據源、Jackson 等依賴。注意點&#xff1a;確保版本兼容性&#xff08;如 Spring 5.x 與 MyBatis 3.5.x&#xff09;。 配置類 SpringConfig&#xff1a;掃描 Service 層、啟用事務管理、導入…

Android14 原生PackageInstaller安裝某些apk報錯問題

最近遇到Android14安裝客戶一個大型app的時候&#xff0c;執行到開始安裝的時候就直接閃退了&#xff0c;查看log發現下面報錯&#xff1a; 03-25 18:01:29.531 3085 3085 E AndroidRuntime: java.lang.RuntimeException: Could not copy bitmap to parcel blob. 03-25 18:01:2…

SQLAlchemy關鍵詞搜索技術深度解析:從基礎過濾到全文檢索

在數據驅動的應用開發中&#xff0c;基于關鍵詞的模糊查詢是常見的業務需求。SQLAlchemy作為Python生態中最流行的ORM框架&#xff0c;提供了多種實現關鍵詞搜索的技術方案。本文將從性能、適用場景和技術復雜度三個維度&#xff0c;系統對比分析SQLAlchemy中關鍵詞搜索的最佳實…

基于 ffmpeg 實現合并視頻

ffmpeg是一個強大的多媒體處理工具&#xff0c;支持視頻文件的合并。 列出目錄下所有MP4文件 import os import glob# 當前目錄 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目錄下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

算法每日一練 (20)

&#x1f4a2;歡迎來到張翊塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (20)不同路徑 II題目描述解題思路解題代…

【銀河麒麟系統常識】命令:uname -m(查看系統架構)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 終端命令&#xff0c;用于顯示當前系統的硬件架構&#xff1b; 返回 返回系統的CPU架構類型&#xff0c;用于判斷軟件兼容性&#xff1b; 輸出結果架構說明常見設備x86_64Intel/AMD 64位 CPU主流 PC、服務器aarch64ARM 64位 …

sql結尾加刷題

找了一下mysql對extractvalue()、updatexml()函數的官方介紹https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知識點 解釋一下這兩個參數xml_frag&#xff0c;是xml標記片段&#xff0c;第二個參數…

JVM類加載過程詳解

文章目錄 前言1.加載2.鏈接驗證文件格式驗證元數據驗證字節碼驗證符號引用驗證 準備解析 3.初始化4.類卸載 前言 類從被加載到虛擬機內存中開始到卸載出內存為止&#xff0c;它的整個生命周期可以簡單概括為 7 個階段&#xff1a;加載&#xff08;Loading&#xff09;、驗證&a…

el-select 可搜索下拉框 在ios、ipad 無法喚出鍵盤,造成無法輸入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;選中選項后&#xff0c;希望立即失去焦點&#xff0c;收起鍵盤&#xff0c;執行其他邏輯 【效果圖】&#xff1a;分組展示選項 >【去界面操作體驗】 首先&#xff0c;通過 夸克瀏覽器的搜索: el-select 在 ipad 輸入框…