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

建筑设计地图网站海会网络做的网站怎么做优化

建筑设计地图网站,海会网络做的网站怎么做优化,wordpress小程序生成,成都有哪些设计公司🚀 实现Windows本地大模型翻译服务 - 基于OllamaFlask的划词翻译实践 🛠️ 步骤概要1️⃣ python 环境准备2️⃣ Ollama 安装3️⃣ 一个 Flask 服务4️⃣ Windows 服务化封装5️⃣ 测试本地接口6️⃣ 配置划词翻译自定义翻译源7️⃣ 效果展示8️⃣ debug…

🚀 实现Windows本地大模型翻译服务 - 基于Ollama+Flask的划词翻译实践

    • 🛠️ 步骤概要
      • 1️⃣ python 环境准备
      • 2️⃣ Ollama 安装
      • 3️⃣ 一个 Flask 服务
      • 4️⃣ Windows 服务化封装
      • 5️⃣ 测试本地接口
      • 6️⃣ 配置划词翻译自定义翻译源
      • 7️⃣ 效果展示
      • 8️⃣ debug 历程
      • 💡 技术亮点

🛠️ 步骤概要

参考 API 文档:

  • Ollama API
  • 划词翻译自定义翻译源

1️⃣ python 环境准备

# 虚拟环境
conda create -n ollama_trans
conda activate ollama_trans
pip install flask flask-cors pywin32 requests waitress
# 请确保完成 pywin32_postinstall.py 的安装步骤。:
python path\to\your\envs\ollama_trans\Scripts\pywin32_postinstall.py -install

2️⃣ Ollama 安装

安装 Ollama 最好提前设置安装路径和模型下载路径,否则它都一股脑干到 C 盘。可以参考前一篇博客 《本地投喂deepseek》:

  • 设置模型保存路径:新增环境变量 OLLAMA_MODELS,值为目标地址,似乎要 重启电脑生效
  • 指定安装目录:OllamaSetup.exe /DIR=“D:\some\location”
  • ollama默认在 11434 端口提供 REST API,比如通过 curl 发送请求到 /api/generate 来生成文本:
curl http://localhost:11434/api/generate -d "{\"model\": \"deepseek-r1:14b\", \"prompt\": \"Why is the sky blue?\", \"stream\": false}"
  • 我们的目的就是用 flask 写一个服务器适配 Ollama 和划词翻译的 API

3️⃣ 一个 Flask 服务

遇事不决问 DS

# translation_service.py
import re
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
from flask import Flask, request, jsonify
from flask_cors import CORS
from waitress import serve
import requests
import logging
import sys
import osapp = Flask(__name__)
CORS(app)# 获取当前脚本所在的目录
current_directory = os.path.dirname(os.path.abspath(__file__))
# 定义日志文件名
log_file_path = os.path.join(current_directory, 'flask_svc.log')
# 配置日志记录器
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename=log_file_path,filemode='a'  # 使用 'a' 表示追加模式,'w' 表示覆盖模式
)
logger = logging.getLogger(__name__)# 选择ollama的模型
MODEL_NAME = {"qwen": "qwen2.5:7b-instruct-q8_0","llama": "llama3.2:3b","deepseek": "deepseek-r1:14b"  # 其实 deepseek-r1 擅长推理,并不适合翻译,有点慢
}# 语言映射
LANGUAGE_MAP = {"中文(简体)": "中文","英语": "英文","日语": "日文"
}def clean_response(text):"""清除<think>标签内容"""# 过滤DeepSeek思考过程的正则表达式THINK_PATTERN = re.compile(r'<think>.*?</think>', re.DOTALL)return THINK_PATTERN.sub('', text).strip()def build_prompt(text, source, target):source_lang = LANGUAGE_MAP.get(source, source)target_lang = LANGUAGE_MAP.get(target, target)return f"作为专业翻译官,请将以下{source_lang}内容精准翻译为{target_lang},仅输出译文:\n{text}"@app.route('/translate', methods=['POST'])
def translate():try:data = request.jsonlogger.info(f"收到请求: {data}")# 提取必要参数model_name = data['name'].lower()text = data["text"]dest_langs = data["destination"]source_lang = data.get("source") or "auto"if source_lang == dest_langs[0] and len(dest_langs) > 1:target_lang = dest_langs[1]else:target_lang = dest_langs[0]response = requests.post("http://localhost:11434/api/generate",json={"model": MODEL_NAME.get(model_name, model_name),"prompt": build_prompt(text, source_lang, target_lang),"stream": False,"options": {"temperature": 0.3}})# 处理翻译结果raw_response = response.json()["response"]translated_text = clean_response(raw_response)return jsonify({"text": text,"from": source_lang,"to": target_lang,"result": [translated_text]})except Exception as e:logger.error(f"翻译失败: {str(e)}")return jsonify({"error": str(e)}), 500class TranslationService(win32serviceutil.ServiceFramework):_svc_name_ = "LocalOllamaTranslationService"  # 服务名称(唯一)_svc_display_name_ = "Ollama本地翻译服务"_svc_description_ = "为划词翻译提供基于Ollama中运行的大模型的本地翻译服务"  # 服务描述logger.info(f"svc_name: {_svc_name_}, model_name: {MODEL_NAME}")def __init__(self, args):win32serviceutil.ServiceFramework.__init__(self, args)self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)socket.setdefaulttimeout(60)def SvcStop(self):self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)logger.info("Stopping Ollama Translation Service...")win32event.SetEvent(self.hWaitStop)servicemanager.LogInfoMsg("服务正在停止...")logger.info("Service stopped successfully.")def SvcDoRun(self):logger.info("Starting Ollama Translation Service...")try:self.main()logger.info("Service started successfully.")except Exception as e:logger.error(f"Failed to start service: {str(e)}")self.ReportServiceStatus(win32service.SERVICE_STOPPED)def main(self):serve(app, host='127.0.0.1', port=5000)if __name__ == '__main__':if len(sys.argv) == 1:servicemanager.Initialize()servicemanager.PrepareToHostSingle(TranslationService)servicemanager.StartServiceCtrlDispatcher()else:win32serviceutil.HandleCommandLine(TranslationService)

4️⃣ Windows 服务化封装

以下脚本都需要以管理员身份运行

  • 启动服务脚本 install_service.bat
:: install_service.bat
@echo off
# 这里的 python 解释器要填虚拟环境那个,否则找不到包
set PYTHON_PATH=path\to\your\envs\ollama_trans\python.exe
set SCRIPT_PATH=%~dp0translation_service.py%PYTHON_PATH% %SCRIPT_PATH% --startup=auto install
# 这里的服务名称 LocalOllamaTranslationService 要跟上面程序里面的一致,是唯一的
net start LocalOllamaTranslationService
  • 关闭服务脚本 uninstall_service.bat
:: uninstall_service.bat
@echo off
net stop LocalOllamaTranslationService
set PYTHON_PATH=path\to\your\envs\ollama_trans\python.exe
set SCRIPT_PATH=%~dp0translation_service.py%PYTHON_PATH% %SCRIPT_PATH% remove

最终的文件结构:

├── translation_service.py    # 主服务程序
├── install_service.bat       # 服务安装脚本
├── uninstall_service.bat     # 服务卸载脚本
└── flask_svc.log             # python 日志

5️⃣ 测试本地接口

现在我们请求的是 flask 服务的端口,我这里指定了模型名称是 qwen,ollama 中也下载了 qwen2.5:7b-instruct-q8_0

curl -X POST http://localhost:5000/translate -H "Content-Type: application/json" -d "{\"name\": \"qwen\",\"text\": \"人工智能的发展前景\", \"destination\": [\"中文(简体)\", \"英语\"], \"source\": \"中文(简体)\"}"

返回:

{"from":"\u4e2d\u6587(\u7b80\u4f53)","result":["The Prospects for the Development of Artificial Intelligence"],"text":"\u4eba\u5de5\u667a\u80fd\u7684\u53d1\u5c55\u524d\u666f","to":"\u82f1\u8bed"}

6️⃣ 配置划词翻译自定义翻译源

插件设置
在这里插入图片描述

自定义翻译源

  • 接口地址:http://localhost:5000/translate

  • 翻译源名称:qwen,然后回车

  • 测试

根据上面的程序逻辑,翻译源名称最好跟 ollama 下载的模型名称一致

7️⃣ 效果展示

在这里插入图片描述

8️⃣ debug 历程

  • 日志的重要性
    • 一开始 deepseek 生成的 py 程序都没写日志,启动服务一直失败,报错:pywintypes.error: (1063, 'StartServiceCtrlDispatcher', '服务进程无法连接到服务控制器上。'),然后又那这些报错去问它,给了一堆方案都没解决问题 😄
    • 写了 logger 才发现问题所在:
Sat, 15 Feb 2025 21:19:16 wasyncore.py[line:449] INFO Serving on http://127.0.0.1:5001
Sat, 15 Feb 2025 21:22:47 app.py[line:875] ERROR Exception on /translate [POST]
Traceback (most recent call last):File "D:\dev\miniconda\miniconda3\envs\flask\Lib\site-packages\flask\app.py", line 1511, in wsgi_appresponse = self.full_dispatch_request()File "D:\dev\miniconda\miniconda3\envs\flask\Lib\site-packages\flask\app.py", line 919, in full_dispatch_requestrv = self.handle_user_exception(e)File "D:\dev\miniconda\miniconda3\envs\flask\Lib\site-packages\flask_cors\extension.py", line 165, in wrapped_functionreturn cors_after_request(app.make_response(f(*args, **kwargs)))~^^^^^^^^^^^^^^^^^File "D:\dev\miniconda\miniconda3\envs\flask\Lib\site-packages\flask\app.py", line 917, in full_dispatch_requestrv = self.dispatch_request()File "D:\dev\miniconda\miniconda3\envs\flask\Lib\site-packages\flask\app.py", line 902, in dispatch_requestreturn self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: TranslationService.translate() missing 1 required positional argument: 'self'
  • 服务启停
    • cmd 中的双引号是需要用反斜杠 \ 转义的,在 powershell 中不需要
    • debug 过程中需要起了又删掉 LocalOllamaTranslationService 服务:
    • sc queryex LocalOllamaTranslationService 得到 PID
    • taskkill /f /pid <PID> 强行停止
    • sc delete LocalOllamaTranslationService 删掉这个服务 ID 后才能再启动程序,否则会报错服务已存在
    • 或者以管理员身份打开 cmd 或者 VS Code,执行:
    • python translation_service.py stop 停止服务
    • python translation_service.py remove 删除服务
    • python translation_service.py install 安装服务
    • python translation_service.py start 启动服务

💡 技术亮点

  • 完全离线: 从模型推理到翻译服务全程本地运行

  • 隐私保护: 敏感文本无需离开本地设备

  • 低延迟: 省去网络传输耗时,平均响应<500ms

  • 可扩展架构: 轻松切换不同大语言模型


文章转载自:
http://syphilis.c7500.cn
http://ferrate.c7500.cn
http://deathless.c7500.cn
http://soilborne.c7500.cn
http://cinerea.c7500.cn
http://image.c7500.cn
http://streetlamp.c7500.cn
http://arithmetically.c7500.cn
http://endless.c7500.cn
http://reredos.c7500.cn
http://armoire.c7500.cn
http://biothythm.c7500.cn
http://flopover.c7500.cn
http://boil.c7500.cn
http://conterminous.c7500.cn
http://oxidation.c7500.cn
http://unequal.c7500.cn
http://conspecific.c7500.cn
http://waught.c7500.cn
http://ouagadougou.c7500.cn
http://compress.c7500.cn
http://traditor.c7500.cn
http://microphonics.c7500.cn
http://costotomy.c7500.cn
http://peau.c7500.cn
http://raccoon.c7500.cn
http://greenlandic.c7500.cn
http://mynheer.c7500.cn
http://glaireous.c7500.cn
http://monetarily.c7500.cn
http://ambiance.c7500.cn
http://anthologist.c7500.cn
http://flea.c7500.cn
http://souari.c7500.cn
http://metallurgical.c7500.cn
http://loid.c7500.cn
http://capot.c7500.cn
http://ultrashort.c7500.cn
http://scaly.c7500.cn
http://dignify.c7500.cn
http://removal.c7500.cn
http://bosk.c7500.cn
http://cadaverous.c7500.cn
http://microbiology.c7500.cn
http://bengal.c7500.cn
http://metathoracic.c7500.cn
http://impanation.c7500.cn
http://rightfully.c7500.cn
http://torrent.c7500.cn
http://iconophile.c7500.cn
http://chug.c7500.cn
http://jetabout.c7500.cn
http://registrary.c7500.cn
http://midyear.c7500.cn
http://acquisition.c7500.cn
http://hipparch.c7500.cn
http://elliptoid.c7500.cn
http://matsudo.c7500.cn
http://vestibular.c7500.cn
http://corporate.c7500.cn
http://unspent.c7500.cn
http://belladonna.c7500.cn
http://mutinous.c7500.cn
http://stratoliner.c7500.cn
http://cribble.c7500.cn
http://cuppy.c7500.cn
http://toxalbumin.c7500.cn
http://convoluted.c7500.cn
http://noun.c7500.cn
http://corel.c7500.cn
http://haematinic.c7500.cn
http://yeomanly.c7500.cn
http://neonatal.c7500.cn
http://coccygeal.c7500.cn
http://shashlik.c7500.cn
http://chi.c7500.cn
http://harris.c7500.cn
http://brassware.c7500.cn
http://undetected.c7500.cn
http://undiscoverable.c7500.cn
http://nepenthes.c7500.cn
http://cytogenetically.c7500.cn
http://door.c7500.cn
http://capotasto.c7500.cn
http://alway.c7500.cn
http://frailness.c7500.cn
http://tungusian.c7500.cn
http://abominably.c7500.cn
http://spider.c7500.cn
http://vibrotactile.c7500.cn
http://toothlet.c7500.cn
http://wucai.c7500.cn
http://philatelic.c7500.cn
http://sextipara.c7500.cn
http://banditry.c7500.cn
http://sectarianism.c7500.cn
http://phagocytize.c7500.cn
http://bield.c7500.cn
http://turnplate.c7500.cn
http://gasoline.c7500.cn
http://www.zhongyajixie.com/news/92026.html

相关文章:

  • 重庆网站建设jccit重庆seo博客
  • 国外ps网站下载百度网盘app
  • 做网站费用走什么科目石家庄seo排名外包
  • ftp链接网站空间如何推广
  • 清远做网站哪家好百度搜索最多的关键词
  • 建商城网站需要什么条件竞价开户
  • 做交友网站挣钱吗百度seo搜索营销新视角
  • 东阳建设公司网站百度识图鉴你所见
  • 上海高端网站建设高端网站建设广东seo
  • 用angularjs做的网站基本营销策略有哪些
  • 营销型企业网站类型搜索引擎有哪些网站
  • java做简易网站上海网站制作公司
  • 做网站链接还要服务器吗买市场营销十大经典案例
  • 南京江宁做网站网站关键词优化推广哪家快
  • 杭州做网站比较出名的公司有哪些首页排名关键词优化
  • 网站建设我们的优势seo包括哪些方面
  • 长春 网站建设搜索引擎排行榜前十名
  • wordpress搭建漫画站线上营销的优势
  • wordpress网站 800cdn百度百度一下就知道
  • 做一名网站编辑要具备什么资格网络宣传方案
  • 南海网站建设哪家好武汉竞价托管公司
  • 团购做的比较好的网站seo研究中心
  • 郓城住房和城乡建设厅网站seo人才
  • 通州网站建设公司seo教程技术
  • 广州网站开发b2b网站大全
  • 临朐网站建设定制首选哪家公司厦门seo外包公司
  • 中国红河网关键词排名优化怎么做
  • 网站域名解析失败重庆百度竞价开户
  • 多合一网站建设厦门网站推广优化哪家好
  • 陶瓷网站开发背景厦门seo关键词排名