LangChain入门2 RAG详解

RAG概述

一个典型的RAG应用程序,它有两个主要组件:

  • 索引:从源中获取数据并对其进行索引的管道。这通常在脱机情况下发生。
  • 检索和生成:在运行时接受用户查询,并从索引中检索相关数据,然后将其传递给模型。

从原始数据到答案的完整序列如下所示:

索引

  • 加载:首先我们需要加载我们的数据。我们将为此使用DocumentLoaders。
  • 拆分:文本拆分器将大型文档拆分成更小的块。这对于索引数据和将数据传递给模型都很有用,因为大块更难搜索,也不适合模型的有限上下文窗口。
  • 信息存储:我们需要一个地方来存储和索引我们的拆分,以便以后可以搜索它们。这通常使用VectorStore和Embeddings模型来完成。

检索和生成

  • 检索:给定用户输入,使用Retriever从存储中检索相关拆分。
  • 生成:ChatModel/LLM使用包含问题和检索到的数据的提示生成答案。

代码实例

依赖加载

from langchain_community.llms import Ollama
import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_chroma import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.embeddings import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
#实例化大模型
llm = Ollama(model="llama2")
#添加向量化
embeddings = OllamaEmbeddings()
# 加载数据
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()
#我们这里查看具体的下载内容
print(docs)

查看具体的下载内容
在这里插入图片描述
加载数据的拆分和灌库

#添加数据的拆分 每1000个为一组并重叠200个字符
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
#拆分下载的数据
splits = text_splitter.split_documents(docs)
#灌入向量数据库
vectorstore 
### LangChain4J RAG (Retrieval-Augmented Generation) 功能介绍 LangChain4J 提供了一种实现检索增强生成(Retrieval-Augmented Generation, RAG)[^1]的方式,允许开发者构建应用,在生成回复前先从外部知识源中检索相关信息。这种机制使得应用程序可以基于最新的、具体的上下文来提供更精确的回答。 #### 工作原理 当接收到一个问题时,系统会执行如下操作: - **检索阶段**: 使用向量数据库或其他形式的知识存储库查询与问题最匹配的内容片段; - **融合阶段**: 将找到的相关信息同原始提问组合成新的提示词(prompt),作为下一步处理的基础; - **生成阶段**: 利用强大的预训练语言模型根据上述构造好的prompt创建最终答案; 通过这种方式,即使面对未曾见过的新颖情况或领域专业知识,也能给出高质量且具有时效性的回应[^2]。 #### 实现方式 为了便于理解和实践,下面给出了一个简单的Java代码示例,展示了如何在LangChain4J项目里集成RAG特性: ```java // 导入必要的包 import ai.langchain.LangChain; import ai.langchain.retriever.Retriever; public class RagExample { public static void main(String[] args){ // 初始化LangChain实例并配置参数... Retriever retriever = new Retriever(); String queryText = "什么是量子计算?"; List<String> retrievedDocuments = retriever.retrieve(queryText); StringBuilder promptBuilder = new StringBuilder(); for (String doc : retrievedDocuments){ promptBuilder.append(doc).append("\n"); } promptBuilder.append("请解释").append(queryText); String finalPrompt = promptBuilder.toString(); System.out.println(LangChain.generateResponse(finalPrompt)); } } ``` 此段程序首先定义了一个`Retriever`对象负责完成信息查找的任务,接着把获取的结果拼接到用户询问之后形成完整的指示语句,最后调用了`generateResponse()`函数得到预期答复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值