基于langchain的agentic+RAG+智谱清言+HuggingFace的简单实现

概要

基于langchain的agentic+RAG+智谱清言+HuggingFace的简单实现

整体架构流程

Langchain Agentic-RAG的简单demo(建议使用jupyter食用)


标准操作程序(SOP):构建索引并创建检索器

1. 概述

该操作程序用于从指定的网页中加载数据,进行文本分割和嵌入向量化,并将文档存储到一个向量数据库中。此索引可以在后续的检索任务中为 RAG(Retrieval-Augmented Generation)系统提供支持。

2. 前提条件

在执行此SOP之前,请确保系统中已安装以下Python库:

  • langchain
  • langchain_huggingface
  • langchain_community
  • chromadb
  • tiktoken

命令如下:pip install langchain_community tiktoken langchain-openai langchain-cohere langchainhub chromadb langchain langgraph tavily-python -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 操作步骤

3.1 导入必要的库和模块

首先,导入所有需要的库和模块,确保后续的代码能够顺利执行。

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
3.2 配置嵌入模型

这儿采用hugingface中的开源模型,可以下载到本地,也可以在线使用,不用api-key
附上国内的镜像网站:https://hf-mirror.com/

选择并配置一个HuggingFace嵌入模型,当前代码使用的是 moka-ai/m3e-base。此模型将用于将文本转换为嵌入向量。至于为什么用m3e embedding,因为其预训练的语料库大部分是基于中文的,对中文的语义理解效果较好

# Set embeddings
embd = HuggingFaceEmbeddings(model_name="moka-ai/m3e-base")
3.3 指定待加载的网页URL

将需要加载的网页链接存储在 urls 列表中。每个链接将被加载并进行文本处理。(此处是我之前写的博客文章,关于langchain的)

# Docs to index
urls = [
    "https://blog.csdn.net/qq_44742936/article/details/144132892?spm=1001.2014.3001.5501",
    "https://blog.csdn.net/qq_44742936/article/details/143329561?spm=1001.2014.3001.5501",
    "https://blog.csdn.net/qq_44742936/article/details/143452968?spm=1001.2014.3001.5501",
]
3.4 加载网页内容

使用 WebBaseLoader 加载网页内容,将其转换为文档对象。每个URL都将通过 WebBaseLoader 加载并存储为文档。

# Load
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
3.5 文本分割

为了提高向量存储和检索效率,需要将文档内容分割成较小的文本块。使用 RecursiveCharacterTextSplitter 进行分割,设置 chunk_size 为500字符,并确保文本块之间没有重叠。

# Split
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=500, chunk_overlap=0
)
doc_splits = text_splitter.split_documents(docs_list)
3.6 将文档存储到向量数据库

使用 Chroma 向量数据库将分割后的文档嵌入向量存储。配置好存储路径和嵌入模型,确保数据能够持久化。

# Add to vectorstore
vectorstore = Chroma.from_documents(
    documents=doc_splits,
    collection_name="rag-chroma-glm-long",
    embedding=embd,
    persist_directory="./chroma_agentic_rag_glm_long"
)

说明:存储路径 ./chroma_agentic_rag_glm_long 可以根据需要调整,确保该目录具有适当的写权限。

后面可直接从向量数据库中进行加载

# 直接加载
vectorstore = Chroma(
    embedding_function=embd,
    persist_directory="./chroma_adaptive_rag"
)
3.7 创建检索器

通过 Chroma 向量存储创建一个检索器(Retriever),该检索器将用于后续的文本查询和信息检索任务。

retriever = vectorstore.as_retriever()
3.8导入必要的库和模块

首先,导入所有必要的库和模块,确保后续的操作可以正常执行。

from langchain.tools.retriever import create_retriever_tool
from typing import Annotated, Sequence
from typing_extensions import TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
3.9 创建检索工具

通过 create_retriever_tool 方法创建检索工具,这个工具将允许我们向大语言模型(LLM)提交查询,并从已构建的检索器中查找相关信息。

# 创建检索工具
retriever_tool = create_retriever_tool(
    retriever,  # 使用之前创建的 retriever
    "检索信息提交",  # 工具名称
    "查找并返回小五郎关于langchain用法的相关描述."  # 工具描述
)
tools = [retriever_tool]  # 将工具加入工具列表
  • name: 为检索工具设置唯一且描述性的名称,在模型交互中用作识别标识。
  • description: 该字段描述了工具的作用,例如查找并返回与Langchain相关的描述。
3.10 定义 AgentState 类型

定义 AgentState 类型,用于存储代理状态及其相关消息。我们使用 add_messages 来更新消息,而不是简单替换。

# 定义 AgentState 类型
class AgentState
Agentic RAG 是一种先进的信息检索和生成框架,它结合了代理(Agent)、检索增强生成(Retrieval-Augmented Generation, RAG)以及大型语言模型(LLM)的能力。这种架构旨在更有效地处理复杂的查询请求,并提供更加准确的答案。 核心特点包括: - 动态编排机制:利用AI代理的灵活性来适应不同类型的用户需求,调整检索与生成策略以解决复杂的问题。 - 查询优化:当初始检索结果不理想时,系统会尝试改进查询条件或者采用其他手段提高结果质量。 - 工具调用:可以集成外部工具和服务,例如特定领域的API或数据库访问权限,从而扩展系统的功能范围。 - 多步推理能力:支持需要连续逻辑步骤才能完成的任务解答过程。 - 应用于各个领域:可以根据具体的应用场景创建专业的文档代理(Doc Agent),如财务、法律等领域,帮助收集相关信息并形成综合性的报告文本。 为了使 Agentic RAG 更加实用,在实际应用中通常还会涉及到以下几个方面的工作: 1. 定义明确的目标群体及其常见问题类型; 2. 设计合理的数据源接入方案确保获取高质量的信息资源; 3. 开发高效的算法实现快速而精确的结果匹配; 4. 测试和完善整个流程保证稳定可靠的用户体验。 通过这种方式,Agentic RAG 能够显著提升自动化问答服务的质量,特别是在面对那些涉及广泛背景知识和技术细节的情况下表现尤为突出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值