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

《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务

《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务(上)

摘要:

在 FastAPI 和 OLLAMA 架构中实现高并发 AI 推理服务,并优化性能指标采集和缓存策略,可以充分利用 asyncio 的异步 I/O 操作来提升吞吐量和响应速度。以下是一个详细的解决方案,分为基础实现架构概述、实现步骤、性能指标采集、结合 FastAPI 和 OLLAMA、优化方案详细实现(批量推理、负载均衡、动态缓存失效、监控与告警)几个关键部分进行说明,本文章末提供了一个小型博客网站实现高并发推理的案例设计思路,本文章分为上中下三个系列组成,文章系列(中)将介绍具体网站实践,文章系列(下)将介绍高并发网站性能测试和监控的实现。


一、基础方案和优化方法:

1. 架构概述

  • FastAPI: 提供高性能的异步 Web 框架,支持异步请求处理。
  • OLLAMA: 假设它是一个 AI 推理引擎(例如基于 LLM 的推理服务),可以通过 API 或库调用进行交互。
  • Asyncio: 用于管理异步任务,确保 I/O 密集型操作(如网络请求、数据库访问等)不会阻塞主线程。
  • 缓存策略: 使用内存缓存(如 Redis 或 functools.lru_cache)存储频繁使用的推理结果,减少重复计算。
  • 性能指标采集: 利用异步任务记录性能数据(如请求耗时、错误率等),并将其汇总到监控系统。

在这里插入图片描述

2. 实现步骤

(1) 异步推理调用

使用 asyncio 实现对 OLLAMA 推理服务的异步调用。假设 OLLAMA 提供了一个 HTTP API,可以使用 httpx 库(支持异步请求)与之交互。

import httpx
from fastapi import FastAPI, Dependsapp = FastAPI()# 假设 OLLAMA 的推理服务地址
OLLAMA_API_URL = "http://ollama-service:8000/inference"async def call_ollama(prompt: str):async with httpx.AsyncClient() as client:response = await client.post(OLLAMA_API_URL,json={"prompt": prompt},timeout=30.0)response.raise_for_status()  # 确保请求成功return response.json()

(2) 缓存策略

为了减少重复推理的计算开销,可以引入缓存机制。以下是两种常见的缓存方式:

  • 内存缓存(适合小规模应用):
    使用 functools.lru_cacheaiocache 库实现简单的内存缓存。
from functools import lru_cache@lru_cache(maxsize=128)
def cached_inference(prompt: str):# 这里假设推理是同步的,如果是异步的,需要调整逻辑return call_ollama_sync(prompt)async def call_ollama_with_cache(prompt: str):# 异步包装同步缓存调用return await asyncio.to_thread(cached_inference, prompt)
  • 分布式缓存(适合大规模应用):
    使用 Redis 作为分布式缓存,利用 aioredis 库实现异步操作。
import aioredisredis = aioredis.from_url("redis://localhost")async def call_ollama_with_redis_cache(prompt: str):cache_key = f"inference:{prompt}"result = await redis.get(cache_key)if result:return result.decode("utf-8")  # 缓存命中# 缓存未命中,调用推理服务result = await call_ollama(prompt)await redis.setex(cache_key, 3600, result)  # 缓存1小时return result

(3) 性能指标采集

通过中间件或后台任务记录性能指标,例如请求耗时、成功率等。

  • 中间件记录请求耗时
    在 FastAPI 中添加一个中间件,记录每个请求的处理时间。
import time
from fastapi import Request, Response@app.middleware("http")
async def add_process_time_header(request: Request, call_next):start_time = time.time()response: Response = await call_next(request)process_time = time.time() - start_timeresponse.headers["X-Process-Time"] = str(process_time)return response
  • 后台任务采集指标
    使用 asyncio.create_task 定期将性能数据发送到监控系统(如 Prometheus 或 Datadog)。
import asynciometrics_queue = asyncio.Queue()async def metrics_collector():while True:metric = await metrics_queue.get()# 将 metric 发送到监控系统print(f"Collected Metric: {metric}")metrics_queue.task_done()# 启动后台任务
@app.on_event("startup")
async def startup_event():asyncio.create_task(metrics_collector())

(4) 结合 FastAPI 和 OLLAMA

将上述组件整合到 FastAPI 中,提供一个完整的高并发推理接口。

@app.post("/infer")
async def infer(prompt: str):start_time = time.time()# 调用推理服务(带缓存)try:result = await call_ollama_with_redis_cache(prompt)status = "success"except Exception as e:result = {"error": str(e)}status = "failure"process_time = time.time() - start_time# 记录性能指标await metrics_queue.put({"prompt": prompt,"status": status,"process_time": process_time})return result

3. 优化建议

(1) 批量推理

如果多个请求可以合并为一个批量推理请求(Batch Inference),可以显著提高吞吐量。例如,累积一定数量的请求后一次性发送给 OLLAMA。

(2) 负载均衡

在高并发场景下,部署多个实例并通过负载均衡器(如 Nginx 或 Kubernetes Service)分发流量。

(3) 动态缓存失效

对于时效性要求较高的数据,可以设置动态缓存失效策略。例如,根据数据更新频率自动刷新缓存。

(4) 监控与告警

结合 Prometheus 和 Grafana,实时监控服务性能,并设置告警规则(如请求失败率超过阈值)。


4. 总结

通过上述方法,我们可以实现一个高效的 FastAPI + OLLAMA 高并发推理服务:

  • 利用 asyncio 和异步库(如 httpxaioredis)提升 I/O 性能。
  • 通过缓存策略减少重复计算,降低延迟。
  • 使用中间件和后台任务采集性能指标,持续优化服务。

这种架构不仅能够满足高并发需求,还能通过缓存和性能监控进一步提升用户体验和系统稳定性。

二、完整实例代码:个人博客

以下是一个完整的个人博客 Flask 网站设计方案,结合了 FastAPI 和 OLLAMA 架构中的高并发 AI 推理服务技术(包括批量推理、负载均衡、动态缓存失效、监控与告警)。这个方案将分为以下几个部分:


1. 项目结构

项目的文件框架如下:

personal_blog/
├── app/                     # Flask 应用代码
│   ├── __init__.py          # 初始化 Flask 应用
│   ├── routes.py            # 博客路由
│   ├── models.py            # 数据库模型
│   ├── ai_service.py        # AI 推理服务集成
│   ├── cache.py             # 缓存逻辑
│   └── metrics.py           # 性能指标采集
├── static/                  # 静态资源
│   ├── css/                 # 样式表
│   ├── js/                  # JavaScript 文件
│   └── images/              # 图片资源
├── templates/               # 模板文件
│   ├── base.html            # 基础模板
│   ├── index.html           # 首页
│   ├── post.html            # 博客文章页面
│   └── ai_response.html     # AI 推理结果页面
├── migrations/              # 数据库迁移文件
├── requirements.txt         # Python 依赖
├── run.py                   # 启动脚本
└── README.md                # 项目说明文档

2. 技术栈

  • 前端: HTML + CSS + JavaScript(Bootstrap 或 TailwindCSS 可选)
  • 后端: Flask(主框架) + FastAPI(AI 推理服务)
  • 数据库: SQLite(小型项目适用)或 PostgreSQL(生产环境推荐)
  • 缓存: Redis(动态缓存失效)
  • 监控: Prometheus + Grafana
  • 负载均衡: Nginx 或 Kubernetes Service(可选)

3. 详细实现

(1) Flask 应用初始化

app/__init__.py 中初始化 Flask 应用,并集成数据库和缓存。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import aioredis# 初始化 Flask 应用
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化数据库
db = SQLAlchemy(app)# 初始化 Redis 缓存
redis = aioredis.from_url("redis://localhost")# 导入路由
from app.routes import *# 创建数据库表
with app.app_context():db.create_all()

(2) 数据库模型

app/models.py 中定义博客文章的数据库模型。

from . import dbclass Post(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)created_at = db.Column(db.DateTime, default=db.func.current_timestamp())

(3) 路由和视图

app/routes.py 中定义博客的路由和视图函数。

from flask import render_template, request, redirect, url_for
from .models import Post
from .ai_service import call_ollama_with_cache
from .cache import redis@app.route('/')
def index():posts = Post.query.order_by(Post.created_at.desc()).all()return render_template('index.html', posts=posts)@app.route('/post/<int:post_id>')
def view_post(post_id):post = Post.query.get_or_404(post_id)return render_template('post.html', post=post)@app.route('/create', methods=['GET', 'POST'])
def create_post():if request.method == 'POST':title = request.form['title']content = request.form['content']new_post = Post(title=title, content=content)db.session.add(new_post)db.session.commit()return redirect(url_for('index'))return render_template('create_post.html')@app.route('/ai-inference', methods=['POST'])
async def ai_inference():prompt = request.form['prompt']result = await call_ollama_with_cache(prompt)return render_template('ai_response.html', result=result)

(4) AI 推理服务

app/ai_service.py 中实现 FastAPI 的高并发 AI 推理服务集成。

批量推理
import asyncio
from collections import defaultdict
import httpxBATCH_SIZE = 10
BATCH_TIMEOUT = 2
OLLAMA_API_URL = "http://ollama-service:8000/inference"
batch_queue = asyncio.Queue()
batch_results = defaultdict(asyncio.Future)async def batch_inference_worker():while True:batch_prompts = []try:while len(batch_prompts) < BATCH_SIZE:prompt, future = await asyncio.wait_for(batch_queue.get(), timeout=BATCH_TIMEOUT)batch_prompts.append(prompt)batch_results[prompt] = futureexcept asyncio.TimeoutError:passif batch_prompts:results = await call_ollama_batch(batch_prompts)for prompt, result in zip(batch_prompts, results):batch_results[prompt].set_result(result)async def call_ollama_batch(prompts: list):async with httpx.AsyncClient() as client:response = await client.post(OLLAMA_API_URL,json={"prompts": prompts},timeout=30.0)response.raise_for_status()return response.json()["results"]
Redis 动态缓存失效
async def call_ollama_with_cache(prompt: str):cache_key = f"inference:{prompt}"result = await redis.get(cache_key)if result:return result.decode("utf-8")result = await call_ollama(prompt)ttl = calculate_ttl(prompt)await redis.setex(cache_key, ttl, result)return resultdef calculate_ttl(prompt: str) -> int:if "urgent" in prompt.lower():return 60return 3600

(5) 监控与告警

app/metrics.py 中集成 Prometheus。

from prometheus_client import Counter, Histogram, start_http_serverREQUEST_COUNT = Counter("request_count", "Total number of requests", ["status"])
REQUEST_LATENCY = Histogram("request_latency_seconds", "Request latency in seconds")@app.before_request
def before_request():request.start_time = time.time()@app.after_request
def after_request(response):process_time = time.time() - request.start_timestatus = "success" if response.status_code < 400 else "failure"REQUEST_COUNT.labels(status=status).inc()REQUEST_LATENCY.observe(process_time)return responsestart_http_server(8001)

(6) 静态资源与模板

templates/static/ 中提供前端页面和静态资源。

示例模板 (base.html)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Personal Blog</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><header><h1>My Personal Blog</h1></header><main>{% block content %}{% endblock %}</main>
</body>
</html>

4. 启动与部署

(1) 启动脚本

run.py 中启动 Flask 应用。

from app import appif __name__ == '__main__':app.run(debug=True)
(2) 部署建议
  • 使用 Gunicorn 启动 Flask 应用:gunicorn -w 4 app:app
  • 配置 Nginx 作为反向代理和负载均衡器。
  • 部署 Prometheus 和 Grafana 进行性能监控。

5. 总结

通过上述设计,我们实现了一个完整的个人博客网站,集成了高并发 AI 推理服务(FastAPI + OLLAMA),并实现了批量推理、动态缓存失效、监控与告警等优化方案。这种架构不仅功能强大,还能满足高并发需求,适合中小型博客应用。

相关文章:

《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务

《Python Web部署应知应会》No2&#xff1a;如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务&#xff08;上&#xff09; 摘要&#xff1a; 在 FastAPI 和 OLLAMA 架构中实现高并发 AI 推理服务&#xff0c;并优化性能指标采集和缓存策略&#xff0c;可以充分利用 asy…...

【LeetCode 题解】算法:8.字符串转换整数(atoi)

一、问题描述 在 LeetCode 的算法题库里&#xff0c;有这样一道题目&#xff0c;要求我们实现一个名为 myAtoi(string s) 的函数&#xff0c;其功能是将给定的字符串转换为一个 32 位有符号整数。具体的转换规则如下&#xff1a; 处理步骤 剔除前导空格&#xff1a;读取字符串…...

Uni-app页面信息与元素影响解析

获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…...

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…...

《云原生安全攻防》-- K8s容器安全:权限最小化与SecurityContext

一旦容器被入侵&#xff0c;攻击者就可以获取到容器的权限&#xff0c;所以&#xff0c;容器运行过程中&#xff0c;我们首先需要考虑的是容器的权限问题。 在本节课程中&#xff0c;我们将重点介绍权限最小化以及如何使用SecurityContext来管理容器的权限。 在这个课程中&…...

uniapp中的流式输出

一、完整代码展示 目前大多数的ai对话都是流式输出&#xff0c;也就是对话是一个字或者多个字逐一进行显示的下面是一个完整的流式显示程序&#xff0c;包含的用户的消息发出和ai的消息回复 <template><view class"chat-container"><view class&quo…...

PipeWire 音频设计与实现分析一——介绍

PipeWire 是一个基于图的媒体处理引擎&#xff0c;一个可以运行多媒体节点图的媒体服务器&#xff0c;是 Linux 的音频/视频总线&#xff0c;它管理 Linux 系统中&#xff0c;不同应用程序对音频和视频设备的共享访问。它提供了一个本地客户端音频 API&#xff0c;但也提供兼容…...

MVC 文件夹:架构之美,开发之魂

MVC 文件夹&#xff1a;架构之美&#xff0c;开发之魂 引言 在软件开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式已经成为了一种广泛应用的架构设计理念。它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图…...

IO模型之于并发编程模型、并发模型之于架构模式

一、并发编程模型主要包括以下几种‌&#xff1a; ‌多进程模型‌&#xff1a;利用操作系统的进程模型来实现并发。每个用户请求接入时都会创建一个进程&#xff0c;适用于I/O密集型任务。缺点是创建进程的开销高&#xff0c;且上下文切换的开销也大。典型应用如Apache Web Ser…...

Postman 7.3.5 旧版下载指南(Win64)及注意事项

Postman-win64-7.3.5-Setup 是 Postman 的一个旧版本&#xff08;2019年发布&#xff0c;适用于 Windows 64位系统&#xff09;。以下是相关信息和建议&#xff1a; 1. Postman 7.3.5 版本说明 功能&#xff1a;用于 API 开发、测试和协作。 系统要求&#xff1a;Windows 64位…...

​Flink/Kafka在python中的用处

一、基础概念 1. ​Apache Kafka 是什么&#xff1f; ​核心功能&#xff1a;Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据管道和流式应用程序。​核心概念&#xff1a; ​生产者&#xff08;Producer&#xff09;​&#xff1a;向 Kafka 发送数据的程序。…...

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章&#xff1a;经过前九篇 [【深度 Mape 系列】] 的系统学习…...

轻松理解Python装饰器:从基础到应用

一、为什么需要装饰器 想象一下&#xff0c;你写了很多函数来完成不同的任务&#xff0c;突然有个新需求&#xff1a;在每个函数执行前打印一条“函数开始执行”的消息&#xff0c;执行后打印“函数执行结束”。如果没有装饰器&#xff0c;你就得在每个函数里手动添加这两条打…...

RabbitMQ 技术详解:异步消息通信的核心原理与实践

这里写目录标题 RabbitMQ 技术详解&#xff1a;异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置&#xff08;Maven&#xff09;2. 消…...

MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性

目录 一&#xff0c;多表查询的分类 角度1&#xff1a;等值连接 vs 非等值连接 角度2&#xff1a;自连接 vs 非自连接 角度3&#xff1a;内连接 vs 外连接 二&#xff0c;SQL92语法实现内连接&#xff1a;见上&#xff0c;略SQL92语法实现外连接&#xff1a;使用 -…...

Selenium文件上传

在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...

getID3获取本地或远程视频时长

音频文件也可使用&#xff0c;使用ffmeg安装太复杂了 附ffmpeg方式&#xff1a;centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...

OpenAI流式解析

OpenAI 流式的代码&#xff1a; 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数&#xff0c;用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下&#xff0c;load_…...

在Trae中设置Python解释器版本

Python 是一种广泛使用的高级编程语言&#xff0c;因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展&#xff0c;多个版本相继发布&#xff0c;每个版本都带来了新特性和改进。然而&#xff0c;这也带来了一些问题&#xff0c;比如不同的工程&#xff0c;需要…...

第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes

优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题&#xff08;每题至少2个正确答案&#xff09;二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点&#xff1a;动态内存分配需要调用…...

图像数据增强教程:为目标检测任务准备数据

目录 一、简介 二、代码结构 三、环境要求 四、数据增强类 4.1 调整增强概率和参数 4.2 增强方法参数 五、数据增强主函数 六、主函数 效果展示 完整代码 一、简介 在目标检测任务中&#xff0c;数据增强是一种关键技术&#xff0c;通过对原始图像应用多种变换来增加…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具&#xff0c;帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API&#xff0c;或者叫做一个工具类&#xff0c;包含一系列静态…...

HarmonyOS WebSocket全场景应用开发深度解析

注&#xff1a;适用版本&#xff08;Harmony OS NEXT / 5.0 / API 12 &#xff09; 一、最终效果预览 二、基础代码结构 Entry Component struct ChatApp {State messages: Message[] [] // 所有聊天记录State inputText: string "" // 输入框内容State isCon…...

JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测

JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验&#xff01;HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...

ubuntu 安装 postgresql

在 Ubuntu 系统中安装 PostgreSQL 的步骤如下&#xff1a; 步骤 1&#xff1a;更新软件包列表 sudo apt update步骤 2&#xff1a;安装 PostgreSQL Ubuntu 默认仓库包含 PostgreSQL&#xff0c;直接安装&#xff1a; sudo apt install postgresql postgresql-contrib -ypost…...

深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API

深入实践&#xff1a;基于WebSocket的全球化金融数据实时对接方案 在全球金融市场中&#xff0c;实时数据的高效获取与处理是量化交易、行情监控等场景的核心能力。本文将以技术实践为核心&#xff0c;详细解析如何通过WebSocket技术实现美国、印度、马来西亚等多国金融数据&a…...

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…...

Linux: 进程间通信

目录 一 前言 二 进程间通信目的 三 进程间通信方法 四 管道通信 1. 进程如何通信 2.管道概念 2.1匿名管道 2.2 匿名管道对多个进程的控制 2.3 命名管道 2.4 命名管道原理 一 前言 在我们学习进程的时候&#xff0c;我们知道正是因为程序地址空间的存在&#xff…...

为什么idea显示数据库连接成功,但操作数据库时,两边数据不同步

今日份小bug又叕又来了&#xff01; 一、原因分析 1. 未提交的事务 - IDEA 中执行了修改操作但未提交事务 - 其他客户端有未提交的修改 2. 连接隔离级别问题 - 不同连接使用了不同的事务隔离级别 - 读未提交(READ UNCOMMITTED)导致看到未提交数据 3. 多客户端同时操作…...

VMware中新建Ubuntu虚拟机系统,并安装Anaconda

详细介绍 Ubuntu18.04版本的安装Anaconda的安装 Ubuntu20.04版本的安装给出其他参考 安装Ubuntu18.04 新建虚拟机 如果不习惯图文形式的&#xff0c;也可参考该up主的环境安装分享&#xff0c;和我如下记录有些不同&#xff0c;但不影响&#xff0c;大部分均一致。 …...

LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板

LangChain 基础系列之 Prompt 工程详解&#xff1a;从设计原理到实战模板 一、揭开 LangChain 的 “灵魂引擎”&#xff1a;Prompt 的核心作用 在 LangChain 构建的智能应用中&#xff0c;Prompt&#xff08;提示词&#xff09;堪称驱动大模型的 “神经中枢”。这个承载着任务…...

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…...

unity客户端面试高频2(自用)

标题是我 1.构造函数为什么不能为虚函数&#xff1f;析构函数为什么要虚函数&#xff1f;2.C智能指针3.左值和右值完美转发 4.深拷贝与浅拷贝5.malloc VS new 你们知道吗 1.构造函数为什么不能为虚函数&#xff1f;析构函数为什么要虚函数&#xff1f; 构造函数不能定义为虚函…...

【12】Ajax的原理和解析

一、前言 二、什么是Ajax 三、Ajax的基本原理 3.1 发送请求 3.2 解析内容 3.3 渲染网页 3.4 总结 四、Ajax 分析 五、过滤请求-筛选所有Ajax请求 一、前言 当我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能会和在浏览器中看到的不一样&a…...

深度学习在测距模型中的应用

一、单目视觉测距和双目视觉测距简介 1、单目视觉测距 模型&#xff1a;深度估计&#xff08;Depth Estimation&#xff09; 原理&#xff1a;通过深度学习模型&#xff08;如MonoDepth2、MiDaS&#xff09;或传统的计算机视觉方法&#xff08;如单目相机结合物体大小推断&am…...

Python np.vectorize函数介绍

np.vectorize 是 NumPy 提供的一个 用于将标量函数(scalar function)向量化 的工具,使其可以作用于 NumPy 数组,类似于 通用函数(ufunc) 的行为。 1️⃣ np.vectorize 语法 numpy.vectorize(pyfunc, otypes=None, signature=None, excluded=None, cache=False)📌 参数…...

HarmonyOS NEXT状态管理实践

在HarmonyOS NEXT开发中&#xff0c;状态管理是构建高效、响应式应用的核心。本文深入探讨状态管理的最佳实践&#xff0c;结合代码示例与案例分析&#xff0c;帮助开发者掌握这一关键技能。 一、状态管理装饰器的合理使用 HarmonyOS NEXT提供多种状态管理装饰器&#xff0c;…...

广告牌变“高空炸弹“?智能预警终端筑起安全防线!

近年来&#xff0c;随着城市发展步伐加快&#xff0c;广告牌已成为城市形象的重要载体。但与此同时&#xff0c;因设计缺陷、违规搭建、维护缺失等问题导致的广告牌坠落事故频发&#xff0c;给市民生命财产安全带来严重威胁。据不完全统计&#xff0c;我国2000万块户外广告牌中…...

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…...

Redis 单线程

Redis 读写是否是单线程&#xff1f; 核心数据操作仍然是单线程 Redis 主要采用 单线程执行命令&#xff0c;这是因为&#xff1a; 避免加锁&#xff1a;如果多个线程并发修改数据&#xff0c;就需要加锁&#xff0c;而 Redis 采用单线程保证操作的原子性&#xff0c;无需加…...

Node.js 下载安装及环境配置教程、卸载删除环境配置超详细步骤(附图文讲解!) 从零基础入门到精通,看完这一篇就够了

Node.js 安装 一、进入官网地址下载安装包 Node.js — Download Node.js 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序…...

第十五章:Python的Pandas库详解及常见用法

在数据分析领域&#xff0c;Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具&#xff0c;使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法&#xff0c;并通过示例代码演示如何使用Pandas进行数据处理。最后&#xff0c;…...

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇&#xff0c;但也不是轻轻松松的。笔者将最新的Windows下安装VSCode&#xff0c;以及运行最简单的C程序的过程记录下来&#xff0c;供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...

PgDog:一个PostgreSQL分布式集群中间件

PgDog 是一个实现了 PostgreSQL 分片、连接池以及负载均衡功能的中间。PgDog 使用 Rust 语言编写&#xff0c;支持跨平台&#xff08;Linux、Mac OS、Windows&#xff09;&#xff0c;具有高性能和高可靠性&#xff0c;可以在不需要修改任何应用程序的前提下实现 PostgreSQL 数…...

基于yolov11的棉花品种分类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的棉花品种分类检测系统是一种高效、准确的农作物品种识别工具。该系统利用YOLOv11深度学习模型&#xff0c;能够实现对棉花主要品种&#xff0c;包括树棉&#xff08;G. arboreum&#xff09;、海岛棉&#xff08;G. barbadense&#xff09;、草棉&a…...

Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档

PDF&#xff0c;即Portable Document Format&#xff0c;用于以一种独立于应用程序、硬件、操作系统的方式共享和查看文档&#xff1b;OFD&#xff0c;即Office Open Document Format for Document&#xff0c;是一种在政府公文和法律文件等领域广泛应用的电子文件格式&#xf…...

UE4学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针

文章目录 一主菜单搭建UI显示主菜单时&#xff0c;暂停游戏&#xff0c;显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式&#xff0c;放中间 显示主菜单时&#xff0c;暂停游戏&#xff0…...

多线程 - 线程安全引入

写一个代码&#xff0c;让主线程创建一个新的线程&#xff0c;由新的线程负责完成一系列的运算&#xff08;比如&#xff1a;1 2 3 ... 1000&#xff09;&#xff0c;再由主线程负责获取到最终结果。 但打印结果为 result 0&#xff0c;略微思考&#xff0c;明白了要让 t 线…...

Angular项目改端口号

在 Angular 项目中修改开发服务器的端口号&#xff08;默认是 4200&#xff09;&#xff0c;可以通过以下几种方式实现&#xff1a; 方法 1&#xff1a;通过 ng serve 命令行参数 直接在运行 ng serve 时指定端口号&#xff1a; ng serve --port 4300效果&#xff1a;开发服务…...

论文内可解释性分析

目录 3 TEPM(Text-Enhanced Prototype Module)3.1 为什么要进行文本增强?(动机)3.2 为什么要使用 Concat(Fv, T) 和 Repeat(T) + Fv?3.3 为什么 Q=F_C,K=V=F_R ?(第一层注意力)3.4 为什么要进行两层注意力?3.5 为什么最终结果会更好?**3.6 面试官可能问的挑战性问题*…...