Python----大模型(RAG 的智能評估-LangSmith)

一、LangSmith

????????LangSmith是LangChain的一個子產品,是一個大模型應用開發平臺。它提供了從原 型到生產的全流程工具和服務,幫助開發者構建、測試、評估和監控基于LangChain 或其他 LLM 框架的應用程序。

安裝 LangSmith

????????pip install langsmith==0.1.137

官網:LangSmith

api_key創建

導入測試數據

新建一個測試集

import pandas as pd
df=pd.read_csv('黑悟空.csv')
example=list(df.itertuples(index=False,name=None))from langsmith import Client
client=Client(api_key="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")
dataset_name="example_code"dataset=client.create_dataset(dataset_name=dataset_name)
for q,a in example:client.create_example(inputs={"問題": q}, outputs={"答案": a}, dataset_id=dataset.id)

api_key要替換為自己的

二、使用LangSmith進行評估

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os
from langsmith import evaluate, Client
from langsmith.schemas import Example, Run

1. 初始化模型

# ChatOpenAI 是一個封裝了 OpenAI API 的類
chat_model = ChatOpenAI(# api_key 設置為 'EMPTY',因為本地服務通常不要求密鑰api_key='EMPTY',# base_url 指向本地運行的兼容 OpenAI API 的服務,如 Qwen 或 ollamabase_url='http://127.0.0.1:10222/v1',# model 指定要使用的模型名稱model='Qwen2.5-7B-Instruct'
)

2.定義聊天提示詞模板

# ChatPromptTemplate 用于構建結構化的聊天輸入
system_message = "你是一個機器人"
prompt = ChatPromptTemplate.from_messages([# ("system", ...) 定義了系統角色指令("system", system_message),# ("user", ...) 定義了用戶的輸入模板,{問題} 是一個占位符("user", "{問題}")
])

3. 定義輸出解析器

# StrOutputParser 將模型的輸出從對象格式解析為純字符串
output_parser = StrOutputParser()

4. 使用 LCEL (LangChain 表達式語言) 將各個組件串聯成一個鏈

# 管道符 "|" 將數據流依次從 prompt -> chat_model -> output_parser
chain = prompt | chat_model | output_parser

5. 設置 LangSmith 相關的環境變量

# 這些變量用于將本地的運行軌跡上傳到 LangSmith 平臺
os.environ["LANGCHAIN_TRACING_V2"] = "true"  # 開啟追蹤功能
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com" # LangSmith API 地址
# 注意:此處的 API 密鑰是公共示例,生產環境請勿泄露
os.environ["LANGCHAIN_API_KEY"] = "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" 

6.創建并/或選擇數據集

# Client 用于與 LangSmith 平臺交互
client = Client()
dataset_name = "example_code"
# 從 LangSmith 公共庫克隆一個數據集,作為評估的“黃金標準”
dataset = client.clone_public_dataset("https://smith.langchain.com/public/a63525f9-bdf2-4512-83e3-077dc9417f96/d", dataset_name=dataset_name)

7.定義一個自定義評估器

# 評估器是一個函數,用于根據LLM的輸出和數據集的黃金標準來打分
def is_concise_enough(root_run: Run, example: Example) -> dict:# 評估邏輯:檢查模型的輸出長度是否小于黃金標準答案長度的3倍score = len(root_run.outputs["output"]) < 3 * len(example.outputs["答案"])# 返回一個字典,其中 key 是評估指標名稱,score 是分數return {"key": "is_concise", "score": int(score)}

8.運行評估

# evaluate() 函數用于執行自動化評估
evaluate(# 第一個參數是“待評估的函數”,即我們的 LLM 鏈# lambda x: chain.invoke(x["問題"]) 將數據集中的“問題”字段傳遞給鏈lambda x: chain.invoke(x["問題"]),data=dataset_name,               # 指定要使用的數據集evaluators=[is_concise_enough],  # 傳入自定義評估器列表experiment_prefix="my first dataset experiment " # 為本次評估添加一個前綴
)

完整代碼

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os
from langsmith import evaluate, Client
from langsmith.schemas import Example, Run# 1. 實例化 LLM 模型,并配置其連接到本地服務
# ChatOpenAI 是一個封裝了 OpenAI API 的類
chat_model = ChatOpenAI(# api_key 設置為 'EMPTY',因為本地服務通常不要求密鑰api_key='EMPTY',# base_url 指向本地運行的兼容 OpenAI API 的服務,如 Qwen 或 ollamabase_url='http://127.0.0.1:10222/v1',# model 指定要使用的模型名稱model='Qwen2.5-7B-Instruct'
)# 2. 定義聊天提示詞模板
# ChatPromptTemplate 用于構建結構化的聊天輸入
system_message = "你是一個機器人"
prompt = ChatPromptTemplate.from_messages([# ("system", ...) 定義了系統角色指令("system", system_message),# ("user", ...) 定義了用戶的輸入模板,{問題} 是一個占位符("user", "{問題}")
])# 3. 定義輸出解析器
# StrOutputParser 將模型的輸出從對象格式解析為純字符串
output_parser = StrOutputParser()# 4. 使用 LCEL (LangChain 表達式語言) 將各個組件串聯成一個鏈
# 管道符 "|" 將數據流依次從 prompt -> chat_model -> output_parser
chain = prompt | chat_model | output_parser# 5. 設置 LangSmith 相關的環境變量
# 這些變量用于將本地的運行軌跡上傳到 LangSmith 平臺
os.environ["LANGCHAIN_TRACING_V2"] = "true"  # 開啟追蹤功能
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com" # LangSmith API 地址
# 注意:此處的 API 密鑰是公共示例,生產環境請勿泄露
os.environ["LANGCHAIN_API_KEY"] = "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" # 6. 創建并/或選擇數據集
# Client 用于與 LangSmith 平臺交互
client = Client()
dataset_name = "example_code"
# 從 LangSmith 公共庫克隆一個數據集,作為評估的“黃金標準”
dataset = client.clone_public_dataset("https://smith.langchain.com/public/a63525f9-bdf2-4512-83e3-077dc9417f96/d", dataset_name=dataset_name)# 7. 定義一個自定義評估器
# 評估器是一個函數,用于根據LLM的輸出和數據集的黃金標準來打分
def is_concise_enough(root_run: Run, example: Example) -> dict:# 評估邏輯:檢查模型的輸出長度是否小于黃金標準答案長度的3倍score = len(root_run.outputs["output"]) < 3 * len(example.outputs["答案"])# 返回一個字典,其中 key 是評估指標名稱,score 是分數return {"key": "is_concise", "score": int(score)}# 8. 運行評估
# evaluate() 函數用于執行自動化評估
evaluate(# 第一個參數是“待評估的函數”,即我們的 LLM 鏈# lambda x: chain.invoke(x["問題"]) 將數據集中的“問題”字段傳遞給鏈lambda x: chain.invoke(x["問題"]),data=dataset_name,               # 指定要使用的數據集evaluators=[is_concise_enough],  # 傳入自定義評估器列表experiment_prefix="my first dataset experiment " # 為本次評估添加一個前綴
)

三、使用 LangSmith平臺自動化評估

準備工作

from langchain_community.vectorstores import FAISS  # 導入FAISS向量存儲庫
from langchain_huggingface import HuggingFaceEmbeddings  # 導入Hugging Face嵌入模型
from langchain_community.document_loaders import TextLoader  # 導入文本加載器
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 導入遞歸字符文本分割器
from langchain_openai import ChatOpenAI  # 導入ChatOpenAI模型# 使用 OpenAI API 的 ChatOpenAI 模型,但配置為連接本地服務
# 這是評估的核心:需要被測試的 LLM 模型
chat_model = ChatOpenAI(api_key='EMPTY',  # 本地服務通常不需要密鑰base_url='http://127.0.0.1:10222/v1', # 指定本地模型的 API 地址model='Qwen2.5-7B-Instruct'
)

數據加載與處理模塊

# 加載文本文件 "黑悟空.txt",編碼格式為 'utf-8'
loader = TextLoader("黑悟空.txt", encoding='utf-8')
docs = loader.load()  # 將文件內容加載到變量 docs 中# 把文本分割成 200 字一組的切片,每組之間有 20 字重疊
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
chunks = text_splitter.split_documents(docs)  # 將文檔分割成多個小塊# 初始化嵌入模型,使用預訓練的語言模型 'bge-large-zh-v1___5'
# 這個模型用于將文本塊轉換為向量
embedding = HuggingFaceEmbeddings(model_name='models/AI-ModelScope/bge-large-zh-v1___5')# 構建 FAISS 向量存儲和對應的 retriever
vs = FAISS.from_documents(chunks, embedding)  # 將文本塊轉換為向量并存儲在FAISS中# 創建一個檢索器,用于根據問題從向量存儲中查找最相關的文檔
retriever = vs.as_retriever()

RAG 鏈構建模塊

from langchain.prompts import (ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate,
)# 創建一個系統消息,用于定義機器人的角色和輸入格式
# {context} 是一個占位符,用于填充檢索到的相關信息
system_message = SystemMessagePromptTemplate.from_template("根據以下已知信息回答用戶問題。\n 已知信息{context}"
)# 創建一個人類消息,用于接收用戶的輸入
# {question} 是一個占位符,用于填充用戶的原始問題
human_message = HumanMessagePromptTemplate.from_template("用戶問題:{question}"
)# 將這些模板結合成一個完整的聊天提示
chat_prompt = ChatPromptTemplate.from_messages([system_message,human_message,
])"""使用LCEL實現"""
# 格式化文檔,將多個文檔連接成一個大字符串
def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)# 創建字符串輸出解析器,用于解析LLM的輸出
from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()from langchain_core.runnables import RunnablePassthrough
# 創建 rag_chain,這是整個 RAG 流程的核心管道
rag_chain = (# 這部分使用字典語法,并行執行兩個任務:# 1. 'context': 使用 retriever 檢索文檔并用 format_docs 格式化# 2. 'question': 使用 RunnablePassthrough 將原始問題原樣傳遞{"context": retriever | format_docs, "question": RunnablePassthrough()}| chat_prompt   # 將格式化后的上下文和問題傳遞給提示模板| chat_model    # 將提示詞傳遞給 LLM 模型| output_parser # 將 LLM 的輸出解析為字符串
)
# print(rag_chain.invoke("黑熊精自稱為?")) # 這是一個用于手動測試的示例

LangSmith 評估配置模塊

import os# 設置 LangSmith 相關的環境變量,用于連接平臺并上傳運行軌跡
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "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"

評估器定義與選擇模塊

from langsmith import evaluate, Client
from langsmith.schemas import Example, Run# 1. 創建并/或選擇你的數據集
client = Client()
dataset_name = "example_code"
# 克隆一個 LangSmith 公共數據集,作為評估的黃金標準
dataset = client.clone_public_dataset("https://smith.langchain.com/public/a63525f9-bdf2-4512-83e3-077dc9417f96/d", dataset_name=dataset_name)

1、方式1:原始的代碼:評估簡潔度。這是一個基于長度的簡單評估器。

def is_concise_enough(root_run: Run, example: Example) -> dict:# 比較 LLM 輸出的長度是否小于標準答案長度的3倍score = len(root_run.outputs["output"]) < 3 * len(example.outputs["答案"])return {"key": "is_concise", "score": int(score)}

2、更大的模型將原始答案與生成答案進行準確度評估。這是一個基于LLM的定性評估。

from langsmith.evaluation import LangChainStringEvaluator
eval_model = ChatOpenAI(model="/home/AI_big_model/models/Qwen/Qwen2.5-7B-Instruct",api_key="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",base_url="https://api.siliconflow.cn/v1",
)

3、通過余弦相似度進行評估。這是一個基于向量相似度的定量評估

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# 加載與用于生成向量數據庫的embedding模型相同的模型
model = SentenceTransformer("/home/AI_big_model/models/AI-ModelScope/bge-large-zh-v1___5")
def cal_cosine_similarity(root_run: Run, example: Example) -> dict:model_output = root_run.outputs["output"]reference_answer = example.outputs["答案"]# 將模型輸出和標準答案編碼成向量embeddings = model.encode([model_output, reference_answer])# 計算兩個向量之間的余弦相似度similarity = cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]# 定義一個分數:當相似度大于等于0.75時,得分為1,否則為0score = similarity >= 0.75return {"key": "cosine_similarity", "score": int(score)}

運行自動化評估

# 最終的評估執行函數
evaluate(# 傳入要評估的鏈,lambda 函數用于從數據集行中提取問題lambda x: rag_chain.invoke(x["問題"]),# chain.invoke# graph.invokedata=dataset_name,  # 指定用于評估的數據集evaluators=[cal_cosine_similarity],  # 傳入要使用的評估器(這里是方式3)experiment_prefix="my first dataset experiment " # 為實驗添加一個唯一前綴
)

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

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

相關文章

磁懸浮軸承轉子不平衡質量控制策略設計:原理、分析與智能實現

磁懸浮軸承(Active Magnetic Bearing, AMB)以其無接觸、無摩擦、高轉速、無需潤滑等革命性優勢,在高端旋轉機械領域(如高速電機、離心壓縮機、飛輪儲能、航空航天動力系統)展現出巨大潛力。然而,轉子固有的質量不平衡是AMB系統面臨的核心挑戰之一,它誘發強同步振動,威脅…

C++查詢mysql數據

文章目錄 文章目錄 1.前言 2. 代碼 &#xff08;1&#xff09;執行查詢SQL &#xff08;2&#xff09;獲取結果集 &#xff08;3&#xff09;遍歷結果集&#xff08;獲取字段數、行數&#xff09; &#xff08;4&#xff09;釋放資源 3.完整代碼 1.前言 我們成功連接數…

【論文閱讀】-《GenAttack: Practical Black-box Attacks with Gradient-Free Optimization》

GenAttack&#xff1a;利用無梯度優化的實用黑盒攻擊 Moustafa Alzantot UCLA Los Angeles, U.S.A malzantotucla.edu Yash Sharma Cooper Union New York, U.S.A sharma2cooper.edu Supriyo Chakraborty IBM Research New York, U.S.A supriyous.ibm.com Huan Zhang UCLA Los…

CT、IT、ICT 和 DICT區別

這四個術語&#xff1a;CT、IT、ICT 和 DICT&#xff0c;是信息通信行業中常見的核心概念&#xff0c;它們既有演進關系&#xff0c;又有各自的技術重點。&#x1f539; 一、CT&#xff08;Communication Technology&#xff09;通信技術**定義&#xff1a;**以語音通信為核心的…

Effective C++ 條款4:確定對象被使用前已先被初始化

Effective C 條款4&#xff1a;確定對象被使用前已先被初始化核心思想&#xff1a;永遠在使用對象前將其初始化。未初始化對象是未定義行為的常見來源&#xff0c;尤其對于內置類型。 1. 內置類型手動初始化 int x 0; // 手動初始化 const char* text &quo…

LangSmith的配置介紹

文章目錄注冊及登錄生成API KeyLangSmith的配置方式一&#xff1a;放運行環境里方式二&#xff1a;寫代碼里執行代碼查看LangSmith上是否看到本次運行的項目記錄LangSmith的其他注意注冊及登錄 首先使用郵箱注冊一個賬號及設置密碼&#xff0c;等收到收到郵件后&#xff0c;進…

Linux的生態與軟件安裝

堅持用 清晰易懂的圖解 代碼語言&#xff0c;讓每個知識點變得簡單&#xff01; &#x1f680;呆頭個人主頁詳情 &#x1f331; 呆頭個人Gitee代碼倉庫 &#x1f4cc; 呆頭詳細專欄系列 座右銘&#xff1a; “不患無位&#xff0c;患所以立。” Linux的生態與軟件安裝前言目錄…

3.4 安全-分布式-數據庫-挖掘

一、數據庫的安全數據庫里面的安全措施&#xff1a;用戶標識和鑒定&#xff1a;用戶的賬戶口令等存取控制&#xff1a;對用戶操作進行控權&#xff0c;有對應權限碼才能操作。密碼存儲和傳輸&#xff1a;加密存儲。視圖的保護&#xff1a;視圖需要授權審計&#xff1a;專門的文…

多線程 Reactor 模式

目錄 多線程 Reactor 模式的核心動機 多線程演進方向 多線程 Reactor 模型結構 多線程 EchoServer 實現核心部分 Handler 的多線程化 多線程 Reactor 的三個核心點 本篇文章內容的前置知識為 單線程 Reactor 模式&#xff0c;如果不了解&#xff0c;可點擊鏈接學習 單線程…

[NLP]多電源域設計的仿真驗證方法

多電源域設計的仿真驗證方法 1. 更復雜的 Testbench 例子(多電源域、復雜低功耗場景) 假設有兩個電源域 PD1 和 PD2,分別對應控制信號 pwr_sw_ctrl1、iso_ctrl1、ret_ctrl1 和 pwr_sw_ctrl2、iso_ctrl2、ret_ctrl2,且兩域之間有通信。 RTL 端口聲明(簡化版) module top…

Apache Ignite 中 WHERE 子句中的子查詢(Subqueries in WHERE Clause)的執行方式

這段內容是關于 Apache Ignite 中 WHERE 子句中的子查詢&#xff08;Subqueries in WHERE Clause&#xff09;的執行方式 的說明。理解這段內容對于編寫高效的 SQL 查詢、避免性能瓶頸非常重要。下面我將為你 逐句解釋并深入理解這段內容。&#x1f9fe; 原文翻譯 解釋 原文&a…

MySQL(153)如何使用全文索引?

MySQL的全文索引&#xff08;Full-Text Index&#xff09;是一種特殊的索引類型&#xff0c;專門用于加速文本數據的搜索。與普通的B樹索引不同&#xff0c;全文索引適用于大文本字段&#xff08;如TEXT、VARCHAR等&#xff09;的全文搜索。它通過構建一個倒排索引&#xff0c;…

微分方程入門之入門之入門,純筆記

當描述 相對變化量 比 絕對量 更容易時&#xff0c;微分方程就經常用到了。 比如&#xff0c;描述為什么種群數量增加or減少【相對】&#xff0c;比描述為什么它在某個時間點是某個特定值【絕對】更容易。 物理學中&#xff0c;運動經常用力來描述&#xff0c;力–>代表變化…

【C++】簡單學——vector類(模擬實現)

模擬實現的準備工作 看源碼&#xff0c;了解這個類的大概組成 1.先看成員變量 成員變量的組成是三個迭代器 問&#xff1a;這個iterator內嵌類型究竟是什么&#xff1f;即這個迭代器是什么 迭代器實際就是T* 問&#xff1a;這三個迭代器代表什么意思&#xff1f; 連蒙帶猜…

【WRF】根據自動安裝腳本安裝 WRF / WRF-CHEM等

目錄 GitHub 上 WRF 自動安裝腳本 ?? 腳本的作用 ??? 支持的系統 ?? 可安裝的 WRF 版本及其選項 ? 如何使用(以 WRF 4.6.1 為例) ? 依賴庫的安裝位置 完整安裝腳本分析 參考 GitHub 上 WRF 自動安裝腳本 GitHub 上的 WRF-Install-Script 項目的 Releases(發布版本…

M2IV:面向大型視覺-語言模型中高效且細粒度的多模態上下文學習

MIV&#xff1a; Towards Efficient and Fine-grained Multimodal In Context Learning in Large Vision-Language Models COLM 2025 why 新興的研究方向&#xff1a;上下文學習&#xff08;ICL&#xff09;的效果“向量化”&#xff0c;其核心思想是用transformer內部的向量來…

龍迅#LT8711UXD適用于Type-C/DP1.4 /EDP轉 HDMI2.0 功能,分辨率高達4K60HZ,可支持HDCP!

1. 描述LT8711UXD 是一款高性能雙通道 Type-C/DP1.4 轉 HDMI2.0 轉換器&#xff0c;旨在將 USB Type-C 源或 DP1.4 源連接到 HDMI2.0 接收器。該LT8711UXD集成了一個符合 DP1.4 標準的接收器和一個符合 HDMI2.0 標準的發射器。此外&#xff0c;還嵌入了兩個用于CC通信的CC控制器…

《計算機組成原理與匯編語言程序設計》實驗報告一 基本數字邏輯及漢字顯示

目 錄 一、實驗學時 二、實驗目的 三、實驗要求 四、實驗內容 五、實驗步驟 1、打開Logisim軟件&#xff0c;列出異或邏輯電路真值表&#xff0c;并使用與、或、非基本原件實現異或邏輯電路。 2、打開Logisim軟件&#xff0c;列出同或邏輯電路真值表&#xff0c;并使用…

聚焦牛牛道:綠色積分模式如何實現快速發展?

?綠色消費積分政策再次進入大眾視野&#xff0c;這種能為企業減輕庫存負擔、讓咨金周轉更靈活的促銷方式&#xff0c;很快就成了焦點。牛牛道作為積極踐行這一政策的平臺&#xff0c;憑借其獨樹一幟的商業模式和運營思路&#xff0c;在短時間內就取得了顯著發展。一、牛牛道平…

高頻 RFID 賦能工業教學設備教學應用

高頻 RFID 賦能工業教學設備教學應用應用背景傳統工業教學設備側重機械原理、電氣控制等基礎功能演示&#xff0c;缺乏對 RFID 等工業識別技術的具象教學載體。學生在理論學習中難以直觀理解 RFID 技術的工業適配邏輯&#xff0c;實訓中缺乏設備識別系統的部署、調試經驗&#…