机器学习实验室 | 制作个人的第一个RAG demo!

本文来源公众号“机器学习实验室”,仅用于学术分享,侵权删,干货满满。

原文链接:制作个人的第一个RAG demo!

检索增强生成(Retrieval-Augmented Generation, RAG) 是一种结合了信息检索和大模型(LLM)的技术,用于构建更强大和准确的问答或生成系统。RAG通过将大模型与外部知识库相结合,可以动态检索相关信息并利用生成模型对查询进行更准确的回答。

RAG在对抗大模型幻觉、高效管理用户本地文件以及数据安全保护等方面具有独到的优势,因而目前基于大模型应用专门做RAG赛道的企业不在少数。

构建一个RAG的核心流程包括索引(indexing)和检索生成(Retrieval and generation)两大块。索引部分主要是数据工程,涉及到各类文档数据的导入(load)、解析(extract)、分割(split)、嵌入(embed)和存储(store)等,检索生成部分主要是基于大模型对用户查询进行检索和生成最终回复。RAG流程如图1所示。

图1 RAG流程

随着大模型几轮浪潮下来,RAG技术本身也经历了多个版本的迭代,主要包括原始RAG版本(Naive RAG)、高级RAG(Advanced RAG)和模块化RAG(Modular RAG)。高级RAG在原始RAG基础上添加了预检索(pre-retrieval)和后检索(post-retrieval)部分,而模块化RAG则是通过模块化设计,可以更容易地集成不同类型的检索器、生成器、知识源、以及融合机制,从而实现更高的灵活性和性能。三种不同的RAG如图2所示。

图2 三种RAG

RAG虽然实现逻辑简单,但从工程上来看却是一个非常的系统性工程。在生产环境下,想要实现一套稳定、可靠、精准的RAG系统是一件难度非常大的任务。但从学习者的角度来看,我们可以基于成熟的大模型应用模块快速搭建一个RAG demo。本文笔者以LangChain框架为例,快速搭建一个基于甲状腺癌的医疗RAG demo。

模型方面,笔者直接使用OpenAI的gpt-4o-mini,文本嵌入模型用的是text-embedding-3-large,向量数据库用的是In-Memory,当然也可以用Milvus、FAISS、chroma等向量数据库。

第一步,先做一些预备工作,指定好LLM、嵌入模型和向量数据库。

### setup chatmodelfrom langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "你的GPT api"llm = ChatOpenAI(model="gpt-4o-mini")
# setup embedding modelfrom langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# setup vector storefrom langchain_core.vectorstores import InMemoryVectorStorevector_store = InMemoryVectorStore(embeddings)

第二步,准备好外部文档并导入。笔者准备的是2022年版本的甲状腺癌诊疗规范文件,该规范文件是甲状腺癌和甲状腺结节的诊疗指南。

然后我们通过LangChain的PyPDFLoader导入该PDF文件,并进行分块(chunks)、嵌入和存储到向量库。

from langchain.document_loaders import PyPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载PDF文件 loader = PyPDFLoader("thyroid_cancer.pdf" )# 提取所有文本documents = loader.load()  
# 使用RecursiveCharacterTextSplitter进行分块text_splitter = RecursiveCharacterTextSplitter(    chunk_size=500,  # 每个chunk的最大字符数    chunk_overlap=50  # chunk之间的重叠字符数)
# 分割后的文本chunkschunks = text_splitter.split_documents(documents)
# 查看分割结果for i, chunk in enumerate(chunks[:3]):  # 仅展示前3个chunk    print(f"Chunk {i+1}:\n{chunk.page_content}\n")
# Index chunks_ = vector_store.add_documents(documents=chunks

上述部分就是RAG构建流程中的Indexing部分。然后我们再来构建检索和生成模块。​​​​​​​

from langchain import hubfrom typing_extensions import List, TypedDictfrom langchain_core.documents import Document
# 使用LangChain prompt hub的prompt范式prompt = hub.pull("rlm/rag-prompt")
# 为RAG应用定义stateclass State(TypedDict):    question: str    context: List[Document]    answer: str
# 定义检索过程def retrieve(state: State):    # 基于语义相似性搜索    retrieved_docs = vector_store.similarity_search(state["question"])    return {"context": retrieved_docs}
# 定义生成过程def generate(state: State):    docs_content = "\n\n".join(doc.page_content for doc in state["context"])    messages = prompt.invoke({"question": state["question"], "context": docs_content})    response = llm.invoke(messages)    return {"answer": response.content}

最后使用LangGraph将检索和生成步骤整合到一个应用程序中。​​​​​​​

from langgraph.graph import START, StateGraph# Compile application and testgraph_builder = StateGraph(State).add_sequence([retrieve, generate])graph_builder.add_edge(START, "retrieve")graph = graph_builder.compile()

这样,一个简单的RAG demo应用就搭建好了。我们来测试一下效果:​​​​​​​

response = graph.invoke({"question": "甲状腺癌体征有哪些?"})print(response["answer"])

 

最后,我们在LangSmith上也可以追踪每一个查询的实际运行情况:

文本完结。

参考资料:

1. https://python.langchain.com/docs/tutorials/rag/

2. Gao Y, Xiong Y, Gao X, et al. Retrieval-augmented generation for large language models: A survey[J]. arXiv preprint arXiv:2312.10997, 2023.

3. 甲状腺癌诊疗指南(2022版)

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

<think>好的,我需要回答用户关于寻找RAG(检索增强生成)的演示或示例的问题。首先,我应该回顾用户提供的引用内容,看看是否有相关的资料可以推荐。 引用[1]提到LlamaIndex的官方Starter Tutorial中有一个demo,用很少的代码使用OpenAI实现RAG。这个应该是一个很好的起点,用户可以通过这个教程快速入门。我需要详细说明这个资源,并提供链接,但用户给出的引用中没有实际链接,可能需要建议用户搜索LlamaIndex的官方文档。 引用[2]提到可以使用免费的API key来测试OpenAI,这可能是用户在尝试RAG时需要用到的一部分,特别是如果示例中使用的是OpenAI模型的话。这里需要提醒用户如何获取API key,但同样没有具体链接,可能需要指导他们访问OpenAI的官方网站。 引用[3]讨论了RAG的原理及本地化实践,可能包含更深入的原理说明和实际应用案例。虽然用户主要请求的是示例或教程,但了解原理对于正确应用RAG也是很重要的,所以可以推荐用户参考这部分内容。 接下来,我需要根据这些引用生成相关问题,帮助用户进一步探索RAG。可能的问题包括如何构建RAG系统、优化方法、本地化应用、选择嵌入模型以及评估效果等。这些问题应该覆盖用户可能关心的各个方面,从基础到进阶,帮助他们在学习示例后进一步深入。 另外,用户的问题中提到了需要结构清晰的回答,所以需要分点列出推荐的资源,每个资源对应相应的引用,并确保格式正确,比如数学表达式使用$...$,但在这个回答中可能用不上数学公式。但需要检查是否有需要的地方,比如如果有算法部分可能需要,但RAG更多涉及文本和检索,可能不需要数学公式。 还需要注意使用中文回答,保持自然流畅,避免使用Markdown格式,但用户给出的示例中使用了代码块和相关问题列表,需要按照用户的要求来组织内容。用户提供的系统级指令中提到生成相关问题,并在回答中引用段落末尾添加引用标识,例如[^1]。 最后,确保整个回答真实可靠,基于提供的引用内容,不添加未提及的信息。如果有不确定的地方,可能需要避免猜测,而是建议用户查阅官方文档或进一步资源。</think>关于检索增强生成(RAG)的演示或教程,以下是推荐资源及说明: ### 1. **LlamaIndex 官方 Starter Tutorial** LlamaIndex 提供了一个简洁的 RAG 实现示例,使用 OpenAI 快速构建检索与生成结合的流程。其特点包括: - 仅需少量代码即可完成文档加载、索引构建和问答生成。 - 支持本地文件(如 PDF、Word)或网络数据的处理[^1]。 ```python # 示例代码片段(基于引用内容) from llama_index import SimpleDirectoryReader, GPTVectorStoreIndex # 加载文档 documents = SimpleDirectoryReader('data').load_data() # 创建索引 index = GPTVectorStoreIndex.from_documents(documents) # 查询引擎 query_engine = index.as_query_engine() response = query_engine.query("什么是RAG?") print(response) ``` ### 2. **免费 OpenAI API Key 测试** 若需快速实验 RAG,可使用 OpenAI 提供的 API key(需注册获取),结合其文本生成模型(如 GPT-3.5/4)实现生成环节。注意: - API 调用需遵循速率限制和成本控制[^2]。 - 本地化部署时可能需要调整模型配置。 ### 3. **RAG 原理与本地化实践** 深入理解 RAG 的技术背景可参考原理性教程,涵盖以下内容: - 检索器与生成器的协同工作机制。 - 如何通过向量数据库(如 FAISS)优化检索效率。 - 实际场景中的调优技巧(如分块策略、相似度阈值设定)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值