一、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(发布版本…

M²IV:面向大型视觉-语言模型中高效且细粒度的多模态上下文学习

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;实训中缺乏设备识别系统的部署、调试经验&#…