RAGs:自動化評估 RAG 示例代碼

文章目錄

  • 原理
  • 忠實度(Faithfulness)
  • 答案相關性(Answer Relevance)
  • 上下文相關性(Context Relevance)
  • 上下文召回率(Context Recall)
  • 答案正確性(Answer Correctness)
  • 答案完整性(Answer Integrity)

原理

  • 關于 RAG 評估體系的見解

忠實度(Faithfulness)

def faithfulness_test():""" 忠實度 1 """question = "愛因斯坦出生于何時何地?"answer = "愛因斯坦于1879年3月14日出生于德國。"f_1_prompt = f"""給定一個問題和答案,請你從給定答案的每個句子中創建一個或多個陳述。并按如下格式編號輸出:陳述1:[陳述1]陳述2:[陳述2]...問題:{question}答案:{answer}"""""" 忠實度 2 """relevant_context = ["阿爾伯特·愛因斯坦(Albert Einstein,1879 年 3 月 14 日出生)是一位出生于德國的理論物理學家,被廣泛認為是有史以來最偉大、最有影響力的科學家之一。",]statements = '陳述1:愛因斯坦出生于德國。\n陳述2:愛因斯坦的出生日期是1879年3月14日。'f_2_prompt = f"""你的任務是根據給定的上下文判斷以下陳述的可信度。具體要求如下:1. 對于每個陳述,請你判斷它是否可以從給定的上下文信息中推斷。2. 如果上下文支持該陳述,請返回 1;如果不支持該陳述,請返回 0。3. 請按照以下格式返回結果:陳述1:1或0陳述2:1或0...上下文:{relevant_context}陳述:{statements}"""response = client.chat.completions.create(model=OPENAI_MODEL,# messages=[{"role": "user", "content": f_1_prompt}],messages=[{"role": "user", "content": f_2_prompt}],)print(response.choices[0].message)answer = response.choices[0].message.contentprint(answer)

答案相關性(Answer Relevance)

def answer_relevance_test():gt_question = "法國在哪里,首都是哪里?"""" 答案相關性 """# answer = "法國位于西歐,巴黎是其首都。"answer = "中國的首都是北京,中國位于亞洲,中國萬歲!"# answer = "我今天中午想吃拉面了,蘭州牛肉拉面。"# prompt = f"""# 請你為給定的答案生成一個或多個不重復的問題。# 請注意,你需要判斷給定的答案是否模棱兩可。如果是模棱兩可,請返回 1;否則返回 0。模棱兩可的答案是指那些回避的、含糊的或模糊不清的答案。例如:“不知道”、“不確定”等。# 答案:{answer}# 結果請以List形式返回:["問題1","問題2",...],并在列表最后添加判斷結果(1或0)。# """prompt = f"""請你為給定的答案生成一個或多個不重復的問題。答案:{answer}結果請以JSON形式返回:{{"生成問題1": 問題1, "生成問題2": 問題2, ...}}"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)print(response.choices[0].message)answer = response.choices[0].message.contentprint("[DEBUG] answer: ", answer)print("[DEBUG] type(answer): ", type(answer))answer = list(json.loads(answer).values())questions = answerprint("[DEBUG] questions: ", questions)sim_sum = np.array([cosine_similarity(get_text_embedding(client, gt_question), get_text_embedding(client, q)) for q in questions])ar = np.average(sim_sum)print("[DEBUG] sim_sum: ", sim_sum)print("[DEBUG] AR: ", ar)

上下文相關性(Context Relevance)

def context_relevance_test():"""上下文相關性"""question = "法國的首都是哪里?"context = ["法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。其首都巴黎以其時裝屋、盧浮宮等古典藝術博物館和埃菲爾鐵塔等古跡而聞名。","法國首都巴黎位于法國東部,是法國第二大城市。該國還以其葡萄酒和精致的美食而聞名。"]prompt = f"""請你從提供的上下文中提取所有可能有助于回答以下問題的相關句子。具體要求如下:1.提取所有不重復的相關句子。2.如果找不到相關句子,或者你認為無法從給定的上下文中回答該問題,請返回“信息不足”。3.在提取相關句子時,請勿修改上下文中的任何句子。4.需要再次強調的是,請勿直接回答問題,只提取相關句子。上下文:{context}問題:{question}"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)answer = response.choices[0].message.contentprint("[DEBUG] answer: ", answer)

上下文召回率(Context Recall)

def context_recall_test():"""上下文召回率"""gt = "法國位于西歐,巴黎是其首都。我想吃火鍋。"# context = "法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。該國還以其葡萄酒和精致的美食而聞名。拉斯科的古代洞穴壁畫、里昂的羅馬劇院和廣闊的凡爾賽宮都證明了其豐富的歷史"context = "法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。其首都巴黎以其時裝屋、盧浮宮等古典藝術博物館和埃菲爾鐵塔等古跡而聞名。"# prompt = f"""# 請你根據給定的上下文和真實答案,分析答案中的每個子句,并判斷該子句是否可以由提供的上下文所驗證。具體要求如下:# 1. 只使用 1 或 0 進行二分類。如果該子句可以歸因于給定的上下文,請返回 1,否則請返回 0。# 2. 在判斷過程中,請勿修改真實答案的子句與上下文的內容。# 3. 請以JSON形式返回結果:{{"子句1": 1/0, "子句2": 1/0,...}}。# 4. 需要強調的是,你分析的是真實答案中的每個子句,返回結果里請勿有上下文相關的信息。# 上下文:{context}# 真實答案:{gt}# """# prompt = f"""# 請根據給定的上下文和真實答案,分析答案中的每個子句,并判斷其是否可以由上下文驗證。具體要求如下:# 1. 如果子句可以由上下文驗證,請返回 1,否則返回 0。# 2. 判斷過程中,請勿修改真實答案的子句和上下文的內容。# 3. 結果以 JSON 形式返回:{{"子句1": 1/0, "子句2": 1/0, ...}}。# 4. 僅分析真實答案中的子句,結果中不包含上下文的信息。# 上下文:{context}# 真實答案:{gt}# """prompt = f"""請你根據給定的真實答案,將其分解成1條或多條不重復的陳述。真實答案:{gt}請以JSON形式返回結果:{{"陳述1": 陳述1, "陳述2": 陳述2,...}}。"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)statements = response.choices[0].message.contentstatements = list(json.loads(statements).values())print("[DEBUG] statements: ", statements)prompt = f"""請你根據給定的上下文和一些陳述,分析每條陳述,判斷該陳述是否可以由上下文驗證。具體要求如下:1. 如果該陳述可以由上下文驗證,請返回 1,否則返回 0。2. 判斷過程中,請勿修改陳述和上下文的內容。3. 結果以 JSON 形式返回:{{"陳述1": 1/0, "陳述2": 1/0, ...}}。4. 僅分析每條陳述,結果中不包含上下文的信息。上下文:{context}陳述:{statements}"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)response = response.choices[0].message.contentprint("[DEBUG] response: ", response)

答案正確性(Answer Correctness)

def answer_correctness_test():"""答案正確性事實正確性 + 語義相似性"""# gt = "愛因斯坦1879年出生于德國。"# answer = "愛因斯坦1879年出生于西班牙。"# gt = "法國位于西歐,巴黎是其首都。"# # answer = "根據給定的資料,法國位于亞洲,巴黎是其首都。"# answer = "根據給定的資料,我不確定法國是否位于亞洲,還是位于西歐,但我確定巴黎是其首都。"gt = """這個文檔主要討論了在“互聯網+”背景下,永順縣塔臥鎮紅色旅游產品開發的現狀、存在的問題以及相應的對策。文檔分為三個部分:1. **紅色旅游產品開發現狀**:介紹了塔臥鎮紅色旅游產品的主要類型,包括游覽路線參觀、紅色講堂和紀念品。指出了核心產品開發建設不足、旅游體驗產品經濟效益低和產品價值定位不準確等問題。2. **存在的不足**:分析了塔臥鎮紅色旅游產品開發中的問題,如旅游景點整合程度低、產品開發程度小、基礎設施配套不完善、旅游產品缺乏體驗特點等。3. **開發對策**:提出了針對上述問題的對策,包括整合旅游景點、明確產品目標市場、打造塔臥式旅游產品、增強旅游體驗、注重互聯網與產品開發結合以及提升紅色旅游產品知名度等。文檔還強調了互聯網在紅色旅游產品開發中的重要作用,提出了利用互聯網技術進行市場調研、產品設計、宣傳推廣和提升游客體驗的建議。"""answer = "這個文檔的主要內容是關于永順縣塔臥鎮紅色旅游產品開發現狀和存在的問題的分析。"prompt = f"""給你一個真實答案和一個回答,請你分析回答中的每個陳述,并將其分類到以下類別之一:- TP(真正例):在回答和真實答案中都存在的陳述。- FP(假正例):在回答中存在但在真實答案中未找到的陳述。- FN(假負例):在真實答案中存在但在回答中遺漏的相關陳述。需要強調的是:1. 首先你需要根據給定的回答,將其分解成1條或多條不重復的陳述,請勿改動回答的內容。2. 然后分析每條陳述,將該陳述分類到上述所提到的三個類別當中。3. 每個陳述必須準確地分類到一個類別中,不要試圖解釋真實答案和回答的含義,只需要比較它們中陳述的存在情況。4. 在你的返回結果中,請勿改動回答以及真實答案的內容。真實答案:{gt}回答:{answer}結果請以JSON形式返回:{{"TP": [數量、陳述], "FP": [數量、陳述], "FN": [數量、陳述], "陳述": [所有的陳述]}}"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)response = response.choices[0].message.contentresponse = json.loads(response)print("[DEBUG] response: ", response)tp, fp, fn = response["TP"][0], response["FP"][0], response["FN"][0]print("[DEBUG] TP: {}, FP: {}, FN: {}".format(tp, fp, fn))ac_1 = tp / (tp + 0.5 * (fp + fn))print("[DEBUG] ac_1: ", ac_1)g_emb = get_text_embedding(client, gt)a_emb = get_text_embedding(client, answer)ac_2 = cosine_similarity(g_emb, a_emb)print("[DEBUG] ac_2: ", ac_2)ac_weight = [0.5, 0.5]ac = np.average([ac_1, ac_2], weights=ac_weight)print("[DEBUG] ac: ", ac)print("----------", np.linalg.norm(g_emb - a_emb))

答案完整性(Answer Integrity)

def content_integrity_test():"""內容完整性"""gt = """這個文檔主要討論了在“互聯網+”背景下,永順縣塔臥鎮紅色旅游產品開發的現狀、存在的問題以及相應的對策。文檔分為三個部分:1. **紅色旅游產品開發現狀**:介紹了塔臥鎮紅色旅游產品的主要類型,包括游覽路線參觀、紅色講堂和紀念品。指出了核心產品開發建設不足、旅游體驗產品經濟效益低和產品價值定位不準確等問題。2. **存在的不足**:分析了塔臥鎮紅色旅游產品開發中的問題,如旅游景點整合程度低、產品開發程度小、基礎設施配套不完善、旅游產品缺乏體驗特點等。3. **開發對策**:提出了針對上述問題的對策,包括整合旅游景點、明確產品目標市場、打造塔臥式旅游產品、增強旅游體驗、注重互聯網與產品開發結合以及提升紅色旅游產品知名度等。文檔還強調了互聯網在紅色旅游產品開發中的重要作用,提出了利用互聯網技術進行市場調研、產品設計、宣傳推廣和提升游客體驗的建議。"""answer = "這個文檔的主要內容是關于永順縣塔臥鎮紅色旅游產品開發現狀和存在的問題的分析。"# prompt = f"""# 請你分析并提取以下段落所涵蓋的關鍵點。具體要求如下:# - 你提取的關鍵點要包含段落的主要內容。# - 請勿提取重復的關鍵點。# 段落:{gt}# 結果請以JSON形式返回:{{"關鍵點1": 關鍵點1, "關鍵點2": 關鍵點2, ...}}# """prompt = f"""請分析以下段落,并提取出涵蓋其主要內容的所有關鍵詞。具體要求如下:1. 關鍵詞應全面覆蓋段落的主要信息。2. 關鍵詞應不重復,并盡可能簡潔明確。3. 請勿包含標點符號或多余的修飾詞。段落:{gt}結果請以Python列表的形式返回,列表中的每個元素為你提取的關鍵詞,關鍵詞為字符串類型,格式為:[關鍵詞1, 關鍵詞2, ...]"""response = client.chat.completions.create(model=OPENAI_MODEL,messages=[{"role": "user", "content": prompt}],)response = response.choices[0].message.contentkeypoints = ast.literal_eval(response)print("[DEBUG] 關鍵詞: ", keypoints)print("[DEBUG] 關鍵詞數量: ", len(keypoints))matched_keypoints = [k for k in keypoints if k in answer]print("[DEBUG] 匹配的關鍵詞: ", matched_keypoints)coverage = len(matched_keypoints) / len(keypoints)print("[DEBUG] 關鍵詞覆蓋率: ", coverage)# 計算信息密度answer_sentences = cut_sent(answer)gt_sentences = cut_sent(gt)print("[DEBUG] answer_sentences: ", answer_sentences, len(answer_sentences))print("[DEBUG] gt_sentences: ", gt_sentences, len(gt_sentences))punctuation_list = " 。?!,、;:“”‘’『』()[]〔〕〈〉《》「」【】……——-—―·.?!,;:'\"()[]{}<>@#$%^&*_+-=~`|\\/"# baidu_stopword = load_stopwords("./stopwords/baidu_stopwords.txt")with PynlpirContextManager():answer_words = [s for s in pynlpir.segment(answer.strip().replace("\n", "。"), pos_tagging=False) if s not in punctuation_list]gt_words = [s for s in pynlpir.segment(gt.strip().replace("\n", "。"), pos_tagging=False) if s not in punctuation_list]print("[DEBUG] answer_words: ", answer_words, len(answer_words))print("[DEBUG] gt_words: ", gt_words, len(gt_words))info_density = len(set(answer_words) & set(gt_words)) / len(set(answer_words) | set(gt_words))info_density2 = (len(answer_sentences) / len(gt_sentences) + len(answer_words) / len(gt_words)) / 2info_density3 = (len(answer_sentences) / len(gt_sentences) + len(answer_words) / len(gt_words) + info_density) / 3print("[DEBUG] 信息密度: ", info_density, info_density2, info_density3)

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

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

相關文章

C# 機構仿真實例

1、實現連桿帶動滑塊運動 一個連桿旋轉帶動另一個連桿&#xff0c;另一個連桿拖動滑塊&#xff0c;點擊“開始”按鈕開始運動&#xff0c;再點擊按鈕&#xff0c;則停止運動。 2、實現程序 #region 機構仿真Image image null;Timer timer new Timer();int width 0;int heig…

一千題,No.0027(Phone Desktop)

描述 Little Rosie has a phone with a desktop (or launcher, as it is also called). The desktop can consist of several screens. Each screen is represented as a grid of size 53, i.e., five rows and three columns. There are x applications with an icon size o…

【網絡安全】社會工程學攻擊與防范

一、社會工程學概述 1、社會工程學的定義 通過利用人們的心理弱點、本能反應、好奇心、信任、貪婪等一些心理陷阱進行的諸如欺騙、傷害、信息盜取、利益謀取等對社會及人類帶來危害的行為或方法。 當網絡惡意攻擊者無法通過純粹的計算機技術達到目的時&#xff0c;高超的情商…

9.Redis之list類型

list相當于鏈表、數據表 1.list類型基本介紹 列表中的元素是有序的"有序"的含義,要根據上下文區分~~有的時候,談到有序,指的是"升序","降序”有的時候,談到的有序,指的是, 順序很關鍵~~如果把元素位置顛倒,順序調換.此時得到的新的 List 和之前的 Li…

js簡單綜合案例之簡易ATM取款機、渲染表格案例、封裝時間函數

這里寫目錄標題 簡易ATM取款機要求代碼實現 渲染表格案例要求代碼實現 封裝時間函數要求代碼實現 簡易ATM取款機 要求 1.彈出彈窗&#xff0c;讓用戶輸入數字選擇操作 2.初始值金額為100&#xff0c;計算每次操作后的剩余金額變化 3.一直彈出彈窗直到用戶輸入4&#xff0c;跳…

OpenCV SIFT特征描述子(GPU版本)

文章目錄 一、簡介二、測試過程三、實現效果參考資料一、簡介 這里主要測試一下SIFT圖像描述子的GPU版本。SIFT圖像描述子,全稱Scale-Invariant Feature Transform(尺度不變特征變換),是計算機視覺和圖像處理領域中一種非常重要的局部特征描述子。它主要用于圖像的特征點檢…

新聞稿海外媒體投稿,除了美聯社發稿(AP)和彭博社宣發(Bloomberg),還有哪些優質的國外媒體平臺可以選擇

發布高質量的新聞稿到海外媒體&#xff0c;除了美聯社發稿&#xff08;AP&#xff09;和彭博社發稿&#xff08;Bloomberg&#xff09;&#xff0c;還有許多其他優質的媒體平臺可以選擇。以下是一些受歡迎和高效的海外媒體發布平臺&#xff1a; 路透社 (Reuters) 路透社是全球最…

Webpack Bundle Analyzer:深入分析與優化你的包

Webpack Bundle Analyzer是一個用于可視化的工具&#xff0c;它可以幫助你分析Webpack打包后的輸出文件&#xff0c;查看哪些模塊占用了最多的空間&#xff0c;從而進行優化。 2500G計算機入門到高級架構師開發資料超級大禮包免費送&#xff01; 首先&#xff0c;你需要安裝W…

IIC通信(STM32)

一、IIC概念 &#xff11;、兩根通信線&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09; 同步&#xff0c;半雙工 2、帶數據應答 3、支持總線掛載多設備&#xff08;一主多從、多主多從&#xff09;一般使用一主多從。一主多從的…

【深度學習】paddlets,時序數據預測

文章目錄 一、環境二、題目1三、題目2四、題目3五、函數參數 資料&#xff1a; https://paddlets.readthedocs.io/zh-cn/latest/source/api/paddlets.models.base.html#paddlets.models.base.BaseModel.recursive_predict https://aistudio.baidu.com/projectdetail/5866171?…

陪跑真正值錢的不是教程,是你遇到那個擋住你的問題時,身邊有個靠譜的人

今天分享兩個概念&#xff0c;一個是意識決定一切&#xff0c;一個是大道至簡&#xff0c;做項目就是按部就班的遵循事情發展規律去做。 先說第一個概念&#xff0c;意識決定一切。我們說的凡事預則立不預則廢&#xff0c;就是計劃了去做就會有結果。 給你們一個表&#xff0c;…

Linux簡單通過Minicom命令操作串口設備(linux串口操作命令)

Minicom是一個在Linux系統中廣泛使用的串行通信程序。它類似于Windows下的超級終端,允許用戶通過串口與外部硬件設備進行通信。Minicom不僅功能強大,而且完全免費,帶有源代碼,可以在大多數Unix系統下運行。 安裝Minicom 在大多數Linux發行版中,Minicom可能沒有預裝。可以…

【前端】面試八股文——BFC

面試八股文——BFC 在前端開發的面試中&#xff0c;BFC&#xff08;Block Formatting Context&#xff0c;塊級格式化上下文&#xff09;常常是一個高頻出現的考點。它不僅考察應聘者對CSS布局的理解深度&#xff0c;也是面試官判斷候選人解決實際問題能力的重要依據之一。因此…

python接口自動化測試中為什么用yaml文件進行用例管理而不是json文件

在Python接口自動化測試中&#xff0c;使用YAML文件進行用例管理而不是JSON文件&#xff0c;主要基于以下幾個原因&#xff1a; 可讀性&#xff1a;YAML文件使用縮進和冒號來表示層級結構&#xff0c;使得文件內容更加清晰易讀。相比之下&#xff0c;JSON文件則使用大括號和中…

MySQL——索引與事務

目錄 前言 一、索引 1.索引概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;索引作用 &#xff08;3&#xff09;索引特點 &#xff08;4&#xff09;適用場景 2.索引的操作 &#xff08;1&#xff09;查看索引 &#xff08;2&#xff09;創建索引…

LeetCode399觸發求值

題目描述 給你一個變量對數組 equations 和一個實數值數組 values 作為已知條件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每個 Ai 或 Bi 是一個表示單個變量的字符串。另有一些以數組 queries 表示的問題&#xff0c;其中 que…

文科論文,使用AI寫作時能夠提供實證數據嗎?

人工智能時代&#xff0c;為了撰寫論文提供思路及高效&#xff0c;利用AI撰寫論文已是常態&#xff0c;可撰寫文科論文通常研究中都需要實證數據&#xff0c;而AI撰寫論文時能夠提供這樣的數據嗎&#xff1f; 一、什么是實證數據 實證數據是指從研究報告、財務報表、新聞報道…

計算機網絡——TCP 協議的三次握手 / 四次揮手

簡述 TCP / UDP 協議都是傳輸層的協議。 UDP 是面向無連接的協議&#xff0c;就是說發送端不在乎消息數據是否傳輸到接收端了&#xff0c;所以會出現數據丟失的情況&#xff0c;所以可靠性也不高。 TCP 是面向連接的、可靠的、基于字節流的傳輸層協議。所謂面向連接的&#…

Flink-cdc更好的流式數據集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一種數據變更捕獲技術&#xff0c;用于從數據源&#xff08;如數據庫&#xff09;中捕獲和處理數據的變更事件。CDC技術允許實時地捕獲數據庫中的增、刪、改操作&#xff0c;將這些變更事件轉化為流式數據&#xff0c;并能夠…

Windows平臺C#版RTSP轉RTMP直播推送定制版

技術背景 前幾年我們發布了C版的多路RTMP/RTSP轉RTMP轉發官方定制版。在秉承低延遲、靈活穩定、低資源占用的前提下&#xff0c;客戶無需關注開發細節&#xff0c;只需圖形化配置轉發等各類參數&#xff0c;實現產品快速上線目的。 如監控類攝像機、NVR等&#xff0c;通過廠商…