打造免费的本地AI助手

如果你想使用自己的本地 AI 助手或文档查询系统,我将在本文中解释如何使用,最好的部分是,你无需为任何 AI 请求付费。

现代应用程序需要强大的解决方案来访问和检索 PDF 等非结构化数据中的相关信息。检索增强生成 (RAG) 是一种尖端方法,将 AI 的语言生成功能与基于向量的搜索相结合,以提供准确、上下文感知的答案。

在本文中,我将介绍使用 LangChain、Chroma 实现 RAG 管道的 Flask 应用程序的开发。该应用程序允许用户上传 PDF 文档、存储嵌入并查询它们以进行信息检索——所有这些都由 Ollama 提供支持。

如果你准备在计算机或服务器上创建一个简单的 RAG 应用程序,本文将为你提供指导。换句话说,你将学习如何构建自己的本地助手或文档查询系统。

我们将构建什么

我们的应用程序包括以下功能:

  • 查询通用 AI 的任何问题。你可以使用 flask post 方法向本地 LLM 模型直接提问
Post 方法 -> 简单问题
Ollama 的回答
  • 上传 PDF 文档进行处理和存储。你可以将 PDF 上传到本地存储和本地向量数据库。
  • 你可以询问有关文档的任何问题。检索特定于上传 PDF 内容的答案。
技术栈:工具和库

我们将使用以下技术栈来构建此应用程序:

  • Flask:用于创建 REST API 的轻量级 Python 框架。
  • LangChain:用于构建检索和生成管道。
  • Chroma:用于存储和查询文档嵌入的向量存储。
  • PDFPlumber:用于从 PDF 中提取文本。
  • Ollama LLM:开源大型语言模型以生成 AI 响应。

1、设置 Flask

Flask 是我们 API 的骨干。它公开了处理用户查询、PDF 上传和 AI 响应所需的端点。

首先,我们访问本地 LLM,然后使用 Json 返回答案:

cached_llm = Ollama(model="llama3.2:latest")
@app.route("/askAi", methods=["POST"])
def ask_ai():
    print("Post /ai called")
    json_content = request.json
    query = json_content.get("query")
    print(f"query: {query}")
    response = cached_llm.invoke(query)
    print(response)
    response_answer = {"answer": response}
    return response_answer

2、上传和处理 PDF

使用 PDFPlumber,我们从 PDF 中提取文本。 LangChain 的 RecursiveCharacterTextSplitter 将文本拆分为可管理的块,这些块嵌入并存储在 Chroma 中,以便高效查询:

from langchain_community.document_loaders import PDFPlumberLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = PDFPlumberLoader("example.pdf")
docs = loader.load_and_split()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=80)
chunks = text_splitter.split_documents(docs)

3、在 Chroma 中存储数据

Chroma 用作我们的矢量数据库,存储文档块的嵌入。这些嵌入允许在检索期间进行基于相似性的搜索:

from langchain_community.vectorstores import Chroma

vector_store = Chroma.from_documents(chunks, embedding=FastEmbedEmbeddings())
vector_store.persist(directory="db")

4、查询 PDF

/askPdf 端点从向量存储中检索上下文,并使用提示模板通过 AI 模型生成答案:

@app.route("/askPdf", methods=["POST"])
def ask_pdf():
    query = request.json["query"]
    retriever = vector_store.as_retriever(search_type="similarity_score_threshold")
    chain = create_retrieval_chain(retriever, document_chain)
    result = chain.invoke({"input": query})
    return {"answer": result["answer"]}

5、API端点概述

Flask 应用程序提供三个主要端点:

  • /askAi:直接查询 AI 以获得通用答案。
  • /askPdf:查询已上传的 PDF 以获得上下文特定的答案。
  • /addPdf:上传并处理 PDF 文档以进行存储。

每个API端点都设计得简单易用,并与 LangChain 框架紧密集成以进行 RAG 操作。

4、运行应用程序

首先,你必须启动 Ollama 提供服务,然后安装需要的库:

ollama serve   # 1. 启动ollama提供服务

pip install -r requirements.txt   # 2. 安装必要的库

python app.pyhttp://127.0.0.1:5000  # 3. 运行程序

5、挑战与解决方案

  • 高效文本分块

在不丢失上下文的情况下拆分文档至关重要。使用 LangChain 的 RecursiveCharacterTextSplitter,我们确保分块保持一致性,同时保持足够小以进行嵌入。

  • 可扩展向量存储

Chroma 提供快速、轻量级的向量存储,非常适合处理大型数据集,同时支持快速查询。

  • 上下文感知响应

自定义提示模板可确保 AI 模型将检索到的文档内容无缝集成到其答案中。

5、结束语

通过结合 AI、向量搜索和文档处理,此应用程序展示了 RAG 在解决实际问题方面的强大功能。无论你是研究人员、开发人员还是公司员工,本指南都为你提供了构建自定义文档查询系统的工具。

想要更进一步吗?克隆 GitHub 存储库并立即开始构建!


原文链接:Build Your Free AI Assistant-RAG Python &Ollama

汇智网翻译整理,转载请标明出处