编辑
2025-02-11
后端
00
请注意,本文编写于 87 天前,最后修改于 87 天前,其中某些信息可能已经过时。

目录

教程:使用LangGraph实现Adaptive RAG(自适应检索增强生成)
1. 环境设置
2. 创建索引
3. 定义路由器和检索器
4. 定义生成器和评估器
5. 构建LangGraph工作流
6. 运行工作流

教程:使用LangGraph实现Adaptive RAG(自适应检索增强生成)

在本教程中,我们将使用LangGraph框架实现一个Adaptive RAG(自适应检索增强生成)系统。该系统能够根据用户的问题动态选择检索策略,包括Web搜索和自校正RAG,并生成相应的回答。以下是详细的实现步骤。


1. 环境设置

首先,安装所需的Python包并设置API密钥。

python
%%capture --no-stderr %pip install -U langchain_community tiktoken langchain-openai langchain-cohere langchainhub chromadb langchain langgraph tavily-python import getpass import os def _set_env(var: str): if not os.environ.get(var): os.environ[var] = getpass.getpass(f"{var}: ") _set_env("OPENAI_API_KEY") # _set_env("COHERE_API_KEY") _set_env("TAVILY_API_KEY")

2. 创建索引

我们首先加载3篇博客文章,并将其索引到向量数据库中。

python
from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings # Set embeddings embd = OpenAIEmbeddings() # Docs to index urls = [ "https://lilianweng.github.io/posts/2023-06-23-agent/", "https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/", "https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/", ] # Load docs = [WebBaseLoader(url).load() for url in urls] docs_list = [item for sublist in docs for item in sublist] # Split text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder( chunk_size=500, chunk_overlap=0 ) doc_splits = text_splitter.split_documents(docs_list) # Add to vectorstore vectorstore = Chroma.from_documents( documents=doc_splits, collection_name="rag-chroma", embedding=embd, ) retriever = vectorstore.as_retriever()

3. 定义路由器和检索器

我们使用LLM作为路由器,决定问题是否需要Web搜索或向量存储检索。

python
from typing import Literal from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field # Data model class RouteQuery(BaseModel): """Route a user query to the most relevant datasource.""" datasource: Literal["vectorstore", "web_search"] = Field( ..., description="Given a user question choose to route it to web search or a vectorstore.", ) # LLM with function call llm = ChatOpenAI(model="gpt-4", temperature=0) structured_llm_router = llm.with_structured_output(RouteQuery) # Prompt system = """You are an expert at routing a user question to a vectorstore or web search. The vectorstore contains documents related to agents, prompt engineering, and adversarial attacks. Use the vectorstore for questions on these topics. Otherwise, use web-search.""" route_prompt = ChatPromptTemplate.from_messages( [ ("system", system), ("human", "{question}"), ] ) question_router = route_prompt | structured_llm_router

4. 定义生成器和评估器

我们定义生成器来生成回答,并使用评估器检查生成的内容是否相关和准确。

python
from langchain import hub from langchain_core.output_parsers import StrOutputParser # Prompt prompt = hub.pull("rlm/rag-prompt") # LLM llm = ChatOpenAI(model_name="gpt-4", temperature=0) # Post-processing def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) # Chain rag_chain = prompt | llm | StrOutputParser()

5. 构建LangGraph工作流

我们使用LangGraph构建工作流,动态路由问题并生成回答。

python
from langgraph.graph import END, StateGraph, START workflow = StateGraph(GraphState) # Define the nodes workflow.add_node("web_search", web_search) # web search workflow.add_node("retrieve", retrieve) # retrieve workflow.add_node("grade_documents", grade_documents) # grade documents workflow.add_node("generate", generate) # generate workflow.add_node("transform_query", transform_query) # transform_query # Build graph workflow.add_conditional_edges( START, route_question, { "web_search": "web_search", "vectorstore": "retrieve", }, ) workflow.add_edge("web_search", "generate") workflow.add_edge("retrieve", "grade_documents") workflow.add_conditional_edges( "grade_documents", decide_to_generate, { "transform_query": "transform_query", "generate": "generate", }, ) workflow.add_edge("transform_query", "retrieve") workflow.add_conditional_edges( "generate", grade_generation_v_documents_and_question, { "not supported": "generate", "useful": END, "not useful": "transform_query", }, ) # Compile app = workflow.compile()

6. 运行工作流

最后,我们运行工作流并查看结果。

python
from pprint import pprint # Run inputs = {"question": "What are the types of agent memory?"} for output in app.stream(inputs): for key, value in output.items(): pprint(f"Node '{key}':") pprint("\n---\n") # Final generation pprint(value["generation"])

通过本教程,你可以掌握如何使用LangGraph实现一个Adaptive RAG系统,并根据用户问题动态选择检索策略并生成回答。希望这对你的学习和开发有所帮助!

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!