RAG 概览
RAG是一种结合了检索和生成能力的模型,它通过从大规模外部知识库中检索相关信息,增强了传统语言生成模型的能力。RAG特别适合处理需要具体细节或外部事实支持的问题。
RAG 工作原理
- 检索:从大型文档集合中查找相关文档或段落。
- 上下文编码:将检索到的文档与原始输入一起编码。
- 生成:使用编码的上下文信息生成输出。
LangChain 工具梳理
LangChain提供了多种工具来实现RAG,包括文档加载器、文本转换器、文本分割器、嵌入模型和向量数据库等。
文档加载
- 支持多种文档类型(HTML、PDF、代码)。
- 与Airbyte和Unstructured.IO等集成。
文本转换
- 将长文档分割成适合模型上下文窗口的小块。
文本分割器
- 将文本分成具有语义意义的块。
- 块之间有一定的重叠以保持上下文。
嵌入
- 使用LLM将文本转换为数值表示,便于计算机处理和比较文本。
- LangChain提供与多个嵌入模型的交互接口。
存储嵌入
- 缓存存储:如InMemoryStore、LocalFileStore、RedisStore。
- 向量数据库:如Elasticsearch、Faiss、Chroma、Qdrant等。
数据检索
- Retriever:通过非结构化查询返回相关文档。
- 向量存储检索器:支持向量检索。
索引
- 管理和定位文档信息,确保文档具有唯一标识并便于检索。
- 使用记录管理器跟踪文档状态和来源。
实践任务
- 文本分割:尝试使用一种文本分割器给文档分块。
from langchain.text_splitter import CharacterTextSplitter text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) - 向量数据库:尝试使用一种新的向量数据库存储文本嵌入。
from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings embeddings = OpenAIEmbeddings() index_creator = VectorstoreIndexCreator( vectorstore_cls=Chroma, embedding=OpenAIEmbeddings(), text_splitter=CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) ) - 检索器:尝试使用一种新的检索器提取信息。
from langchain.indexes import VectorstoreIndexCreator index = VectorstoreIndexCreator().from_loaders([loader]) query = "玫瑰花的花语是什么?" result = index.query(query) print(result)
应用场景
- 鲜花运营:通过嵌入向量关联鲜花与非结构化信息(如花语、颜色、产地)。
- 订单管理:嵌入并检索订单信息,提供实时更新、跟踪和查询服务。
思考与延伸
- RAG为非结构化数据创建了一个“地图”,通过嵌入向量快速准确地检索信息。
- 下一课将探讨LLM如何帮助查询数据库表中的条目。
总结
RAG通过检索增强生成,为非结构化数据的存储和搜索提供了一种有效方法。通过LangChain工具,我们可以轻松实现RAG,提高信息检索的效率和准确性。期待在实践中深入理解和应用RAG,以提升业务流程和用户体验。