构建LangChain应用程序的示例代码:61、如何使用 LangChain 和 LangSmith 优化链
本示例介绍如何使用 LangChain 和 LangSmith 优化链。
设置
我们将为 LangSmith 设置环境变量,并加载相关数据
import osos.environ["LANGCHAIN_PROJECT"] = "movie-qa"
# 设置 LANGCHAIN_PROJECT 环境变量为 "movie-qa"
import pandas as pd
# 导入 pandas 库
df = pd.read_csv("data/imdb_top_1000.csv")
# 从 CSV 文件中读取 IMDB 前 1000 部电影的数据
df["Released_Year"] = df["Released_Year"].astype(int, errors="ignore")
# 将 "Released_Year" 列转换为整数类型,忽略错误
创建初始检索链
我们将使用自查询检索器
from langchain.schema import Document
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()
# 导入必要的库并创建 OpenAIEmbeddings 对象
records = df.to_dict("records")
documents = [Document(page_content=d["Overview"], metadata=d) for d in records]
# 将数据框转换为字典列表,并创建 Document 对象列表
vectorstore = Chroma.from_documents(documents, embeddings)
# 使用文档和嵌入创建 Chroma 向量存储
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import ChatOpenAImetadata_field_info = [AttributeInfo(name="Released_Year",description="The year the movie was released",type="int",),AttributeInfo(name="Series_Title",description="The title of the movie",type="str",),AttributeInfo(name="Genre",description="The genre of the movie",type="string",),AttributeInfo(name="IMDB_Rating", description="A 1-10 rating for the movie", type="float"),
]
document_content_description = "Brief summary of a movie"
llm = ChatOpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)
# 创建元数据字段信息列表,设置文档内容描述,创建 ChatOpenAI 对象,
# 并使用这些信息创建 SelfQueryRetriever 对象
from langchain_core.runnables import RunnablePassthrough
# 导入 RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 导入 StrOutputParser 和 ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""Answer the user's question based on the below information:Information:{info}Question: {question}"""
)
generator = (prompt | ChatOpenAI() | StrOutputParser()).with_config(run_name="generator"
)
# 创建聊天提示模板和生成器
chain = (RunnablePassthrough.assign(info=(lambda x: x["question"]) | retriever) | generator
)
# 创建完整的链,包括检索和生成步骤
运行示例
通过链运行示例。这可以是手动的,也可以使用示例列表或生产流量
chain.invoke({"question": "what is a horror movie released in early 2000s"})
# 使用链调用一个示例问题
标注
现在,转到 LangSmith 并将这些示例标注为正确或不正确
创建数据集
我们现在可以从这些运行中创建数据集。
我们要做的是找到标记为正确的运行,然后从中获取子链。具体来说,是查询生成器子链和最终生成步骤
from langsmith import Clientclient = Client()
# 创建 LangSmith 客户端
runs = list(client.list_runs(project_name="movie-qa",execution_order=1,filter="and(eq(feedback_key, 'correctness'), eq(feedback_score, 1))",)
)len(runs)
# 获取标记为正确的运行列表并打印数量
gen_runs = []
query_runs = []
for r in runs:gen_runs.extend(list(client.list_runs(project_name="movie-qa",filter="eq(name, 'generator')",trace_id=r.trace_id,)))query_runs.extend(list(client.list_runs(project_name="movie-qa",filter="eq(name, 'query_constructor')",trace_id=r.trace_id,)))
# 从正确的运行中提取生成器运行和查询构造器运行
runs[0].inputs
# 打印第一个运行的输入
runs[0].outputs
# 打印第一个运行的输出
query_runs[0].inputs
# 打印第一个查询运行的输入
query_runs[0].outputs
# 打印第一个查询运行的输出
gen_runs[0].inputs
# 打印第一个生成运行的输入
gen_runs[0].outputs
# 打印第一个生成运行的输出
创建数据集
我们现在可以为查询生成和最终生成步骤创建数据集。
 我们这样做是因为:(1) 我们可以检查数据点,(2) 如果需要,我们可以编辑它们,(3) 我们可以随时间添加到它们
client.create_dataset("movie-query_constructor")inputs = [r.inputs for r in query_runs]
outputs = [r.outputs for r in query_runs]client.create_examples(inputs=inputs, outputs=outputs, dataset_name="movie-query_constructor"
)
# 创建查询构造器数据集
client.create_dataset("movie-generator")inputs = [r.inputs for r in gen_runs]
outputs = [r.outputs for r in gen_runs]client.create_examples(inputs=inputs, outputs=outputs, dataset_name="movie-generator")
# 创建生成器数据集
使用少量示例
我们现在可以下载数据集并在未来的链中使用它们作为少量示例
examples = list(client.list_examples(dataset_name="movie-query_constructor"))
# 获取查询构造器数据集的示例列表
import jsondef filter_to_string(_filter):if "operator" in _filter:args = [filter_to_string(f) for f in _filter["arguments"]]return f"{_filter['operator']}({','.join(args)})"else:comparator = _filter["comparator"]attribute = json.dumps(_filter["attribute"])value = json.dumps(_filter["value"])return f"{comparator}({attribute}, {value})"
# 定义一个函数将过滤器转换为字符串
model_examples = []for e in examples:if "filter" in e.outputs["output"]:string_filter = filter_to_string(e.outputs["output"]["filter"])else:string_filter = "NO_FILTER"model_examples.append((e.inputs["query"],{"query": e.outputs["output"]["query"], "filter": string_filter},))
# 创建模型示例列表
retriever1 = SelfQueryRetriever.from_llm(llm,vectorstore,document_content_description,metadata_field_info,verbose=True,chain_kwargs={"examples": model_examples},
)
# 使用模型示例创建新的检索器
chain1 = (RunnablePassthrough.assign(info=(lambda x: x["question"]) | retriever1) | generator
)
# 创建新的链
chain1.invoke({"question": "what are good action movies made before 2000 but after 1997?"}
)
# 使用新链调用一个示例问题
总结
本文档介绍了如何使用 LangChain 和 LangSmith 来优化问答链。主要步骤包括:
- 设置环境和加载数据
- 创建初始检索链
- 运行示例并进行标注
- 创建数据集
- 使用少量示例进行优化
扩展知识
-  LangChain:是一个用于开发由语言模型驱动的应用程序的框架。它提供了一套工具和抽象,使得构建复杂的 AI 应用变得更加简单。 
-  LangSmith:是一个开发平台,用于构建、测试和监控基于 LLM 的应用程序。它提供了可视化和分析工具,帮助开发者优化他们的 LLM 应用。 
-  自查询检索器(SelfQueryRetriever):这是一种高级检索器,能够理解自然语言查询并将其转换为结构化查询,以便从向量存储中检索相关文档。 
-  少样本学习(Few-shot learning):这是一种机器学习技术,模型可以从很少的训练样本中学习执行新任务。在本文中,我们使用少量示例来改进查询构造和生成过程。 
-  向量存储:这是一种特殊类型的数据库,专门用于存储和检索向量嵌入。在本文中,我们使用 Chroma 作为向量存储。 
这些技术和工具共同工作,可以创建更智能、更高效的问答系统,特别是在处理特定领域(如电影信息)的查询时。
相关文章:
构建LangChain应用程序的示例代码:61、如何使用 LangChain 和 LangSmith 优化链
本示例介绍如何使用 LangChain 和 LangSmith 优化链。 设置 我们将为 LangSmith 设置环境变量,并加载相关数据 import osos.environ["LANGCHAIN_PROJECT"] "movie-qa" # 设置 LANGCHAIN_PROJECT 环境变量为 "movie-qa"import pan…...
Android系统通过属性设置来控制log输出的方案
Android系统通过属性设置来控制log输出的方案 背景 项目中经常需要在针对性的模块或者文件,分析问题的时候输出Log,但问题分析完成后,又由于性能问题,需要关闭这些log输出。当前大多数情况下是控制整个系统的log等级来实现&#…...
JavaDoc的最佳实践
文章目录 一、JavaDoc 使用说明1.1 什么是 JavaDoc1.2 文档注释结构1.3 常见的 Javadoc 标签 二、文档最佳实践2.1 注释原则2.2 实际案例 参考资料 一、JavaDoc 使用说明 1.1 什么是 JavaDoc JavaDoc 是一款能根据源代码中的文档注释来产生 HTML 格式的 API 文档的工具。 Jav…...
 
数字力量助西部职教全面提升——唯众品牌大数据、人工智能系列产品中标甘肃庆阳职院数字经济人才培养基地!
近日,唯众品牌凭借在大数据和人工智能领域深耕多年的技术积累和卓越产品,成功中标庆阳职业技术学院全国一体化算力网络国家枢纽节点数字经济人才培养基地项目,标志着唯众在助力西部职业教育与数字经济融合发展的新征程上迈出了坚实的一步。 …...
Swagger的原理及应用详解(四)
本系列文章简介: 在当今快速发展的软件开发领域,特别是随着微服务架构和前后端分离开发模式的普及,API(Application Programming Interface,应用程序编程接口)的设计与管理变得愈发重要。一个清晰、准确且易于理解的API文档不仅能够提升开发效率,还能促进前后端开发者之…...
Elasticsearch7.10集群搭建
Elasticsearch详细介绍: Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎。它的核心基于 Apache Lucene,能够处理海量的数据,并支持实时的全文搜索。以下是关于 Elasticsearch 的详细介绍。 一、基本概念 索引(Index…...
SMU Summer 2024 Contest Round 3
A.Hcode OnlineJudge 先用欧拉筛把质数预处理出来,然后枚举左端点的质数,只需要询问右端点是不是质数并取差值的min就行了 #include<bits/stdc.h> #define endl \n #define mk make_pair #define int long long using namespace std; typedef lon…...
uniapp 封装瀑布流组件
思路: 1.coulumns:需要分成几列 2.如何分布数据 3.计算每列的宽度 4.图片进行高度自适应 <template><view :style"{ margin: boxM }"><view class"flex flex-justify-start bg-red" style"background-colo…...
 
pd虚拟机去虚拟化是什么意思?pd虚拟机去虚拟化教程 PD虚拟机优化设置
Parallels Desktop for Mac(PD虚拟机)去虚拟化是指在虚拟机(Virtual Machine,简称 VM)中禁用或减少虚拟化层的影响,使其表现更接近于物理机。这种操作通常用于提高虚拟机的性能或解决某些软件兼容性问题。具…...
低代码研发项目管理流程优化:提效与创新的双重驱动
随着信息技术的迅猛发展,软件项目的规模和复杂度日益增加,传统的软件开发方式已经难以满足快速迭代和高效交付的需求。在这一背景下,低代码平台应运而生,以其高效、灵活、易用的特点,迅速成为软件行业的新宠。然而&…...
 
32位版 C 库函数time 将在 2038 年溢出,那到时候,它该何去何从
简单地说,通常不必担心,在64位操作系统已经成为主流的今天这基本上不是问题(在写这篇回答的时候,我才发现我甚至找不到32位的机器来测试)刚好我有一些资料,是我根据网友给的问题精心整理了一份「32库函数的…...
C语言 printf函数缓冲机制
printf不立即打印到stdout的原因 printf函数使用了缓冲机制。当我们调用printf时,输出通常不会立即显示在屏幕上,而是先存储在一个缓冲区中。这是为了提高I/O操作的效率。 缓存数据输出的原理 stdio库维护了一个缓冲区。当缓冲区满了,或者在特定条件下,缓冲区的内容会被刷新…...
 
【Linux进阶】文件系统8——硬链接和符号连接:ln
在Linux下面的链接文件有两种, 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接&…...
代码随想录算法训练营Day64|拓扑排序(卡码网117)、dijkstra朴素版
拓扑排序 117. 软件构建 (kamacoder.com) 拓扑排序简单的说是将一个有向图转为线性的排序。 它将图中的所有结点排序成一个线性序列,使得对于任何的边uv,结点u在序列中都出现在结点v之前,这样的序列满足图中所有的前驱-后继关系。 拓扑排…...
 
neo4j 图数据库:Cypher 查询语言、医学知识图谱
neo4j 图数据库:Cypher 查询语言、医学知识图谱 Cypher 查询语言创建数据查询数据查询并返回所有节点查询并返回所有带有特定标签的节点查询特定属性的节点及其所有关系和关系的另一端节点查询从名为“小明”的节点到名为“小红”的节点的路径 更新数据更新一个节点…...
 
数据结构基础--------【二叉树基础】
二叉树基础 二叉树是一种常见的数据结构,由节点组成,每个节点最多有两个子节点,左子节点和右子节点。二叉树可以用来表示许多实际问题,如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念: 二叉树的深度&a…...
 
数据开源 | Magic Data大模型高质量十万轮对话数据集
能够自然的与人类进行聊天交谈,是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一,近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的,但构建具备对话能力的大模型是一项不小的挑战,收集高…...
webpack之ts打包
tsconfig.json配置 // 是否对js文件进行编译,默认false"allowJs": true,// 是否检查js代码是否符合语法规范,默认false(引入的外部文件有可能语法有问题)"checkJs": true, allowJs和checkJs基本是同时出现,因为有了allowJs 这个检查…...
 
MATLAB数据统计描述和分析
描述性统计就是搜集、整理、加工和分析统计数据, 使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在数学建模的数据描述部分经常使用。 目录 1.频数表和直方图 2 .统计量 3.统计…...
 
设计分享—国外后台界面设计赏析
国外后台界面设计将用户体验放在首位,通过直观易懂的布局和高效的交互设计,提升用户操作效率和满意度。 设计不仅追求美观大方,还注重功能的实用性和数据的有效展示,通过图表和图形化手段使数据更加直观易懂。 采用响应式布局&a…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
 
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
 
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
 
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
 
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
 
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
