功能齐全的 LLM 应用程序,100% 免费且无需互联网(分步说明)
Meta 的新开源模型 Llama 3.2 风靡一时。但是你已经开始使用这些模型进行构建了吗?如果没有,现在是深入研究的最佳时机。Llama 3.2 具有更小的规模、更快的令牌生成速度和更高的准确性,为使用 RAG 构建 AI 应用程序开辟了新的可能性。
在本教程中,我们将向您展示如何使用 Llama 3.2 和 RAG 构建简单而强大的 PDF 聊天助手。最后,您将能够上传 PDF、提出问题并获得高度准确的答案,而您的应用程序在本地运行时,完全免费且无需互联网。
1. 我们正在构建什么
我们的 PDF 聊天助手使用带有 RAG 的 Llama 3.2 来分析 PDF 文档的内容并基于它回答问题。 此助手将:
- 使用 Streamlit 获得易于使用的界面
- 将 RAG 与 Llama 3.2 的强大功能相结合
- 使用 Embedchain 框架实现 RAG 功能
- 使用 ChromaDB 对 PDF 内容进行矢量存储
2. 分步说明
2.1 设置环境
首先,让我们准备好开发环境:
1 2 3 4 5 6 7 |
conda create -yn awesome-llm-apps python=3.11 conda activate awesome-llm-apps git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git cd awesome-llm-apps\chat_with_pdf pip install -r requirements.txt |
2.2 创建 Streamlit 应用程序
现在环境已设置完毕,让我们创建 Streamlit 应用程序。创建一个新文件chat_pdf.py
并添加以下代码:
导入需要的库:在文件顶部,添加
1 2 3 4 5 6 |
import os import tempfile import streamlit as st from embedchain import App import base64 from streamlit_chat import message |
配置应用程序:对于此应用程序,我们将使用 Llama-3.2 和 Ollama。您可以从 OpenAI、Anthropic 或任何其他 LLM
选择向量数据库作为开源 ChromaDB(您可以自由选择任何其他向量数据库)
1 2 3 4 5 6 7 8 |
def embedchain_bot(db_path): return App.from_config( config={ "llm": {"provider": "ollama", "config": {"model": "llama3.2:latest", "max_tokens": 250, "temperature": 0.5, "stream": True, "base_url": 'http://localhost:11434'}}, "vectordb": {"provider": "chroma", "config": {"dir": db_path}}, "embedder": {"provider": "ollama", "config": {"model": "llama3.2:latest", "base_url": 'http://localhost:11434'}}, } ) |
处理 PDF 上传和显示:在 Streamlit 应用程序中添加显示 PDF 的功能 这允许用户预览上传的 PDF
1 2 3 4 |
def display_pdf(file): base64_pdf = base64.b64encode(file.read()).decode('utf-8') pdf_display = f'<iframe src="data:application/pdf;base64,{base64_pdf}" width="100%" height="400" type="application/pdf"></iframe>' st.markdown(pdf_display, unsafe_allow_html=True) |
设置 Streamlit 应用程序:Streamlit 允许您仅使用 python 代码创建用户界面,对于此应用程序,我们将:
使用 ‘st.title()’ 向应用程序添加标题
使用 ‘st.caption()’ 为应用程序添加描述
1 2 3 4 5 6 7 8 9 |
st.title("Chat with PDF using Llama 3.2") st.caption("This app allows you to chat with a PDF using Llama 3.2 running locally with Ollama!") db_path = tempfile.mkdtemp() if 'app' not in st.session_state: st.session_state.app = embedchain_bot(db_path) if 'messages' not in st.session_state: st.session_state.messages = [] |
创建用于 PDF 上传和预览的侧边栏:用户可以在此处上传和预览 PDF
1 2 3 4 5 6 7 |
with st.sidebar: st.header("PDF Upload") pdf_file = st.file_uploader("Upload a PDF file", type="pdf") if pdf_file: st.subheader("PDF Preview") display_pdf(pdf_file) |
将 PDF 添加到知识库:上传 PDF 后,内容将被处理并添加到 ChromaDB 以供检索
1 2 3 4 5 6 7 |
if st.button("Add to Knowledge Base"): with st.spinner("Adding PDF to knowledge base..."): with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as f: f.write(pdf_file.getvalue()) st.session_state.app.add(f.name, data_type="pdf_file") os.remove(f.name) st.success(f"Added {pdf_file.name} to knowledge base!") |
聊天界面:创建聊天界面以允许用户询问有关 PDF 的问题
1 2 3 4 5 6 7 |
for i, msg in enumerate(st.session_state.messages): message(msg["content"], is_user=msg["role"] == "user", key=str(i)) if prompt := st.chat_input("Ask a question about the PDF"): st.session_state.messages.append({"role": "user", "content": prompt}) message(prompt, is_user=True) |
处理用户问题并显示回复:添加按钮以清除聊天记录
1 2 3 4 5 6 7 8 |
with st.spinner("Thinking..."): response = st.session_state.app.chat(prompt) st.session_state.messages.append({"role": "assistant", "content": response}) message(response) if st.button("Clear Chat History"): st.session_state.messages = [] |
2.3 创建 Streamlit 应用程序
有了我们的代码,就可以启动应用程序并开始比较股票了。
启动 Streamlit 应用程序:在终端中,导航到项目文件夹,然后运行以下命令
1 |
streamlit run chat_pdf.py |
访问您的 AI 助手:Streamlit 将提供一个本地 URL(通常为 http://localhost:8501)。在您的网络浏览器中打开它,然后通过输入它们的符号开始比较股票。
3. 结论
您已经成功构建了一个由 Meta 的 Llama 3.2 和在本地运行的 RAG 提供支持的 PDF 聊天助手。
Llama 3.2 模型的速度和改进的理解能力,结合 ChromaDB 的多功能性,为您构建更高级的应用程序奠定了坚实的基础。
无论您是扩展此项目以支持更多文档类型、添加多文档查询,还是通过云集成进行扩展,您现在都拥有了突破 Llama 3.2 生态系统可能性界限的工具。
参考连接:https://www.theunwindai.com/p/build-an-llm-app-with-rag-using-llama-3-2-running-locally