大模型应用开发 langchain和 langgraph 之 RAG 入门

在我们看完 Langchain 基础之后,RAG 就是第二个难点。本文探索 langchain 中的 RAG 以及部分 langgraph RAG。

在这里插入图片描述

一、什么是 RAG ?

Retrieval Augmented Generation 检索增强生成。

简单的说就是大模型,虽然比较全面,但是在一些细节上还是有很多的不同,这个时候我们就可以通过上下文的方式,给大模型一些额外的数据增强大模型的知识库,然后生成内容。RAG 从数据源到 LLM 输出,大致分为三个流程:

  • 索引
  • 检索
  • 生成

先看一张经典的图片:

在这里插入图片描述

二、索引

索引页分为三个部分:

  • 读取数据源 load
  • 分割文档 split
  • 向量存储 embed + vector

2.1) Load

因为数据源是多种多样的,langchain 中使用 Loader 对各种数据源进行支持。可以在 document_loaders 找到对象。一些常用的:

  • txt
  • json
  • csv
  • pdf
  • docx
  • markdown
  • web content
py
 代码解读

from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders import TextLoader
from langchain_community.document_loaders import CSVLoader
from langchain_community.document_loaders import Docx2txtLoader
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_community.document_loaders import UnstructuredHTMLLoader
from langchain_community.document_loaders import JSONLoader
from langchain_community.document_loaders import WebBaseLoader

这里以 pdf 为例从 loader 到 docs 的过程:

sh
 代码解读

poetry add pypdf2 # 需要pdf 相关库的支持
py
 代码解读

from langchain_community.document_loaders import PyPDFLoader

pdf_loader = PyPDFLoader(full_path)

docs = loader.load()

读取到的数据结构是 Document 对象

py
 代码解读

from langchain_core.documents import Document

以下是 Document 的数据结构:

在这里插入图片描述

在这里插入图片描述

Document 对象继承自 BaseMedia, 包含了 idmetadata 属性:

在这里插入图片描述

2.2) Split

首先我们要明白为什么要 Split ?

其实也很简单,大模型处理的内容是有限的,大量数据文件,分割处理更加有利于大模型对数据内容理解。

当然 langchain 也提供了单独的一个库 langchain_text_splitters 处理 Split:

sh
 代码解读

poetry add langchain_text_splitters
pip install langchain_text_splitters

在这里插入图片描述

py
 代码解读

# 字符文本分割
from langchain_text_splitters import CharacterTextSplitter
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_text_splitters import TokenTextSplitter
from langchain_text_splitters import SpacyTextSplitter
from langchain_text_splitters import SentenceTransformersTokenTextSplitter
from langchain_text_splitters import NLTKTextSplitter
from langchain_text_splitters import KonlpyTextSplitter

以上包含七种同的 TextSplitter,这里以 RecursiveCharacterTextSplitter 使用

py
 代码解读

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)

# tiktoken_encoder
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)

# document
splits = text_splitter.split_documents(docs)

# text
texts = text_splitter.split_text(document)
  • chunk_size 指定字符串和
  • chunk_overlap 重叠文本的长度

2.3)Embed + Store

Store 这里也可以分为两个部分:

  • 嵌入式模型
  • 向量存储

这个两个部分 langchain 也给我们封装好了,我们需要熟悉嵌入式模型的用法。

embeddings 模型

嵌入式模型种类也非常多,不同的模型能力也有不同。 目前 langchain 支持的 embeddings

在这里插入图片描述

  • openai
  • ollama
  • HuggingFace
  • Cohere
  • zhipu

有本地部署的,有在线付费的,有开源免费的,总之根据自己的需求探索使用。这里使用 OpenAI 的 embeddings 和 ZhipuAI embeddings 为例进行讲解。

  • OpenAI:

OpenAI 目前有三个种模型如果你是自己测试 embeddings 模型:

在这里插入图片描述

py
 代码解读

from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings()
  • 国内的我们以 zhipu AI 的 embeddings 为例:

在这里插入图片描述

简单的封装一下:

py
 代码解读

from langchain_community.embeddings import ZhipuAIEmbeddings

import dotenv

class ZhipuEmbeddings():
    api_key = dotenv.get_key(".env", "api_key")

    @classmethod
    def create_zhipu_embeddings(self, model_name):
        embeddings = ZhipuAIEmbeddings(
            model=model_name,
            api_key=self.api_key
        )
        return embeddings

当然你也可以在 text_embedding 查看 langchain 支持 embeddings 模型。

VectorStore

在这里插入图片描述

langchain 支持了众多的 vector store 这里我们简单的进行分类,这些是 langchain 中给到和一些常用的向量存储数据库。

  • 内存:InMemoryVectorStore

  • 本地存储:Chroma/FAISS

  • 其他类型:

    • Pinecone
    • Milvus
    • Qdrant
  • 传统数据库对

    • PostgreSQL + pgvector
    • Supabase
    • Redis
py
 代码解读

# InMemoryVectorStore
from langchain_core.vectorstores import InMemoryVectorStore

vector_store = InMemoryVectorStore(embedding=SomeEmbeddingModel())

# Chroma
from langchain_chroma import Chroma

vectorstore = Chroma.from_documents(  
    documents,  
    embedding=OpenAIEmbeddings(),  
)

# FAISS
from langchain_community.vectorstores import FAISS
vectorstore = FAISS.from_documents(texts, embeddings)

# Milvus
from langchain_milvus import Milvus
URI = "./milvus_example.db"

vector_store = Milvus(
    embedding_function=embeddings,
    connection_args={"uri": URI},
)

三、检索和生成

先看一个经典的图

在这里插入图片描述

一个问题来,先经过向量的检索,然后生成新的提示词,然后给到大模型,最后得到答案。

四、VectorStore 的核心方法

  • add_texts(texts, metadatas):将文本及其元数据嵌入并存储到 VectorStore。
  • similarity_search(query, k):基于查询向量,返回最相似的 k 个结果。
  • similarity_search_with_score:使用距离运行相似性搜索。
  • delete(ids):根据指定的 ID 删除向量。
  • from_documents(documents):从文档列表构建向量存储。
  • save_local(path) 和 load_local(path):将向量存储保存到本地或从本地加载。

五、retriever 检索和生成

5.1)检索

将 VectorStore 转换为检索器: as_retriever

py
 代码解读

query = "my query"
# 搜索文档
docs = vectorstore.similarity_search(query)
# 转成检索器
retriever = vector_store.as_retriever()

# 检索
retrieved_docs = retriever.invoke("What are the approaches to Task Decomposition?")

5.2) 生成

准备好了这一切,从读取数据库,到分割成 Document, 到 embeddings model + 向量存储。下面就是使用 Langchian 的 chain 组合上传文进行生成内容了。

  • | chain 模型

在生成 retriever 之后,retriever 做来 context 的值传递给 chain 后面的内容,当然也可以使用 create_retrieval_chain api 来创建一个 rag_chain。

py
 代码解读

# retrieve 作为 chain 中的 context

# chain
chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
)
  • create_retrieval_chain
py
 代码解读

# create_retrieval_chain
from langchain.chains import create_retrieval_chain

rag_chain = create_retrieval_chain(retriever, question_answer_chain)

六、langgraph 中的 RAG

LangGraph是一个用于使用LLMs构建有状态、多参与者应用程序的库,用于创建代理和多代理工作流程。

langgraph 的 RAG 是 langgraph 架构 与 langchain 有所不同,这里我们简单的实现一个 Langgraph 的 RAG:

  • chatbot + pdf 的 RAG
sh
 代码解读

poetry init
poetry add langchain langgraph python-dotenv langchain-openai langchain-text-splitters langchain-community pypdf zhipui

在国内我们的大模型选择zhipu的大模型。首先通过 质谱开放平台获取 zhipu 的 API KEY 和 url 地址。

在这里插入图片描述

下面我们基于 Jupyter Notebook + VSCode 插件做一个来完成一个简单的 PDF RAG 应用。

6.1)设置 env 环境文件

在这里插入图片描述

这里的 OPEN_AI_KEY 就是 zhipu ai 的key

6.2)读取 env 文件环变量

在这里插入图片描述

6.3)定义 zhipu ai 变量

在这里插入图片描述

6.4)定义 zhipu ai 的模型

在这里插入图片描述

6.5)定义质谱ai的 embeddings 模型

在这里插入图片描述

6.6)定义 langchain 读取 pdf 文件

在这里插入图片描述

6.7)对读取的 pdf 文件进行分割

在这里插入图片描述

6.8)使用内存型向量数据存储

在这里插入图片描述

6.9)使用 langchain hub 中的提示器

在这里插入图片描述

6.10)定义 langgraph 的 State

在这里插入图片描述

6.11)定义 langgraph 的两个节点

  • retrieve:根据问题进行向量相似搜素,返回检索的上下文
  • generate: 提供问题和上下文,调用大模型生成,然后返回

在这里插入图片描述

6.12)组合 langgraph 节点和、并编译

在这里插入图片描述

6.13)传递问题并回答

在这里插入图片描述

我们问题是: 用中文回答,本书主要讲的内容,100字以内, 我们看到回答也很简单,在 100 字之内,符合预期。

6.14) 绘制一个 langgraph 的图

在这里插入图片描述

七、小结

本文主要梳理 Langchain 的 RAG 的使用和流程。Langchain 中关于 RAG 基础工具已经帮助我们解决了,我们可以借助这些工具方便快捷的写一个简单的 RAG 应用。langchain 也提供了另外一种架构 langgraph 完成 RAG, RAG 的流程与 langchain 不一样的地方在于 RAG 检索在 langgraph 的节点上完成。

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

LLM大模型学习路线

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

### LangChain GraphRAG 使用指南常见问题解决方案 #### 安装与配置 为了成功部署并运行LangChain中的GraphRAG模块,需遵循特定的安装流程。对于本地环境而言,建议参照官方提供的Nano GraphRAG与Ollama组合方案来简化设置过程[^1]。此方法不仅提高了效率还增强了系统的响应性能。 #### 数据准备 完成软件包搭建之后,下一步就是准备好用于训练的知识库资料。按照指导说明,在指定位置建立一个新的目录以容纳这些资源文件;值得注意的是,当前版本仅接受文本(.txt)以及逗号分隔值(.csv)两种格式作为输入形式[^3]。 #### 功能特性概述 GraphRAG框架通过引入自适应路由机制实现了对传统基于向量检索方式的有效补充。当面对海量文档集合时,该技术能够精准定位重要信息片段,并将其转化为结构化的知识网络表示法。这一步骤极大地促进了后续自然语言处理任务的质量改进,比如加速查询解析速度、提高上下文关联度等表现指标[^4]。 #### 实现细节描述 具体来说,整个工作流可以概括为三个主要阶段: - **实体识别**:利用大型预训练模型自动提取出有意义的对象及其相互作用模式; - **社群划分**:针对紧密相连的一组节点预先计算好简要描述语句; - **动态组装**:依据实际请求内容灵活选取最合适的子集进行即时合成答复。 #### 故障排查技巧 如果遇到任何困难或者异常情况,可以从以下几个方面入手寻找原因: - 确认所有依赖项均已正确加载并无冲突现象发生; - 检查目标平台是否满足最低硬件要求特别是GPU驱动程序版本匹配状况; - 对于CUDA相关错误提示,则可能涉及到显卡兼容性编译参数设定不当等问题。 ```python import torch print(torch.cuda.is_available()) ``` 上述代码可用于验证PyTorch能否正常访问到可用的NVIDIA GPU设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值