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

本地 LLM API Python 项目分步指南

分步过程

 需要Python 3.9 或更高版本。

安装 Ollama 并在本地下载 LLM

根据您的操作系统,您可以从其网站下载一个或另一个版本的 Ollama 。下载并启动后,打开终端并输入以下命令:

ollama run llama3

此命令将在本地拉取(下载)Llama 3 LLM——默认情况下,下载的模型在llama3:latest撰写本文时被引用。请注意,首次下载时,需要一些时间才能完全下载,这主要取决于您的网络连接带宽。完全拉取后,对话助手将自动在终端中启动,您可以在其中开始交互。 

不过请注意,我们将采用不同的方法,并展示构建基于 Python 的本地 LLM API 的基本步骤。为此,让我们切换到我们的 IDE。

在 VS Code(或其他 IDE)中创建 Python 项目

假设您正在使用 VS Code(如果使用其他 IDE,则可能需要采取稍微不同的操作),请在文件目录中创建一个名为“local-llm-api”或类似的新项目文件夹。

在该文件夹中,我们将创建两个文件,分别名为“main.py”和“requirements.txt”。现在让我们将Python文件留空,然后将以下内容添加到“requirements.txt”文件并保存更改:

fastapi
uvicorn
requests

使用本地 LLM 时,建议设置虚拟环境,因为它可以隔离依赖项,防止库版本之间的冲突,并保持整体开发环境整洁。在 VS Code 中,您可以通过以下方式执行此操作:

  • 按Command + Shift + P打开命令面板。
  • 键入或选择Python:Create Environment,然后键入或选择Venv
  • 选择合适的Python版本(我选择了Python 3.11)。
  • 现在应该提示您选择之前创建的“requirements.txt”文件来安装列出的依赖项,这至关重要,因为我们的 Python 程序需要 FastAPI、Uvicorn 和 Requests。

如果最后一步不起作用,请尝试在IDE的终端上运行:

pip install fastapi uvicorn requests
主 Python 程序

让我们回到之前创建的空的“main.py”文件,并添加以下代码:

from fastapi import FastAPI
from pydantic import BaseModel
import requests
import json
import uvicorn
import os # Added for environment variable usage
 
app = FastAPI()
 
class Prompt(BaseModel):
    prompt: str
 
@app.post("/generate")
def generate_text(prompt: Prompt):
    try:
        # Use environment variables for host and model, with fallbacks
        ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11434")
        ollama_model = os.getenv("OLLAMA_MODEL", "llama3:latest")
 
        response = requests.post(
            f"{ollama_host}/api/generate", # f-string for host
            json={"model": ollama_model, "prompt": prompt.prompt}, # Use ollama_model
            stream=True,
            timeout=120  # Give model time to respond
        )
        response.raise_for_status() # Raise an exception for HTTP errors (4xx or 5xx)
 
        output = ""
        for line in response.iter_lines():
            if line:
                data = line.decode("utf-8").strip()
                if data.startswith("data: "):
                    data = data[len("data: "):]
                if data == "[DONE]":
                    break
                try:
                    chunk = json.loads(data)
                    output += chunk.get("response") or chunk.get("text") or ""
                except json.JSONDecodeError:
                    print(f"Warning: Could not decode JSON from line: {data}") # Added for debugging
                    continue
 
        return {"response": output.strip() or "(Empty response from model)"}
 
    except requests.RequestException as e:
        return {"error": f"Ollama request failed: {str(e)}"}
 
if __name__ == "__main__":
    # For development, reload=True can be useful. For production, use reload=False.
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=False)
  • app = FastAPI()创建由 REST 服务提供支持的 Web API,一旦执行 Python 程序,它将使用本地 LLM 开始监听并提供请求(提示)。
  • class Prompt(BaseModel): prompt: str创建 JSON 输入模式,以便我们可以引入 LLM 的提示。
  • @app.post("/generate")def generate_text(prompt: Prompt):定义利用 API 端点发送提示和获取模型响应的函数。
  • 以下代码至关重要: 
    response = requests.post(
        "http://localhost:11434/api/generate",
        json={"model": "llama3:latest", "prompt": prompt.prompt},
        stream=True,
        timeout=120
    )

    它将提示发送到 Ollama 获取的指定本地 LLM。重要的是,在这里你必须确保模型名称在你下载的模型名称中(在我的情况下是)。你可以在终端中"llama3:latest"输入命令来检查机器上下载的本地模型的名称。
  • 最后,此代码读取流响应并以清晰的格式返回。
for line in response.iter_lines():
    ...
    chunk = json.loads(data)
    output += chunk.get("response") or chunk.get("text") or ""
 
return {"response": output.strip()}

运行和测试 API

保存 Python 文件后,点击“运行”图标或python main.py在终端中运行。你应该会在 IDE 的输出中看到类似这样的内容:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

这意味着一件事:REST 服务器已启动并正在运行,并且可以通过  http://127.0.0.1:8000/docs访问该服务。在浏览器上打开此 URL,如果一切顺利,您将看到如下所示的 FastAPI 文档界面:

本地 LLM API 的 FastAPI 文档接口

你离获得本地法学硕士(LLM)学位已经不远了:太令人兴奋了!在显示的界面中,点击方框旁边的箭头POST/generate将其展开,然后点击“试用”按钮。

输入你选择的提示符,向 LLM 提出一些问题。你必须使用专用的 JSON 格式参数值来执行此操作,如下所示,通过替换默认提示符:"string"。例如:

输入提示

点击“执行”按钮后,几秒钟后你可以通过稍微向下滚动来获得响应:

本地法学硕士回应

恭喜,您已设置好自己的本地 LLM API! 
 


文章转载自:
http://attributable.kjawz.cn
http://axolotl.kjawz.cn
http://awful.kjawz.cn
http://cheechako.kjawz.cn
http://cathole.kjawz.cn
http://choochoo.kjawz.cn
http://appal.kjawz.cn
http://blowmobile.kjawz.cn
http://anhistous.kjawz.cn
http://carucate.kjawz.cn
http://carack.kjawz.cn
http://anthropometry.kjawz.cn
http://caffeic.kjawz.cn
http://ail.kjawz.cn
http://backrest.kjawz.cn
http://cassaba.kjawz.cn
http://catalectic.kjawz.cn
http://autoregulation.kjawz.cn
http://chastise.kjawz.cn
http://androcracy.kjawz.cn
http://chondritic.kjawz.cn
http://cholagogue.kjawz.cn
http://agalite.kjawz.cn
http://achromobacter.kjawz.cn
http://apaprthotel.kjawz.cn
http://busman.kjawz.cn
http://ccsa.kjawz.cn
http://caftan.kjawz.cn
http://bestraddle.kjawz.cn
http://avventurina.kjawz.cn
http://www.dtcms.com/a/280510.html

相关文章:

  • 20250715给荣品RD-RK3588开发板刷Android14时打开USB鼠标
  • Android 获取 UserAgent (UA) 的三种方式深度解析:差异、风险与最佳实践
  • Hystrix与Resilience4j在微服务熔断降级中的应用对比与实战
  • 用 K-means 算法实现水果分堆
  • 《大数据技术原理与应用》实验报告四 MapReduce初级编程实践
  • 多网卡环境下访问跨网段设备的排查与配置指南
  • iOS高级开发工程师面试——关于网络
  • Python:消息队列(RabbitMQ)应用开发实践
  • 【C#地图显示教程:实现鼠标绘制图形操作】
  • 开通保存图片权限
  • 如何设计实现开发自助重启工具-01-设计篇
  • eVTOL分布式电推进(DEP)适航审定探究
  • Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案
  • 【橘子分布式】Thrift RPC(编程篇)
  • 亚矩阵云手机:破解 Yandex 广告平台多账号风控难题的利器
  • Redis学习系列之——高并发应用的缓存问题(二)
  • JDK1.8函数式编程实战(附日常工作案例,仅此一篇耐心看完彻底搞懂)
  • 17、鸿蒙Harmony Next开发:状态管理(组件拥有的状态和应用拥有的状态)
  • Vue获取上传Excel文件内容并展示在表格中
  • 【人工智能99问】神经网络的工作原理是什么?(4/99)
  • 使用Pydantic开发时,如何将返回数据由snake_case自动转为camel case
  • Mac IDEA启动报错:Error occurred during initialization of VM
  • Linux操作系统从入门到实战(九)Linux开发工具(中)自动化构建-make/Makefile知识讲解
  • ubuntu部署kvm
  • AI-Compass LLM训练框架生态:整合ms-swift、Unsloth、Megatron-LM等核心框架,涵盖全参数/PEFT训练与分布式优化
  • 正则表达式深度解析:从LeetCode 3136题说起
  • 028_分布式部署架构
  • OpenCV图像自动缩放(Autoscaling)函数autoscaling()
  • 2025.7.15总结
  • 用Python构建机器学习模型预测股票趋势:从数据到部署的实战指南