如何使用 Llama 3 构建本地 RAG 应用程序


通过利用 Llama 3 和 RAG 技术的功能,我们将创建一个应用程序,让用户能够与网页进行交互式对话,检索相关信息并生成对用户查询的准确响应。在本教程中,我们将逐步介绍设置开发环境、加载和处理网页数据、创建嵌入和向量存储以及实现 RAG 链以提供卓越用户体验的过程。

什么是 Llama 3?

Llama 3 是 Meta AI 开发的最先进的语言模型,擅长理解和生成类似人类的文本。

  • Llama 3 拥有出色的自然语言处理能力,可以理解复杂的查询、提供准确的响应并参与上下文相关的对话。
  • 它处理广泛主题的能力和处理效率使其成为构建智能应用程序的理想选择。

什么是 RAG?

检索增强生成 (RAG) 是一种结合信息检索和语言生成的技术,以增强问答系统的性能。

  • 用简单的英语来说,RAG 允许 AI 模型从知识库或文档中检索相关信息,并使用该信息为用户查询生成更准确、更符合上下文的响应。
  • 通过利用检索和生成的力量,RAG 可以创建智能聊天机器人和问答应用程序,为用户提供高度相关且信息丰富的答复。

有了以上所有信息,让我们开始吧!

运行本地 Llama 3 RAG 应用程序的先决条件

在开始之前,请确保您已安装以下先决条件:

  • Python 3.7 或更高版本
  • Streamlit
  • ollama
  • Langchain
  • langchain_community

您可以通过运行以下命令来安装所需的库:

 pip install streamlit ollama langchain langchain_community

使用 Llama-3 在本地运行自己的 RAG 应用程序

步骤 1:设置 Streamlit 应用程序

首先,让我们设置 Streamlit 应用程序的基本结构。创建一个名为 的新 Python 文件app.py并添加以下代码:

 import streamlit as st
 import ollama
 from langchain.text_splitter import RecursiveCharacterTextSplitter
 from langchain_community.document_loaders import WebBaseLoader
 from langchain_community.vectorstores import Chroma
 from langchain_community.embeddings import OllamaEmbeddings
 ​
 st.title("Chat with Webpage 🌐")
 st.caption("This app allows you to chat with a webpage using local Llama-3 and RAG")
 # Get the webpage URL from the user
 webpage_url = st.text_input("Enter Webpage URL", type="default")

此代码设置了 Streamlit 应用程序的基本结构,包括标题、标题和供用户输入网页 URL 的输入字段。

第 2 步:加载并处理网页数据

接下来,我们需要从指定的网页加载数据并进行处理以供进一步使用。将以下代码添加到app.py

 if webpage_url:
     # 1. Load the data
     loader = WebBaseLoader(webpage_url)
     docs = loader.load()
     text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=10)
     splits = text_splitter.split_documents(docs)

这里,我们使用WebBaseLoader来加载网页数据。然后,我们使用RecursiveCharacterTextSplitter将加载的文档拆分成更小的块。

步骤 3:创建 Ollama 嵌入和向量存储

为了能够高效地从网页中检索相关信息,我们需要创建嵌入和向量存储。添加以下代码:

 # 2. Create Ollama embeddings and vector store
 embeddings = OllamaEmbeddings(model="llama3")
 vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

我们使用OllamaEmbeddings类来创建 Ollama 嵌入并指定llama3模型。然后,我们使用该类创建一个向量存储Chroma,并传递拆分文档和嵌入。

步骤 4:定义 Ollama Llama-3 模型函数

现在,让我们定义一个函数,利用 Ollama Llama-3 模型根据用户的问题和相关上下文生成响应。添加以下代码:

 # 3. Call Ollama Llama3 model
 def ollama_llm(question, context):
     formatted_prompt = f"Question: {question}\n\nContext: {context}"
     response = ollama.chat(model='llama3', messages=[{'role': 'user', 'content': formatted_prompt}])
     return response['message']['content']

此函数将用户的问题和相关上下文作为输入。它通过结合问题和上下文来格式化提示,然后使用该ollama.chat函数使用 Llama-3 模型生成响应。

步骤5:设置RAG链

为了根据用户的问题从向量存储中检索相关信息,我们需要设置 RAG(检索增强生成)链。添加以下代码:

 # 4. RAG Setup
 retriever = vectorstore.as_retriever()
 ​
 def combine_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)
 ​
 def rag_chain(question):
    retrieved_docs = retriever.invoke(question)
    formatted_context = combine_docs(retrieved_docs)
    return ollama_llm(question, formatted_context)
 ​
 st.success(f"Loaded {webpage_url} successfully!")

在这里,我们使用该方法从向量存储中创建一个检索器as_retriever。我们定义一个辅助函数,combine_docs将检索到的文档组合成一个格式化的上下文字符串。该rag_chain函数接收用户的问题,使用检索器检索相关文档,将文档组合成格式化的上下文,并将问题和上下文传递给该ollama_llm函数以生成响应。

步骤6:实现聊天功能

最后,让我们在 Streamlit 应用中实现聊天功能。添加以下代码:

 # Ask a question about the webpage
 prompt = st.text_input("Ask any question about the webpage")
 ​
 # Chat with the webpage
 if prompt:
    result = rag_chain(prompt)
    st.write(result)

此代码添加了一个输入字段,供用户询问有关网页的问题。当用户输入问题并提交时,rag_chain将使用用户的问题调用该函数。然后使用 显示生成的响应st.write

最后一步:运行应用程序的时候到了!

要运行该应用程序,请保存app.py文件并在同一目录中打开终端。运行以下命令:

 streamlit run app.py

这将启动 Streamlit 应用程序,您可以通过提供的 URL 在 Web 浏览器中访问它。

结论

恭喜!您已成功构建了一个在本地运行的 Llama-3 RAG 应用。该应用利用本地 Llama-3 和 RAG 技术的强大功能,让用户能够与网页聊天。用户可以输入网页 URL,应用将加载和处理网页数据、创建嵌入和向量存储,并使用 RAG 链检索相关信息并根据用户的问题生成回复。

您可以根据需要通过添加更多功能、改进用户界面或集成其他功能来进一步探索和增强应用程序。