首页 > 其他分享 >借助 LangGraph、OpenAI 和 Tavily 构建自适应 RAG 系统(含代码)

借助 LangGraph、OpenAI 和 Tavily 构建自适应 RAG 系统(含代码)

时间:2025-01-13 12:33:54浏览次数:3  
标签:检索 RAG vectorstore question 系统 生成 Tavily LangGraph

自适应RAG系统(Multi-Agentic RAG:探索智能问答系统的新边界(含代码))是一种能够根据用户查询的具体语境,动态选择检索策略与生成方式的人工智能系统。它结合了先进的自然语言处理技术和信息检索算法,能够在海量数据中快速定位相关信息,并基于这些信息生成准确、连贯的回答。LangGraph、OpenAI和Tavily作为这一过程中的关键工具,分别承担着流程编排、语言生成与信息检索的重任。

一、系统架构与工具介绍
  1. LangGraph:LangGraph(探索LangGraph:开启AI Agent构建的新路径)是一个用于编排工具和管理对话逻辑的库。它允许开发者以图形化的方式定义工作流,将不同的功能模块(如检索器、生成器等)连接起来,形成一个高效的信息处理流程。在自适应RAG系统中,LangGraph负责协调各个组件的工作,确保信息能够顺畅地在不同模块间传递。

  2. OpenAI:OpenAI(OpenAI’s O3:AI推理模型的新前沿)是自然语言处理领域的领军企业,其提供的GPT系列模型在文本生成方面表现出色。在自适应RAG系统中,OpenAI模型被用作生成器,根据检索到的相关信息生成回答。通过微调OpenAI模型,可以使其更好地适应特定领域或任务的需求,从而提高生成的准确性和连贯性。

  3. Tavily:Tavily是一个强大的网络搜索引擎,它能够根据用户查询快速返回相关网页或文档。在自适应RAG系统中,Tavily作为外部信息源,为系统提供了丰富的背景知识和相关信息。通过集成Tavily,系统能够超越本地数据库的限制,获取更广泛的信息资源。

二、系统构建步骤

1、环境搭建

首先,需要安装必要的库和工具。这包括LangGraph、TikToken、Langchain(包含对OpenAI、Cohere等API的支持)、ChromoDB(用于向量存储)、以及Tavily的Python客户端等。通过pip命令可以方便地安装这些依赖项。


2、数据准备

为了构建自适应RAG系统,需要准备大量的文本数据作为训练材料。这些数据可以来自网页、学术论文、新闻报道等来源。在将数据输入系统之前,需要对其进行预处理,包括去除噪声、分词、向量化等步骤。其中,向量化是将文本数据转换为高维向量表示的关键步骤,它使得系统能够根据向量间的相似度来检索相关信息。

3、工作流定义

利用LangGraph定义工作流是构建自适应RAG系统(探索 Auto-RAG:提升人工智能知识获取与生成能力的新路径)的核心步骤之一。工作流定义了从用户查询输入到最终回答输出的整个处理流程。在这个流程中,需要定义多个节点和边来连接不同的功能模块。例如,可以定义一个“检索”节点来调用Tavily进行网络搜索,一个“生成”节点来调用OpenAI模型生成回答,以及一个“评估”节点来对生成的回答进行质量评估。

4、检索与生成策略

自适应RAG系统的关键在于其能够根据用户查询的具体语境动态调整检索与生成策略(优化检索增强生成(RAG)管道:实现更智能AI回应的高级技术)。为了实现这一目标,需要定义一系列规则和逻辑来判断何时进行网络搜索、何时从本地数据库中检索信息,以及何时调用生成器生成回答。例如,对于某些具有明确指向性的查询(如“请提供关于XXX的最新研究”),系统可以优先进行网络搜索;而对于一些较为模糊或泛化的查询(如“请谈谈你对XXX的看法”),则可以首先从本地数据库中检索相关信息,然后基于这些信息生成回答。

创建查询:

from pydantic import BaseModel, Fieldfrom typing import Literalclass RouteQuery(BaseModel):    """Route a user query to the most relevant datasource."""    datasource: Literal["vectorstore", "web_search"] = Field(        ...,        description="Given a user question choose to route it to web search or a vectorstore.",    )structured_llm_router = llm.with_structured_output(RouteQuery)# PromptROUTER_PROMPT = """You are an expert at routing a user question to a vectorstore or web search.The vectorstore contains documents related to 2025, new year investment outlook by nutmeg.Use the vectorstore for questions on these topics. Otherwise, use web-search."""    from langchain_core.prompts import ChatPromptTemplateroute_prompt = ChatPromptTemplate.from_messages(    [        ("system", ROUTER_PROMPT),        ("human", "{question}"),    ])question_router = route_prompt | structured_llm_router# question_router.invoke({"question": "What are the new 2025 investment?"})## RouteQuery(datasource='vectorstore')# question_router.invoke({"question": "What are the new llm we have?"})## RouteQuery(datasource='web_search')

query改写(Query 改写综述:提升信息检索效率与准确性的关键技术):​​​​​​​

from pydantic import BaseModel, Fieldfrom typing import Literalclass RouteQuery(BaseModel):    """Route a user query to the most relevant datasource."""    datasource: Literal["vectorstore", "web_search"] = Field(        ...,        description="Given a user question choose to route it to web search or a vectorstore.",    )structured_llm_router = llm.with_structured_output(RouteQuery)# PromptROUTER_PROMPT = """You are an expert at routing a user question to a vectorstore or web search.The vectorstore contains documents related to 2025, new year investment outlook by nutmeg.Use the vectorstore for questions on these topics. Otherwise, use web-search."""    from langchain_core.prompts import ChatPromptTemplateroute_prompt = ChatPromptTemplate.from_messages(    [        ("system", ROUTER_PROMPT),        ("human", "{question}"),    ])question_router = route_prompt | structured_llm_router# question_router.invoke({"question": "What are the new 2025 investment?"})## RouteQuery(datasource='vectorstore')# question_router.invoke({"question": "What are the new llm we have?"})## RouteQuery(datasource='web_search')

5、模型训练与微调

在定义了工作流和检索与生成策略之后,需要对OpenAI模型进行训练或微调(深入了解Fine-Tuning:解锁大语言模型的潜能)。这通常涉及使用大量的训练数据来优化模型的参数,使其能够更好地适应特定任务的需求。在训练过程中,可以采用多种策略来提高模型的性能,如使用不同的损失函数、调整学习率、引入正则化项等。

6、系统测试与优化

完成模型训练后,需要对整个自适应RAG系统进行测试(五大开源RAG(Retrieval-Augmented Generation)评估框架详解)和优化。测试阶段的目标是评估系统在各种场景下的性能表现,包括准确率、召回率、生成速度等指标。根据测试结果,可以对工作流、检索策略、生成策略等进行调整和优化,以提高系统的整体性能。

三、案例分析

以下是一个具体的案例分析,展示了如何构建自适应RAG系统来处理用户查询。

假设用户输入了一个关于“2025年投资建议”的查询。系统首先会分析这个查询的语境和意图,并决定采取何种检索与生成策略。在这个例子中,系统可能会优先进行网络搜索,以获取最新的市场动态和投资趋势。通过调用Tavily搜索引擎,系统可以快速找到一系列与“2025年投资建议”相关的网页和文档。

接下来,系统会对这些检索到的信息进行评估和筛选,以确定哪些信息对回答用户查询最有价值。这通常涉及对信息的相关性、准确性、权威性等方面的评估。在筛选过程中,系统可能会使用一些预定义的规则或机器学习模型来辅助判断。

一旦确定了相关的信息,系统就会调用OpenAI模型来生成回答。在这个过程中,模型会根据检索到的信息以及用户查询的具体语境来生成一个连贯、准确的回答。为了提高生成的准确性和连贯性,系统还可以对生成的回答进行后处理,如去除冗余信息、调整句子结构等。

最后,系统会对生成的回答进行质量评估,以确保其符合用户期望。这通常涉及对回答的语义理解、逻辑连贯性、事实准确性等方面的评估。如果评估结果不理想,系统可能会重新进行检索和生成过程,直到生成一个满意的回答为止。

自适应RAG系统是一种高效、智能的信息处理工具,它结合了先进的自然语言处理技术和信息检索算法,能够根据用户查询的具体语境动态调整检索与生成策略。通过融合LangGraph、OpenAI和Tavily等工具,我们可以构建一个功能强大的自适应RAG系统,实现对用户查询的精准响应。

然而,自适应RAG系统的发展仍面临一些挑战和问题。例如,如何进一步提高系统的准确率和召回率、如何优化模型的训练过程以提高生成速度和质量、如何更好地处理复杂和多义的查询等。未来,随着技术的不断进步和应用的不断拓展,我们相信自适应RAG系统将在更多领域发挥重要作用。

完整代码git:https://github.com/Abhinavk910/GenAI/blob/main/Agent/Langgraph/Adaptive_rag/RAG.ipynb

标签:检索,RAG,vectorstore,question,系统,生成,Tavily,LangGraph
From: https://blog.csdn.net/llm_way/article/details/145112750

相关文章

  • TrustRAG:增强RAG系统鲁棒性与可信度的创新框架
    在人工智能飞速发展的今天,大语言模型(LLMs)凭借其强大的语言处理能力在诸多领域大放异彩。检索增强生成(RAG)系统(面向企业RAG(RetrievalAugmentedGeneration)系统的多维检索框架)的出现,通过整合外部知识源进一步提升了LLMs的性能,使其能针对用户查询提供更准确、更具上下文相关性的......
  • DraggableSheetContext
    DraggableSheetContext基础库3.2.0开始支持,低版本需做兼容处理。相关文档:draggable-sheetDraggableSheet实例,可通过wx.createSelectorQuery的NodesRef.node方法获取。方法DraggableSheetContext.scrollTo(Objectobject)滚动到指定位置。size取值[0,1],size......
  • RAG中的文本切分策略详解
    RAG中的文本切分策略详解1.选择RAG中的文本切分策略1.1不同的文本切分策略1.CharacterTextSplitter-这是最简单的方法。它默认基于字符(默认为"")来切割,并且通过字符的数量来衡量块的长度2.RecursiveCharacterTextSplitter-基于字符列表拆分文本。3.-基......
  • 【Docker】Docker搭建一款开源的RAG聊天应用
    项目介绍Kotaemon是一个由Cinnamon开发的开源项目,旨在提供一个基于检索增强生成(RAG)技术的用户界面,使用户能够与自己的文档进行交互问答。功能特点文档问答:Kotaemon允许用户通过自然语言查询与文档进行交互,快速获取所需信息。这一功能在学术研究、企业文档管理等领域具有广泛应......
  • 使用 MongoDB 和 OpenAI 实现 RAG 的实战指南
    在本篇文章中,我们将深入探讨如何使用MongoDB和OpenAI实现检索增强生成(RAG,Retrieve-AugmentedGeneration)。通过结合数据库的高效检索能力和语言模型的生成能力,可以创建出功能强大的应用。接下来,我们将详细介绍如何搭建这样的系统,并提供可运行的代码示例。技术背景介绍......
  • 使用RAG与LanceDB和OpenAI构建智能应用
    在现代AI应用中,结合现有知识库与生成式AI模型进行信息检索与生成(RAG)正变得愈加重要。本文将指南特如何通过LanceDB和OpenAI实现RAG,帮助开发者快速搭建智能应用。技术背景介绍LanceDB是一个高效、面向AI的数据库,能够存储和检索大量向量数据。与OpenAI的生成式AI模型结合,可......
  • 使用Ollama和OpenAI实现多查询RAG的实践指南
    在本文中,我们将深入探讨如何使用Ollama和OpenAI来实现基于多查询检索增强生成(RAG)的应用。多查询检索器通过将用户的输入查询转换为多个不同视角的查询,从而在更广泛的背景下检索相关文档。这种方法可以提升答案生成的准确性和丰富性。技术背景介绍RAG(Retrieval-AugmentedG......
  • 《你的RAG出错了?快来Get这份改进秘籍》
    原始RAG框架在提升检索和生成答案质量方面,还有一些关键问题没解决:找出来的文档真的跟用户问题相关吗?有时候可能找偏了。找到的内容够不够回答用户的问题?会不会信息量不足?会不会有一堆没用的信息混进来,反而把答案搞乱了?检索速度够快吗?会不会让用户等太久?万一检索......
  • [NOISG2022 Qualification] Dragonfly Solution in O(d log d)
    [NOISG2022Qualification]DragonflySolutioninO(dlogd)提供一个使用线段树合并、栈、树状数组的严格单\(\log\)离线做法。题目大意:给你一棵树,每个点有权值和颜色,每次问你一个从\(1\)开始的路径,求权值不为\(0\)的节点的颜色种类数,并且把所有权值不为\(0\)的节点权......
  • RAG项目实战——基于Llamaindex微调BGE Embedding模型(附完整源码和转化好的数据集下载
    在自然语言处理(NLP)领域,检索增强生成(Retrieval-AugmentedGeneration,RAG)模型已经成为一种强大的工具,能够结合检索和生成任务,提供更准确的回答。然而,RAG模型的性能很大程度上依赖于嵌入模型的质量。为了进一步提升RAG模型的检索准确性,我们可以通过对嵌入模型进行微调(Fine-t......