NLP(六十五)LangChain中的重連(retry)機制

??關于LangChain入門,讀者可參考文章NLP(五十六)LangChain入門 。
??本文將會介紹LangChain中的重連機制,并嘗試給出定制化重連方案。
??本文以LangChain中的對話功能(ChatOpenAI)為例。

LangChain中的重連機制

??查看LangChain中對話功能(ChatOpenAI)的重連機制(retry),其源代碼如下:

class ChatOpenAI(BaseChatModel):...def _create_retry_decorator(self) -> Callable[[Any], Any]:import openaimin_seconds = 1max_seconds = 60# Wait 2^x * 1 second between each retry starting with# 4 seconds, then up to 10 seconds, then 10 seconds afterwardsreturn retry(reraise=True,stop=stop_after_attempt(self.max_retries),wait=wait_exponential(multiplier=1, min=min_seconds, max=max_seconds),retry=(retry_if_exception_type(openai.error.Timeout)| retry_if_exception_type(openai.error.APIError)| retry_if_exception_type(openai.error.APIConnectionError)| retry_if_exception_type(openai.error.RateLimitError)| retry_if_exception_type(openai.error.ServiceUnavailableError)),before_sleep=before_sleep_log(logger, logging.WARNING),)def completion_with_retry(self, **kwargs: Any) -> Any:"""Use tenacity to retry the completion call."""retry_decorator = self._create_retry_decorator()@retry_decoratordef _completion_with_retry(**kwargs: Any) -> Any:return self.client.create(**kwargs)return _completion_with_retry(**kwargs)

可以看到,其編碼方式為硬編碼(hardcore),采用tenacity模塊實現重連機制,對于支持的報錯情形,比如openai.error.Timeout, openai.error.APIError等,會嘗試重連,最小等待時間為1s,最大等待時間為60s,每次重連等待時間會乘以2。

簡單重連

??我們嘗試用一個錯誤的OpenAI key進行對話,代碼如下:

from langchain.chat_models import ChatOpenAIdef chat_bot(input_text: str):llm = ChatOpenAI(temperature=0,model_name="gpt-3.5-turbo",openai_api_key="sk-xxx",max_retries=5)return llm.predict(input_text)if __name__ == '__main__':text = '中國的首都是哪里?'print(chat_bot(text))

盡管我們在代碼中設置了重連最大次數(max_retries),代碼運行時會直接報錯,不會重連,原因是LangChain中的對話功能重連機制沒有支持openai.error.AuthenticationError。輸出結果如下:

openai.error.AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys.

??此時,我們嘗試在源代碼的基礎上做簡單的定制,使得其支持openai.error.AuthenticationError錯誤類型,代碼如下:

# -*- coding: utf-8 -*-
import openai
from typing import Callable, Any
from tenacity import (before_sleep_log,retry,retry_if_exception_type,stop_after_attempt,wait_exponential,
)
from langchain.chat_models import ChatOpenAI
import logginglogger = logging.getLogger(__name__)class MyChatOpenAI(ChatOpenAI):def _create_retry_decorator(self) -> Callable[[Any], Any]:min_seconds = 1max_seconds = 60# Wait 2^x * 1 second between each retry starting with# 4 seconds, then up to 10 seconds, then 10 seconds after wardsreturn retry(reraise=True,stop=stop_after_attempt(self.max_retries),wait=wait_exponential(multiplier=1, min=min_seconds, max=max_seconds),retry=(retry_if_exception_type(openai.error.Timeout)| retry_if_exception_type(openai.error.APIError)| retry_if_exception_type(openai.error.APIConnectionError)| retry_if_exception_type(openai.error.RateLimitError)| retry_if_exception_type(openai.error.ServiceUnavailableError)# add new error| retry_if_exception_type(openai.error.AuthenticationError)),before_sleep=before_sleep_log(logger, logging.WARNING),)def completion_with_retry(self, **kwargs: Any) -> Any:"""Use tenacity to retry the completion call."""retry_decorator = self._create_retry_decorator()@retry_decoratordef _completion_with_retry(**kwargs: Any) -> Any:return self.client.create(**kwargs)return _completion_with_retry(**kwargs)def chat_bot(input_text: str):llm = MyChatOpenAI(temperature=0,model_name="gpt-3.5-turbo",openai_api_key="sk-xxx",max_retries=5)return llm.predict(input_text)if __name__ == '__main__':text = '中國的首都是哪里?'print(chat_bot(text))

分析上述代碼,我們在繼承ChatOpenAI類的基礎上重新創建MyChatOpenAI類,在_create_retry_decorator中的重連錯誤情形中加入了openai.error.AuthenticationError錯誤類型,此時代碼輸出結果如下:

Retrying __main__.MyChatOpenAI.completion_with_retry.<locals>._completion_with_retry in 1.0 seconds as it raised AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys..
Retrying __main__.MyChatOpenAI.completion_with_retry.<locals>._completion_with_retry in 2.0 seconds as it raised AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys..
Retrying __main__.MyChatOpenAI.completion_with_retry.<locals>._completion_with_retry in 4.0 seconds as it raised AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys..
Retrying __main__.MyChatOpenAI.completion_with_retry.<locals>._completion_with_retry in 8.0 seconds as it raised AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys..
Traceback (most recent call last):......
openai.error.AuthenticationError: Incorrect API key provided: sk-xxx. You can find your API key at https://platform.openai.com/account/api-keys.

從輸出結果中,我們可以看到,該代碼確實對openai.error.AuthenticationError錯誤類型進行了重連,按照源代碼的方式進行重連,一共嘗試了5次重連,每次重連等待時間是上一次的兩倍。

定制化重連

??LangChain中的重連機制也支持定制化。
??假設我們的使用場景:某個OpenAI key在調用過程中失效了,那么在重連時希望能快速切換至某個能正常使用的OpenAI key,以下為示例代碼(僅需要修改completion_with_retry函數):

    def completion_with_retry(self, **kwargs: Any) -> Any:"""Use tenacity to retry the completion call."""retry_decorator = self._create_retry_decorator()@retry_decoratordef _completion_with_retry(**kwargs: Any) -> Any:# 重連機制定制化(custom retry)kwargs['api_key'] = 'right openai key'return self.client.create(**kwargs)return _completion_with_retry(**kwargs)

此時就能進行正常的對話功能了。

總結

??本文介紹了LangChain中的重連機制,并嘗試給出定制化重連方案,希望能對讀者有所幫助。
??筆者的個人博客網址為:https://percent4.github.io/ ,歡迎大家訪問~

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

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

相關文章

【Mysql】數據庫基礎與基本操作

&#x1f307;個人主頁&#xff1a;平凡的小蘇 &#x1f4da;學習格言&#xff1a;命運給你一個低的起點&#xff0c;是想看你精彩的翻盤&#xff0c;而不是讓你自甘墮落&#xff0c;腳下的路雖然難走&#xff0c;但我還能走&#xff0c;比起向陽而生&#xff0c;我更想嘗試逆風…

Centos 7 出現 write error (disk full?)

問題 mysql 導入任務時&#xff0c;由于導出的 sql 文件是在很大 &#xff08;30G&#xff09;&#xff0c;利用 SQLDumpSpliter 切割工具 切成幾個 1G 大小的 sql 文件 結果在導入大半天&#xff0c;突然報錯 &#xff08;另一個服務器上更慘&#xff0c;都導入兩天快完成的…

一分鐘上手Vue VueI18n Internationalization(i18n)多國語言系統開發、國際化、中英文語言切換!

這里以Vue2為例子 第一步&#xff1a;安裝vue-i18n npm install vue-i18n8.26.5 第二步&#xff1a;在src下創建js文件夾&#xff0c;繼續創建language文件夾 在language文件夾里面創建zh.js、en.js、index.js這仨文件 這仨文件代碼分別如下&#xff1a; zh.js export de…

在Eclipse在Java里面調用Python腳本的方法

由于項目中需要用到Java調用Python的腳本&#xff0c;來實現一些功能&#xff0c;就對jython做了一些了解&#xff0c;通過jython可以實現java對python腳本的調用。Java調用Python開發環境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython庫來調用Python庫。Jyt…

你不得不懂的IT知識-《敏捷項目管理》

國林哥在IBM時&#xff0c;幾乎每天都會收到關于“敏捷”相關的郵件&#xff0c;公司鼓勵我們去學習郵件里的知識&#xff0c;參加敏捷相關的認證和培訓。剛開始我和大多數同事一樣不管不顧&#xff0c;后來隨著PBC里要求加上成長目標&#xff0c;比如要獲得一個認證&#xff0…

React使用antd的圖片預覽組件,點擊哪個圖片就預覽哪個的設置

使用了官方推薦的相冊模式的預覽&#xff0c;但是點擊預覽之后&#xff0c;每次都是從圖片列表的第一張開始預覽&#xff0c;而不是點擊哪張就從哪張開始預覽&#xff1a; 所以這里我就封裝了一下&#xff0c;對初始化預覽的列表進行了邏輯處理&#xff1a; 當點擊開始預覽的…

加載并繪制時間域內的心電圖信號,并實施Q因子為1的陷波濾波器以去除50 Hz頻率研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

一篇打通,pytest自動化測試框架詳細,從0到1精通實戰(一)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 pytest單元測試框…

redis學習筆記(七)

文章目錄 zset&#xff08;有序集合&#xff09;&#xff08;1&#xff09;添加成員&#xff08;2&#xff09;獲取score在指定區間的所有成員&#xff08;3&#xff09;獲取集合長度&#xff08;4&#xff09;獲取指定成員的權重值&#xff08;5&#xff09;獲取指定成員在集合…

2308C++簡單異步改造網絡庫

用簡單異步可以輕松改造同步網絡庫從而獲得大幅性能提升,用它改造異步回調網絡庫可以讓我們以同步方式寫代碼,讓代碼更簡潔,可讀性更好,還能避免回調地獄的問題. 本文通過兩個例子分別來介紹如何用簡單異步改造基于asio的同步網絡庫和異步回調網絡庫. 示例依賴了獨立版的asio(…

JavaWeb_總體介紹

文章目錄 1.總括2.JavaWeb項目架構 1.總括 2.JavaWeb項目架構

request.post,json和data

參考 https://zhuanlan.zhihu.com/p/140372568 https://zhuanlan.zhihu.com/p/140372568 介紹 這兩條請求語句使用了不同的參數傳遞方式&#xff0c;有以下區別&#xff1a;1. requests.post(urlhttp://xx.8.84.xx:8000/inference, jsondata)這個語句使用了 json 參數&#…

js設置css變量控制頁面一行展示指定個數的元素

前置知識&#xff1a; CSS變量之var()函數的應用——動態修改樣式 & root的使用 flex相關知識 場景&#xff1a; 動態設置給父元素內子元素設置每行排列幾個 通過 document.body.style.setProperty(--itemNum, 5)設置樣式變量&#xff0c;然后通過給父元素設置display: f…

RocketMQ發送消息失敗:error CODE: 14 DESC: service not available now, maybe disk full

在執行業務時&#xff0c;發現MQ控制臺沒有查詢到消息&#xff0c;在日志中發現消息發送失敗&#xff0c;報錯error CODE: 14 DESC: service not available now, maybe disk full 分析報錯應該是磁盤空間不足&#xff0c;導致broker不能進行正常的消息存儲刷盤&#xff0c;去查…

MySQL 窗口函數是什么,有這么好用

先看這段像天書一樣的 SQL ,看著就頭疼。 SELECTs1.name,s1.subject,s1.score,sub.avg_score AS average_score_per_subject,(SELECT COUNT(DISTINCT s2.score) 1 FROM scores s2 WHERE s2.score > s1.score) AS score_rank FROM scores s1 JOIN (SELECT subject, AVG(sco…

Android 13 MTK平臺添加自定義按鍵,以及CTS問題解決

添加自定義按鍵流程 一般來說上層添加以下幾處修改 驅動層的鍵值上報,讓驅動處理好即可 frameworks / base/core/java/android/view/KeyEvent.java public static final int KEYCODE_DEMO_APP_4 = 304;/** add by songhui for fingerprint Key code */+ public static fina…

IntelliJ IDEA Bookmark使用

1 增加 右鍵行號欄 2 查看 從favorite這里查看 參考IntelliJ IDEA 小技巧&#xff1a;Bookmark(書簽)的使用_bookmark idea 使用_大唐冠軍侯的博客-CSDN博客

neo4j的CQL命令實例演示

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

07-2_Qt 5.9 C++開發指南_二進制文件讀寫(stm和dat格式)

文章目錄 1. 實例功能概述2. Qt預定義編碼文件的讀寫2.1 保存為stm文件2.2 stm文件格式2.3 讀取stm文件 3. 標準編碼文件的讀寫3.1 保存為dat文件3.2 dat文件格式3.3 讀取dat文件 4. 框架及源碼4.1 可視化UI設計4.2 mainwindow.cpp 1. 實例功能概述 除了文本文件之外&#xff…

pve和openwrt以及我的電腦中網絡的關系和互通組網

情況1 一臺主機 有4個口&#xff0c;分別eth0,eth1,eth2,eth3 pve有管理口 這個情況下 &#xff0c;沒有openwrt 直接電腦和pve管理口連在一起就能進pve管理界面 情況2 假設pve 的管理口味eth0 openwrt中橋接的是eth0 eth1 eth2 那么電腦連接eth3或者pve管理口設置eth3&#xf…