当前位置: 首页 > news >正文

本地 AI 问答机器人搭建项目(Ollama + Qwen-7B + LangChain + FastAPI)

本地 AI 问答机器人搭建项目(Ollama + Qwen-7B + LangChain + FastAPI)

在本博客中,我们将详细介绍如何在 Windows 系统上搭建一个本地 AI 问答机器人。该机器人将使用 Ollama 加载阿里巴巴的 Qwen 1.5-7B 大语言模型(当然可以按照你的硬件调整),并通过 LangChain 管理对话链路,FastAPI 提供后端接口,结合一个简单的 HTML 页面作为前端交互界面(仅包含问答窗口)。我们将涵盖环境准备、依赖安装、模型加载、LangChain 配置、FastAPI 搭建接口、HTML 前端展示以及具体的运行步骤,并重点说明在 Windows 上可能遇到的注意事项(例如端口、防火墙、路径等)。

环境准备

  • 操作系统:Windows 10/11(本教程使用 Windows 环境)。
  • 硬件要求:建议具有至少 8GB 可用内存,以运行 7B 参数模型。模型文件约 4~5GB,需要足够的磁盘空间存储。
  • Python 环境:确保已安装 Python 3.9+。建议使用虚拟环境或 Anaconda 来管理依赖。

**安装 Ollama:**前往 Ollama 官方网站下载 Windows 版本的安装包(OllamaSetup.exe),直接运行安装。安装完成后,可按 Win+R 打开 CMD,输入命令 ollama 验证是否安装成功。

💡 **注意:**Ollama 默认安装在 %LOCALAPPDATA%\Programs\Ollama 目录,下载的模型默认保存在用户主目录下的 .ollama 文件夹。例如,默认安装路径为 C:\Users\<用户名>\AppData\Local\Programs\Ollama,模型存储路径为 C:\Users\<用户名>\.ollama。如需将模型文件存放到其他磁盘,可设置系统环境变量 OLLAMA_MODELS 为新的模型目录路径,并将已有模型文件迁移至该路径。

依赖安装

在配置好 Python 环境后,使用 pip 安装所需的 Python 包:

pip install langchain langchain-ollama fastapi \"uvicorn[standard]\"
  • langchain:LangChain 框架的核心库。
  • langchain-ollama:LangChain 对 Ollama 本地模型的集成支持库。
  • fastapi:用于构建后端 API 服务。
  • uvicorn[standard]:ASGI 服务器,用于运行 FastAPI 应用(standard 额外包含自动重载等功能)。

安装完成后,您即可通过 Python 导入上述库,准备构建应用。

模型下载与加载(Qwen 1.5-7B)

**关于 Qwen 模型:**Qwen(通义千问)是阿里巴巴云开源的一系列大型语言模型,参数规模从0.5B到110B不等。本教程使用的是 Qwen-7B(7亿5千万参数)的1.5版本模型,它支持中英文多语言,对话性能优异。我们将通过 Ollama 获取并加载该模型。

  1. 下载模型:打开命令行,运行以下命令拉取 Qwen1.5-7B 模型权重:

    ollama pull qwen:7b
    

    如果不使用 ollama pull,也可以直接运行模型,会在首次调用时触发下载,例如:

    ollama run qwen:7b
    

    该过程会从 Ollama 官方模型库下载约 4.2GB 的模型文件。下载速度取决于网络环境,首次下载可能需数分钟时间。

  2. 验证模型:模型下载完成后,执行 ollama list 可以列出已下载的模型,确认 qwen:7b 在列表中。然后,您可以通过命令行直接与模型交互测试,例如:

    ollama run qwen:7b
    

    进入模型对话后,输入一些中文/英文提问,模型应能返回回答(按 Ctrl+D 可退出会话)。

  3. 启动 Ollama 服务:要让我们编写的应用程序调用本地模型,需要启动 Ollama 的后端服务。在命令行中运行:

    ollama serve
    

    该服务将在后台加载 Qwen 模型并监听请求,默认监听本机 127.0.0.1 地址的端口 11434。请确保 不要关闭此终端窗口,保持服务持续运行。此时,我们就可以通过 Ollama 提供的本地 API 来调用模型。

⚠️ 端口与防火墙:Ollama 默认绑定在本机回环地址 127.0.0.1 的 11434 端口。一般情况下,无需特别开放防火墙设置即可在本机访问。如果您的环境启用了严格的防火墙策略或需要远程访问 Ollama 服务,可将环境变量 OLLAMA_HOST 设置为 0.0.0.0 并重启服务,以监听所有网络接口(同时注意配置防火墙放行该端口)。本教程后续步骤中,我们仅在本机上访问服务,所以使用默认设置即可。

LangChain 集成配置

在此部分,我们将利用 LangChain 将 Ollama 本地模型封装成一个对话机器人接口,并配置对话记忆,以实现多轮问答。LangChain 提供了专门的 OllamaLLM 类来对接 Ollama 服务,以及 ConversationChain 来管理对话状态。

首先,新建一个 Python 脚本文件(例如 main.py),引入必要的模块并初始化模型与对话链:

from langchain_ollama import OllamaLLM       # LangChain 对 Ollama 模型的封装
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory# 初始化本地 Ollama 模型(指定使用 Qwen-7B 模型)
llm = OllamaLLM(model="qwen:7b")  # 引用模型名称,与 ollama pull 时使用的名称一致# 构建对话链(ConversationChain)并设置记忆,用于存储多轮对话历史
memory = ConversationBufferMemory(memory_key="chat_history", input_key="question")  
conversation = ConversationChain(llm=llm, memory=memory)

在上述代码中,我们通过 OllamaLLM(model="qwen:7b") 加载了 Qwen-7B 模型作为 LangChain 的LLM接口。如果 Ollama 服务已启动且模型加载成功,那么此对象会连接到 Ollama 提供的本地 API(默认 http://localhost:11434)来处理后续请求。然后,我们创建了一个 ConversationChain 对象,并使用 ConversationBufferMemory 来存储对话历史,使机器人具备上下文记忆能力。这样每次提问时,历史对话都会传入模型,以生成与上下文一致的回复。

📝 说明:ConversationBufferMemory 会将对话记录在 memory.chat_history 中,LangChain 默认的对话链 Prompt 会将历史对话附加在新问题之前,从而实现连续对话的效果。

FastAPI 搭建后端接口

有了对话链 conversation,我们需要通过一个后端服务来接收前端问题请求并返回模型答案。这里我们使用 FastAPI 创建一个简单的 API 接口。

继续编辑 main.py,添加 FastAPI 应用代码:

from fastapi import FastAPI, Body
from fastapi.responses import JSONResponseapp = FastAPI()# 定义请求和响应数据模型(可选,也可直接在接口中解析)
# 在此简单场景下,直接在接口函数参数中使用 Body 提取字段
@app.post("/chat")
async def chat(question: str = Body(..., embed=True)):"""接收前端提交的问题,调用LLM对话链获取答案,并返回JSON响应。"""# 使用 LangChain 对话链生成回答answer = conversation.predict(input=question)  # 将回答包装成 JSON 格式返回return JSONResponse(content={"answer": answer})

上述代码创建了一个 FastAPI 应用实例,并定义了一个 POST 接口 /chat。该接口从请求体中解析出 question(通过 Body(..., embed=True) 表示请求 JSON 形如 {"question": "..."}),然后调用我们之前构建的 conversation 对象生成回答。结果通过 JSONResponse 返回给前端,格式为:{"answer": "模型回答内容"}

💡 **提示:**为了简单起见,我们直接返回了 JSON 字典。在实际应用中,可以使用 Pydantic 模型定义请求和响应的数据结构。本例中由于数据结构简单,直接提取和返回字符串即可。

此外,如果我们希望直接通过浏览器GET请求测试,也可以增加一个 GET 接口。例如:

@app.get("/chat")
async def chat_get(question: str):answer = conversation.predict(input=question)return {"answer": answer}
}

这样在开发调试时,可以通过访问 http://localhost:8000/chat?question=你的问题 快速查看回复。但最终前端将主要采用 POST 接口进行交互。

最后,为了方便起见,我们还可以让 FastAPI 提供网页端页面。在 FastAPI 中可以使用静态文件或模板来提供前端页面。这里我们简单地将前端 HTML 文件作为静态文件提供。假设我们有一个 index.html 文件放在与 main.py 相同的目录下,那么可以添加:

from fastapi.staticfiles import StaticFiles# 挂载当前目录下的 index.html 作为静态文件
app.mount("/", StaticFiles(directory=".", html=True), name="static")

这样,启动服务后,直接访问根路径 (http://localhost:8000/) 就会返回 index.html 文件的内容作为网页。如果不使用 FastAPI 提供页面,也可以手动打开 HTML 文件。本教程将提供示例 HTML 文件内容。

⚠️ **CORS 跨域注意:**如果选择直接用浏览器打开本地 HTML 文件(file://协议),浏览器的同源策略会阻止页面访问 http://localhost:8000 接口。这种情况下,需要在 FastAPI 中启用跨域支持。例如安装并引用 fastapi.middleware.cors.CORSMiddleware,允许 allow_origins=["*"] 等。为简化流程,本教程建议将 HTML 通过 FastAPI 提供(如上所示挂载静态文件),以确保前端与后端同源,无需额外配置 CORS。

前端 HTML 页面构建

前端我们只需一个简单的 HTML页面,包含一个提问输入框和用于显示回答的区域,并通过 JavaScript 调用后端 API 实现交互。在项目目录下新建文件 index.html,并填入以下内容:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8" /><title>本地 AI 问答机器人</title><style>body { font-family: Arial, sans-serif; margin: 2em; }#chat-log { width: 100%; height: 300px; border: 1px solid #ccc; padding: 5px; overflow-y: auto; }#question { width: 80%; }#send-btn { padding: 5px 10px; }.user-msg { color: #0000EE; }.bot-msg { color: #228B22; margin-bottom: 1em; }</style>
</head>
<body><h2>本地 AI 问答机器人</h2><div id="chat-log"></div><input type="text" id="question" placeholder="在此输入你的问题..." /><button id="send-btn">发送</button><script>const chatLog = document.getElementById('chat-log');const questionInput = document.getElementById('question');const sendBtn = document.getElementById('send-btn');// 将消息添加到聊天记录显示区function appendMessage(sender, text) {const msgDiv = document.createElement('div');msgDiv.className = sender === 'user' ? 'user-msg' : 'bot-msg';msgDiv.textContent = (sender === 'user' ? '🧑 用户: ' : '🤖 AI: ') + text;chatLog.appendChild(msgDiv);chatLog.scrollTop = chatLog.scrollHeight;  // 滚动到底部}// 发送请求获取 AI 回复async function sendQuestion() {const question = questionInput.value.trim();if (!question) return;appendMessage('user', question);questionInput.value = '';// 调用后端接口try {const response = await fetch('/chat', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ question: question })});const data = await response.json();if (data.answer) {appendMessage('bot', data.answer);} else {appendMessage('bot', '(无回答)');}} catch (error) {appendMessage('bot', '(请求失败,请检查后端服务是否启动)');console.error('Error:', error);}}sendBtn.addEventListener('click', sendQuestion);questionInput.addEventListener('keydown', event => {if (event.key === 'Enter') sendQuestion();});</script>
</body>
</html>

该 HTML 页面结构非常简单:顶部是一个显示聊天记录的 <div> (id="chat-log"),下面是一个输入框和发送按钮。样式部分对聊天记录区域进行了简单的滚动条设置,不是本教程重点。<script> 部分实现了核心的交互逻辑:
在这里插入图片描述

  • 当用户点击“发送”按钮或按下 Enter 键时,触发 sendQuestion() 函数。
  • 函数首先获取输入框中的问题文本,若非空则将其添加到聊天记录显示区(以“用户:”前缀显示蓝色文本)。
  • 然后通过 fetch('/chat', { method: 'POST', ... }) 调用我们后端 /chat 接口,将问题作为 JSON 发送。
  • 等待后端返回响应后,将其中的 answer 显示在聊天记录区(以“AI:”前缀显示绿色文本)。如果没有获得回答或请求出错,则显示相应的提示信息。

注意这里 fetch 的 URL /chat 没有包括域名部分,这是因为我们将 HTML 页面直接通过 FastAPI 静态服务挂载在根路径。同源策略下,页面会向同一主机(localhost:8000)发送请求。如果您没有使用 FastAPI 提供页面而是直接打开 HTML 文件,需要将 URL 改为 http://127.0.0.1:8000/chat 并设置 CORS,如前文所述。

运行与测试

完成以上代码后,我们已经准备好启动服务并进行测试了。请按照以下步骤操作:

  1. 确保 Ollama 服务已启动:在命令行窗口运行着 ollama serve。如果尚未启动,请先执行 ollama serve 并等待模型加载完毕(初次加载7B模型可能需要数十秒)。

  2. 启动 FastAPI 应用:在另一终端(或 PowerShell)中,进入项目代码所在目录,运行:

    uvicorn main:app --reload
    

    这将启动 FastAPI 应用,默认监听 http://127.0.0.1:8000(–reload 参数用于开发环境自动重载代码,可选)。首次启动时,Windows 防火墙可能弹出提示,询问是否允许 Python 访问网络。请选择“允许”(至少在私有网络),否则浏览器将无法访问接口。

  3. 访问前端界面:打开浏览器,访问 http://localhost:8000。若一切配置正确,应看到我们编写的问答界面。输入一个问题(例如:“今天天气怎么样?”),点击发送或按回车,稍等几秒即可看到 AI 的回复出现在对话窗口中。

  4. 效果示例:下图展示了一个简单的问答交互示意。其中用户提出问题,AI 模型(Qwen-7B)给出回答,实现了本地运行的问答功能:
    在这里插入图片描述
    图 :Qwen-7B 模型本地问答示例,对用户提问进行回答。

在图示对话中,用户询问了关于“小明”的问题,AI 模型根据上下文给出了回答。您可以尝试提出各种问题(中英文均可),感受 Qwen-7B 模型的回答能力。如果开启了多轮对话记忆,可以连续追问相关问题,模型将结合对话历史做出回复。

ℹ️ 提示:由于我们使用的是7B参数的模型,推理速度相对于更大模型会较快但仍需一些时间,请耐心等待回答输出。如果您觉得响应过慢或资源占用高,可以考虑尝试更小参数的模型(如 qwen:4b)或升级硬件配置。

Windows 平台注意事项

在 Windows 上部署本地大模型应用时,还需注意以下事项:

  • 路径与权限:如果您在非系统盘安装或移动了 Ollama 或模型文件夹,确保更新 PATH 和 OLLAMA_MODELS 环境变量指向正确的位置。运行 ollama 或加载模型时若出现找不到文件的情况,请检查这些环境变量配置是否生效。
  • 端口占用:默认情况下,Ollama 使用 11434 端口,FastAPI 使用 8000 端口。若启动服务时报端口占用错误,可能是已有其他服务在运行。您可以修改使用的端口:Ollama 可通过设置 OLLAMA_HOST 环境变量来改变端口(例如 OLLAMA_HOST=127.0.0.1:11435 来使用11435端口),FastAPI 则可以用命令行参数指定,如 uvicorn main:app --port 8001 改用其他端口。
  • 防火墙:如前所述,在首次运行 uvicorn 时,Windows 防火墙可能会阻止访问。如需在本机浏览器访问,请允许 Python 通过防火墙。若您计划在局域网内其他设备访问该服务,则需要将 FastAPI 服务绑定到 0.0.0.0(例如运行 uvicorn main:app --host 0.0.0.0)并在防火墙中开放相应端口。
  • WSL 的替代方案:本教程基于 Windows 原生的 Ollama 安装。如果您无法使用 Windows 原生版本(例如因为兼容性问题),也可以考虑在 WSL2 子系统或 Docker 中运行 Ollama 服务。原理上使用 WSL 与直接在 Linux 下部署类似,但需要处理好 WSL 的网络访问(可通过 localhost 直接访问 WSL 服务)及文件映射等。本地开发中,优先推荐使用官方提供的 Windows 版本以减少复杂性。

总结

通过以上步骤,我们成功在 Windows 平台上搭建了一个本地运行的 AI 问答机器人。我们使用 Ollama 管理模型,加载了阿里巴巴的 Qwen-7B 大模型,通过 LangChain 封装对话链路,利用 FastAPI 提供后端服务,再结合简单的 HTML+JS 前端实现了人机问答界面。整个应用完全在本地运行,所有数据和模型推理均在自己的计算机上完成。

本教程所展示的是一个基础范例,读者可以在此基础上进行扩展,例如:引入更复杂的Prompt模板以优化对话效果,或结合本地知识库/向量数据库实现文档问答,还可以使用更强大的本地模型替换 Qwen-7B。如果对多轮对话中的长对话历史性能有要求,也可以考虑使用 LangChain 提供的总结记忆等策略来压缩历史记录。

希望本教程对您搭建本地 AI 应用有所帮助。现在,您可以尽情与这个本地问答机器人交流,体验无需联网也能获得智能问答的乐趣!如果在操作过程中遇到问题,可以参考本文中的引用资料获取更多信息,或查阅相关文档以寻求支持。祝您使用愉快!

参考资料:

  • LangChain 官方文档 – Ollama 集成
  • Ollama 模型库 – Qwen 1.5-7B 模型介绍
  • CSDN 博客 – Windows 下部署 LangChain + Ollama 本地大模型实战经验
  • Dify 开发文档 – Ollama 模型部署与网络访问FAQ
http://www.dtcms.com/a/282988.html

相关文章:

  • AI对话聊天与桌宠工具调研报告
  • 【案例分享】基于FastCAE-Acoustics软件对车门进行噪声预测
  • 移动平板电脑安全管控方案
  • 祥云系统开源云商城程序全开源版 个人程序云商城(源码下载)
  • 前端学习7:CSS过渡与动画--补间动画 (Transition) vs 关键帧动画 (Animation)
  • xss-lab1-8关
  • AdsPower 功能详解 | 应用中心使用指南:插件统一管理更高效、更安全!
  • [NOIP][C++] 树的重心
  • 精彩代码分析-1
  • 深入探讨机器学习中的过拟合:从VC维到正则化的贝叶斯视角
  • Alamofire 网络请求全流解析,通俗易懂
  • 降本增效利器:汽车制造中EtherCAT转PROFIBUS DP网关应用探析
  • Linux权限管理:玩转root与用户组
  • 前端 oidc-client 静默刷新一直提示:Error: Frame window timed out 问题分析与解决方案
  • 前端上传 各类 文件 ,前端自己解析出来 生成界面 然后支持编辑(增强版 支持大多数文件格式的在线编辑)
  • React Native 在 Web 前端跨平台开发中的优势与实践
  • Windows下编译pthreads
  • vue-router 导航式编程 参数的设置
  • 优学教育官网搭建02课程中心
  • vscode Cline接入火山引擎的Deepseek R1
  • 项目资源预算分散,如何实现协同整合?
  • orfeotoolbox ResetMargin
  • 《小白学习产品经理》第五章:方法论之波士顿矩阵
  • Linux中的GDB的作用与GCC的区别
  • 设计一款用于捕捉动态产品视频的摄像机器人
  • 《透视定轴:CSS 3D魔方中视觉层级的秩序法则》
  • Linux下操作SQL SERVER
  • sqli-labs通关笔记-第03关 GET字符型注入(单引号括号闭合 手工注入+脚本注入两种方法)
  • github上传大文件
  • 2025 Python3 网络编程 Socket编程详解