返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

从0开始学RAG第一篇——RAG快速入门

[复制链接]
链载Ai 显示全部楼层 发表于 半小时前 |阅读模式 打印 上一主题 下一主题

从0开始学RAG第一篇——RAG快速入门

  • 作者:lucas大叔
  • 原文地址:https://zhuanlan.zhihu.com/p/685411934

一、什么是检索增强生成(RAG)?

检索增强生成(RAG)作为一种将LLM与外部数据源打通的方法,可以有效弥补LLM的实时性和幻觉等短板

二、检索增强生成(RAG)流程包含哪些环节?

常规的RAG流程包括indexing、retrieval和generation三部分,但当面对真实使用场景时,还需要采用更先进的技术和方案来解决现实中的挑战。

下图汇总了RAG全链路上各个环节可应用的技术,可以看到林林总总的还不少,接下来我们会用一个系列对图中的每项技术进行讲解和代码实践。有条件的同学可以follow 视频教程。

RAG全链路 视频 https://www.youtube.com/watch?v=wd7TZ4w1mSw&feature=youtu.be

2.1 Indexing

构建RAG应用首先要通过相应的loader加载数据,不论是pdf、word、markdown,亦或是网页。加载完成后再选择TextSplitter将文档切割为chunk用于embedding和向量存储。

2.2 Retrieval

最简单的retrieval是将向量存储作为检索器,检索获取相似文档。此外,还有各种类型的retriever,后面我们会一一介绍。

2.3 Retrieval

将retriever检索到的候选文档和query与prompt一并扔给LLM,让它根据prompt中的指令生成答案,生成的答案再用parser解析成人类方便阅读的格式。

三、检索增强生成(RAG)代码解读?

本节首先讲解如何利用ChatGPT快速构建RAG应用,大家可以根据自己的使用需求将代码中embedding模型和LLM替换成开源大模型。

以下是RAG应用的快速实现示例,初学者可以运行体验一下。

导包

    import bs4    from langchain import hub    from langchain.text_splitter import RecursiveCharacterTextSplitter    from langchain_community.document_loaders import WebBaseLoader    from langchain_community.vectorstores import Chroma    from langchain_core.output_parsers import StrOutputParser    from langchain_core.runnables import RunnablePassthrough    from langchain_openai import ChatOpenAI, OpenAIEmbeddings

3.1 INDEXING

  1. Load Documents
    # Load Documents    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()
  1. Split
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)    splits = text_splitter.split_documents(docs)

  1. Embed
    # Embed    vectorstore = Chroma.from_documents(        documents=splits, embedding=OpenAIEmbeddings()    )    retriever = vectorstore.as_retriever()

3.2 RETRIEVAL and GENERATION

  1. Prompt
    # Prompt    prompt = hub.pull("rlm/rag-prompt")

  1. LLM
    # LLM    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

  1. LLM
    # LLM    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

  1. Post-processing
# Post-processingdef format_docs(docs):    return "\n\n".join(doc.page_content for doc in docs)

  1. Chain
# Chainrag_chain = (    {"context": retriever | format_docs, "question": RunnablePassthrough()}    | prompt    | llm    | StrOutputParser())

  1. Question
# Questionrag_chain.invoke("What is Task Decomposition?")

通过上面的示例代码,可以快速构建一个简单的RAG demo,体验LLM的乐趣。若想打造能够工程落地的RAG应用,需要针对具体数据和bad case确定总的解决方案,在indexing、retriever和generation等环节上进行联合优化。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ