在Windows系统上本地调用云端InternLM2-Chat-1.8B模型实践
在Windows系统上本地调用云端InternLM2-Chat-1.8B模型实践你是不是也遇到过这种情况想体验一下最新的对话大模型但自己的电脑配置不够跑不动动辄几十亿参数的大模型或者你只是想在自己的Python项目里快速集成一个智能对话功能不想折腾复杂的本地部署和环境配置今天我们就来解决这个问题。我将带你一步步实现如何在你的Windows电脑上通过简单的Python代码直接调用部署在云端的高性能大语言模型——InternLM2-Chat-1.8B。整个过程就像调用一个普通的网络API一样简单你不需要关心服务器、显卡这些复杂的底层设施只需要关注你的应用逻辑。1. 准备工作理清思路与环境检查在开始写代码之前我们先花几分钟把整个流程想明白。我们的目标是在本地Windows系统上用Python程序去访问一个运行在远程服务器上的模型服务。这听起来有点像点外卖厨房云端服务器已经帮你把菜模型推理做好了你只需要下一个订单发送请求然后等外卖小哥网络把餐送到你家本地程序。你完全不用管厨房里用什么锅、什么火。为了完成这个“点餐”流程我们需要准备三样东西一个能点餐的地址API地址也就是模型服务在哪里。这通常是一个网址URL。你的会员卡和密码API密钥用来证明你有权限使用这个服务防止别人盗用。一个会下单的工具Python环境我们将使用最常用的requests库来发送HTTP请求。首先确保你的Windows电脑已经准备好了Python环境。按下Win R输入cmd打开命令提示符然后输入python --version如果显示了Python版本号比如Python 3.8那就没问题。如果没有你需要先去Python官网下载并安装一个。接下来安装我们唯一需要的第三方库。在刚才的命令提示符里输入pip install requests如果安装速度慢可以加上清华的镜像源来加速pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple好了工具就位接下来我们去获取关键的“地址”和“密码”。2. 获取通行证API密钥与地址要调用云端服务你必须先有一个账号并获得授权。这里我们假设你已经在一个云服务平台例如教程场景中提到的星图平台完成了模型服务的部署。不同的平台步骤类似核心是拿到两样东西API Key密钥一串长长的、由字母和数字组成的字符串它是你的唯一身份凭证。一定要像保管密码一样保管好它不要泄露到公开的代码仓库如GitHub中。API地址Endpoint模型服务对外提供的网络访问地址通常是一个以http://或https://开头的URL。具体在哪里找呢通常在你部署模型的云服务平台的管理控制台里。可能会有类似“服务详情”、“访问密钥”、“API文档”这样的页面。你会找到类似下面的信息API Key:sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAPI地址:https://your-model-service.com/v1/chat/completions请将你在平台上实际获取的这两项信息记录下来我们马上就会用到。为了安全起见在接下来的教程中我们不会把真实的密钥硬编码在代码里而是采用更安全的环境变量方式。3. 第一次对话用代码发送请求现在让我们用Python来实现最核心的一步发送一个对话请求到云端模型并接收它的回复。创建一个新的Python文件比如叫做chat_with_cloud.py。我们将一步步构建代码。3.1 安全地设置密钥和地址首先引入必要的库并设置我们的密钥和地址。为了避免密钥泄露我们使用os模块从环境变量中读取。import os import requests import json # 从环境变量中读取API密钥和地址更安全 # 你可以在命令行中设置set API_KEYyour_key_here (Windows) API_KEY os.getenv(INTERNLM_API_KEY, 你的API密钥) # 第二个参数是默认值仅用于演示 API_URL os.getenv(INTERNLM_API_URL, 你的API服务地址) # 例如https://xxx.com/v1/chat/completions # 如果直接写在这里不推荐用于生产环境就像下面这样注释掉上面两行取消注释下面两行 # API_KEY sk-你的真实API密钥 # API_URL https://你的真实API地址/v1/chat/completions重要提示在生产或分享代码时务必使用环境变量或配置文件的方式管理密钥而不是直接写在代码里。在Windows中你可以在命令行临时设置环境变量set INTERNLM_API_KEYsk-xxx然后再运行你的Python脚本。3.2 构建请求数据大语言模型的API通常遵循一种通用的消息格式。我们需要告诉模型“谁说了什么话”。最常见的格式是包含一个messages列表列表里每个元素都是一个字典包含role角色和content内容。def send_chat_message(prompt): 向云端InternLM模型发送一条消息并获取回复。 参数: prompt (str): 用户输入的文本内容。 返回: str: 模型生成的回复内容如果出错则返回错误信息。 # 1. 准备请求头其中包含认证信息 headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } # 2. 准备请求体数据 # 消息历史我们从一个用户消息开始 messages [ { role: user, # 角色是用户 content: prompt # 内容是用户的输入 } ] data { model: internlm2-chat-1_8b, # 指定模型名称根据你的服务调整 messages: messages, temperature: 0.7, # 控制创造性0.0-1.0越高回答越随机 max_tokens: 512, # 控制回复的最大长度 stream: False # 是否使用流式输出这里先设为False一次获取全部回复 }这里有几个参数简单解释一下model: 你调用的模型名称需要和云端部署的模型一致。temperature: 采样温度。设为0时模型的输出每次都会很确定设为0.7或更高时输出会更有创意和变化。根据你的需求调整。max_tokens: 模型回答的最大token数可以粗略理解为字数。设置一个上限防止生成长篇大论。stream: 流式输出。如果设为True你会像打字机一样看到回复一个字一个字地出来体验更好但处理起来稍复杂。我们先从简单的开始。3.3 发送请求并处理响应接下来我们使用requests库发送POST请求并处理返回的结果。# 3. 发送POST请求 try: response requests.post(API_URL, headersheaders, jsondata, timeout30) # 设置30秒超时 response.raise_for_status() # 如果状态码不是200会抛出HTTPError异常 # 4. 解析返回的JSON数据 result response.json() # 5. 从返回结果中提取模型的回复文本 # 通常回复在 choices[0].message.content 里 reply result[choices][0][message][content] return reply.strip() # 去掉首尾空白字符 except requests.exceptions.Timeout: return 错误请求超时请检查网络或稍后重试。 except requests.exceptions.HTTPError as e: return fHTTP错误{e}\n响应内容{response.text} except requests.exceptions.RequestException as e: return f请求异常{e} except (KeyError, IndexError, json.JSONDecodeError) as e: return f解析响应数据时出错{e}\n原始响应{response.text}代码里加入了基本的异常处理这样如果网络出错、密钥不对或者服务返回的数据格式不对我们都能得到一个友好的错误提示而不是让程序直接崩溃。3.4 运行你的第一个对话最后我们添加一个主函数来测试一下。if __name__ __main__: # 测试一下 user_input 你好请介绍一下你自己。 print(f你{user_input}) answer send_chat_message(user_input) print(fAI{answer})现在在命令行中先设置好环境变量如果你用的是环境变量方式然后运行脚本# 设置环境变量每次打开新命令行都需要设置 set INTERNLM_API_KEY你的真实密钥 set INTERNLM_API_URL你的真实地址 # 运行脚本 python chat_with_cloud.py如果一切顺利你将看到模型向你打招呼并介绍自己恭喜你已经成功实现了本地与云端模型的第一次对话。4. 让对话更实用处理上下文与连续对话上面的例子是单轮对话。但真正的聊天是有来有回的模型需要记住之前说过的话。这叫做“保持上下文”。实现起来也很简单我们只需要在messages列表里保存完整的历史记录。我们来升级一下函数让它支持多轮对话。def chat_with_context(): 一个简单的持续对话循环能记住上下文。 print(开始与云端InternLM对话输入‘退出’或‘quit’结束...) print(- * 40) # 初始化一个空的消息历史列表 conversation_history [] while True: user_input input(\n你).strip() if user_input.lower() in [退出, quit, exit]: print(对话结束。) break if not user_input: continue # 将用户最新的输入加入到历史记录中 conversation_history.append({role: user, content: user_input}) # 准备请求数据这次发送的是整个历史记录 headers {Authorization: fBearer {API_KEY}, Content-Type: application/json} data { model: internlm2-chat-1_8b, messages: conversation_history, # 关键发送全部历史 temperature: 0.7, max_tokens: 512, stream: False } try: response requests.post(API_URL, headersheaders, jsondata, timeout60) response.raise_for_status() result response.json() ai_reply result[choices][0][message][content].strip() # 将AI的回复也加入到历史记录中以便下一轮使用 conversation_history.append({role: assistant, content: ai_reply}) print(fAI{ai_reply}) except Exception as e: print(f出错{e}) # 如果出错可以选择移除最后一次用户输入或者保留由用户决定 # conversation_history.pop() # 移除失败的用户输入 if __name__ __main__: # 运行带上下文的对话 chat_with_context()运行这个脚本你就可以进行连续对话了。问它“我上一句说了什么”它应该能回答上来因为它“记得”整个conversation_history。5. 打造本地图形界面GUI总是在黑乎乎的命令行里聊天不够直观那我们最后一步用Python内置的tkinter库快速打造一个极简的本地聊天窗口。这样看起来就更像一个真正的应用了。创建一个新文件chat_gui.py。import tkinter as tk from tkinter import scrolledtext, END, messagebox import threading # 这里需要导入我们之前写好的发送消息的函数 # 假设我们把之前的 send_chat_message 函数放在了一个叫 cloud_chat.py 的文件里 from chat_with_cloud import send_chat_message # 根据你的文件名调整 class ChatGUI: def __init__(self, root): self.root root self.root.title(InternLM-1.8B 本地聊天客户端) self.root.geometry(600x700) # 创建显示对话的区域只读 self.chat_display scrolledtext.ScrolledText(root, wraptk.WORD, statedisabled, height25) self.chat_display.pack(padx10, pady10, filltk.BOTH, expandTrue) # 创建输入框和发送按钮的框架 input_frame tk.Frame(root) input_frame.pack(padx10, pady(0,10), filltk.X) self.input_text tk.Text(input_frame, height4) self.input_text.pack(sidetk.LEFT, filltk.BOTH, expandTrue) self.input_text.bind(Return, self.on_enter_pressed) # 绑定回车键 send_button tk.Button(input_frame, text发送, commandself.send_message, height4) send_button.pack(sidetk.RIGHT, padx(5,0)) # 初始化显示一些欢迎信息 self.display_message(系统, 欢迎使用InternLM-1.8B聊天客户端你可以开始输入了。, system) def display_message(self, sender, message, msg_typeuser): 在聊天显示区域添加一条消息 self.chat_display.config(statenormal) # 简单地区分一下用户和AI的消息用不同的标签 if msg_type user: self.chat_display.insert(END, f\n你{message}\n) elif msg_type ai: self.chat_display.insert(END, f\nAI{message}\n) else: self.chat_display.insert(END, f\n{message}\n) self.chat_display.config(statedisabled) # 自动滚动到底部 self.chat_display.see(END) def send_message(self): 处理发送按钮点击事件 user_msg self.input_text.get(1.0, END).strip() # 获取输入框所有文本 if not user_msg: return # 清空输入框 self.input_text.delete(1.0, END) # 在界面上显示用户说的话 self.display_message(你, user_msg, user) # 在新线程中发送请求避免界面卡死 threading.Thread(targetself.get_ai_response, args(user_msg,), daemonTrue).start() def on_enter_pressed(self, event): 处理回车键按下事件CtrlEnter换行直接Enter发送 if event.state 0x4: # 检查Ctrl键是否被按下 return # 如果是CtrlEnter允许换行默认行为 else: self.send_message() # 如果是单独Enter发送消息 return break # 阻止默认的换行行为 def get_ai_response(self, user_msg): 调用后端函数获取AI回复在子线程中运行 try: # 调用我们之前写好的函数 reply send_chat_message(user_msg) # 回到主线程更新界面 self.root.after(0, self.display_message, AI, reply, ai) except Exception as e: error_msg f获取回复时出错{e} self.root.after(0, self.display_message, 系统, error_msg, system) if __name__ __main__: root tk.Tk() app ChatGUI(root) root.mainloop()运行这个GUI程序 (python chat_gui.py)一个简单的聊天窗口就弹出来了。在输入框里打字按回车或点击“发送”按钮消息就会发送到云端模型回复会显示在上面的框里。虽然界面简陋但核心功能已经完整了。6. 回顾与建议走完整个流程你会发现从本地调用云端模型并没有想象中复杂。核心就是构造一个符合API规范的HTTP请求然后处理返回的JSON数据。我们一步步实现了从最简单的单次调用到带有记忆的连续对话最后还给这个功能套上了一个本地图形界面。在实际使用中你可能会遇到网络波动、服务响应慢等问题所以代码中的异常处理和超时设置很重要。对于更复杂的应用你还可以考虑异步请求使用aiohttp库在GUI或Web应用中实现更流畅的体验避免界面卡顿。流式输出将API请求的stream参数设为True可以实现打字机效果的逐字输出体验更佳。历史记录管理当对话轮数很多时messages列表会很长可能超出模型上下文长度限制。这时需要设计策略比如只保留最近N轮对话或者总结之前的对话内容。封装成类将API调用、历史管理等功能封装成一个类这样在你的主程序中调用起来会更清晰。最重要的是你现在拥有了一个强大的工具可以将大语言模型的能力轻松集成到你的任何Python项目里——无论是数据分析脚本、自动化工具还是桌面应用。剩下的就是发挥你的想象力去创造有趣的应用了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2485055.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!