LangChain 0.2 - 构建查询分析系统

2024-05-28 17:44

本文主要是介绍LangChain 0.2 - 构建查询分析系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文翻译整理自:Build a Query Analysis System
https://python.langchain.com/v0.2/docs/tutorials/query_analysis/


文章目录

    • 一、项目说明
    • 二、设置
      • 1、安装依赖项
      • 2、设置环境变量
      • 3、加载文档
      • 4、索引文档
    • 三、不使用查询分析的检索
    • 四、查询分析
      • 1、查询模式
      • 2、查询生成
    • 五、使用查询分析的检索


一、项目说明

本页将展示如何在一个基本的端到端示例中使用查询分析。这将涵盖创建一个简单的搜索引擎,展示将原始用户问题传递给该搜索时发生的故障模式,然后是一个查询分析如何帮助解决该问题的示例。有许多不同的查询分析技术,这个端到端示例不会展示所有技术。

为了本例,我们将对 LangChain YouTube 视频进行检索。


二、设置


1、安装依赖项

pip install -qU langchain langchain-community langchain-openai youtube-transcript-api pytube langchain-chroma


2、设置环境变量

我们将在此示例中使用 OpenAI:

import getpass
import osos.environ["OPENAI_API_KEY"] = getpass.getpass()# Optional, uncomment to trace runs with LangSmith. Sign up here: https://smith.langchain.com.
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

3、加载文档

我们可以使用YouTubeLoader来加载一些 LangChain 视频的成绩单:

from langchain_community.document_loaders import YoutubeLoaderurls = ["https://www.youtube.com/watch?v=HAn9vnJy6S4","https://www.youtube.com/watch?v=dA1cHGACXCo","https://www.youtube.com/watch?v=ZcEMLz27sL4","https://www.youtube.com/watch?v=hvAPnpSfSGo","https://www.youtube.com/watch?v=EhlPDL4QrWY","https://www.youtube.com/watch?v=mmBo8nlu2j0","https://www.youtube.com/watch?v=rQdibOsL1ps","https://www.youtube.com/watch?v=28lC4fqukoc","https://www.youtube.com/watch?v=es-9MgxB-uc","https://www.youtube.com/watch?v=wLRHwKuKvOE","https://www.youtube.com/watch?v=ObIltMaRJvY","https://www.youtube.com/watch?v=DjuXACWYkkU","https://www.youtube.com/watch?v=o7C9ld6Ln-M",
]
docs = []
for url in urls:docs.extend(YoutubeLoader.from_youtube_url(url, add_video_info=True).load())

API 参考:YoutubeLoader


import datetime# Add some additional metadata: what year the video was published
for doc in docs:doc.metadata["publish_year"] = int(datetime.datetime.strptime(doc.metadata["publish_date"], "%Y-%m-%d %H:%M:%S").strftime("%Y"))

以下是我们加载的视频的标题:

[doc.metadata["title"] for doc in docs]

['OpenGPTs','Building a web RAG chatbot: using LangChain, Exa (prev. Metaphor), LangSmith, and Hosted Langserve','Streaming Events: Introducing a new `stream_events` method','LangGraph: Multi-Agent Workflows','Build and Deploy a RAG app with Pinecone Serverless','Auto-Prompt Builder (with Hosted LangServe)','Build a Full Stack RAG App With TypeScript','Getting Started with Multi-Modal LLMs','SQL Research Assistant','Skeleton-of-Thought: Building a New Template from Scratch','Benchmarking RAG over LangChain Docs','Building a Research Assistant from Scratch','LangServe and LangChain Templates Webinar']

以下是与每个视频相关的元数据。我们可以看到每个文档还有标题、观看次数、发布日期和长度:

docs[0].metadata

{'source': 'HAn9vnJy6S4','title': 'OpenGPTs','description': 'Unknown','view_count': 7210,'thumbnail_url': 'https://i.ytimg.com/vi/HAn9vnJy6S4/hq720.jpg','publish_date': '2024-01-31 00:00:00','length': 1530,'author': 'LangChain','publish_year': 2024}

以下是文档内容的一个示例:

docs[0].page_content[:500]

"hello today I want to talk about open gpts open gpts is a project that we built here at linkchain uh that replicates the GPT store in a few ways so it creates uh end user-facing friendly interface to create different Bots and these Bots can have access to different tools and they can uh be given files to retrieve things over and basically it's a way to create a variety of bots and expose the configuration of these Bots to end users it's all open source um it can be used with open AI it can be us"

4、索引文档

每当我们执行检索时,我们都需要创建一个可以查询的文档索引。我们将使用向量存储来索引我们的文档,并首先对它们进行分块,以使我们的检索更加简洁和精确:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
chunked_docs = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunked_docs,embeddings,
)

API 参考:OpenAIEmbeddings | RecursiveCharacterTextSplitter


三、不使用查询分析的检索

我们可以直接对用户问题进行相似性搜索,以找到与该问题相关的块:

search_results = vectorstore.similarity_search("how do I build a RAG agent")
print(search_results[0].metadata["title"])
print(search_results[0].page_content[:500])

Build and Deploy a RAG app with Pinecone Serverless
hi this is Lance from the Lang chain team and today we're going to be building and deploying a rag app using pine con serval list from scratch so we're going to kind of walk through all the code required to do this and I'll use these slides as kind of a guide to kind of lay the the ground work um so first what is rag so under capoy has this pretty nice visualization that shows LMS as a kernel of a new kind of operating system and of course one of the core components of our operating system is th

效果非常好!我们的第一个结果与问题非常相关。

如果我们想要搜索特定时间段的结果该怎么办?

search_results = vectorstore.similarity_search("videos on RAG published in 2023")
print(search_results[0].metadata["title"])
print(search_results[0].metadata["publish_date"])
print(search_results[0].page_content[:500])

OpenGPTs
2024-01-31
hardcoded that it will always do a retrieval step here the assistant decides whether to do a retrieval step or not sometimes this is good sometimes this is bad sometimes it you don't need to do a retrieval step when I said hi it didn't need to call it tool um but other times you know the the llm might mess up and not realize that it needs to do a retrieval step and so the rag bot will always do a retrieval step so it's more focused there because this is also a simpler architecture so it's always

我们的第一个结果来自 2024 年(尽管我们要求搜索 2023 年的视频),并且与输入不太相关。由于我们只是针对文档内容进行搜索,因此无法根据任何文档属性对结果进行过滤。

这只是可能出现的故障模式之一。现在让我们看看基本形式的查询分析如何修复它!


四、查询分析

我们可以使用查询分析来改进检索结果。这将涉及定义包含一些日期过滤器的查询模式,并使用函数调用模型将用户问题转换为结构化查询。


1、查询模式

在这种情况下,我们将为发布日期提供明确的最小和最大属性,以便可以对其进行过滤。

from typing import Optionalfrom langchain_core.pydantic_v1 import BaseModel, Fieldclass Search(BaseModel):"""Search over a database of tutorial videos about a software library."""query: str = Field(...,description="Similarity search query applied to video transcripts.",)publish_year: Optional[int] = Field(None, description="Year video was published")

2、查询生成

为了将用户问题转换为结构化查询,我们将使用 OpenAI 的工具调用 API。具体来说,我们将使用新的ChatModel.with_structured_output()构造函数来处理将架构传递给模型并解析输出。

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAIsystem = """You are an expert at converting user questions into database queries. \
You have access to a database of tutorial videos about a software library for building LLM-powered applications. \
Given a question, return a list of database queries optimized to retrieve the most relevant results.If there are acronyms or words you are not familiar with, do not try to rephrase them."""
prompt = ChatPromptTemplate.from_messages([("system", system),("human", "{question}"),]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

API 参考:ChatPromptTemplate | RunnablePassthrough | ChatOpenAI

/Users/bagatur/langchain/libs/core/langchain_core/_api/beta_decorator.py:86: LangChainBetaWarning: The function `with_structured_output` is in beta. It is actively being worked on, so the API may change.warn_beta(

让我们看看我们的分析器针对我们之前搜索的问题生成了哪些查询:

query_analyzer.invoke("how do I build a RAG agent")
# -> Search(query='build RAG agent', publish_year=None)query_analyzer.invoke("videos on RAG published in 2023")
# -> Search(query='RAG', publish_year=2023)

五、使用查询分析的检索

我们的查询分析看起来非常好;现在让我们尝试使用生成的查询来实际执行检索。

**注意:**在我们的示例中,我们指定了tool_choice="Search"。这将强制 LLM 调用一个(且只有一个)工具,这意味着我们将始终有一个优化查询要查找。请注意,情况并非总是如此 - 请参阅其他指南,了解如何处理没有返回或返回多个优化查询的情况。

from typing import Listfrom langchain_core.documents import Document

API 参考:文档

def retrieval(search: Search) -> List[Document]:if search.publish_year is not None:# This is syntax specific to Chroma,# the vector database we are using._filter = {"publish_year": {"$eq": search.publish_year}}else:_filter = Nonereturn vectorstore.similarity_search(search.query, filter=_filter)

retrieval_chain = query_analyzer | retrieval

我们现在可以在之前有问题的输入上运行这个链,并看到它只产生那一年的结果!

results = retrieval_chain.invoke("RAG tutorial published in 2023")[(doc.metadata["title"], doc.metadata["publish_date"]) for doc in results]

[('Getting Started with Multi-Modal LLMs', '2023-12-20 00:00:00'),('LangServe and LangChain Templates Webinar', '2023-11-02 00:00:00'),('Getting Started with Multi-Modal LLMs', '2023-12-20 00:00:00'),('Building a Research Assistant from Scratch', '2023-11-16 00:00:00')]

2024-05-24(五)

这篇关于LangChain 0.2 - 构建查询分析系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011252

相关文章

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的