文章目录
概要
基于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