Qwen1.5-1.8B-Chat-GPTQ-Int4代码实例Python调用vLLM API实现自定义交互想快速上手一个轻量级但功能强大的中文对话模型吗今天我们来聊聊如何用Python代码通过vLLM的API与通义千问1.5-1.8B-Chat-GPTQ-Int4模型进行自定义交互。这个模型虽然只有1.8B参数但经过量化后对硬件要求非常友好同时保留了不错的对话能力。更重要的是通过vLLM部署我们能获得一个标准化的HTTP API接口这意味着你可以用任何支持HTTP请求的语言或工具来调用它灵活性大大增加。下面我就带你一步步搭建环境、编写调用代码并实现一个简单的交互式对话程序。1. 环境准备与模型部署确认在开始写代码之前我们需要确保两件事模型服务已经成功启动并且我们知道如何访问它。1.1 检查模型服务状态如果你使用的是预置的镜像环境模型可能已经通过vLLM部署好了。我们可以通过查看日志来确认服务是否正常运行。打开终端执行以下命令查看部署日志cat /root/workspace/llm.log如果看到类似下面的输出说明模型加载成功服务已经就绪INFO 04-10 10:30:15 llm_engine.py:72] Initializing an LLM engine with config: model/models/Qwen1.5-1.8B-Chat-GPTQ-Int4, tokenizer/models/Qwen1.5-1.8B-Chat-GPTQ-Int4, tokenizer_modeauto, trust_remote_codeTrue, dtypetorch.float16, ... INFO 04-10 10:30:20 llm_engine.py:159] # GPU blocks: 561, # CPU blocks: 512 INFO 04-10 10:30:25 model_runner.py:84] Loading weights finished INFO 04-10 10:30:25 llm_engine.py:212] LLM engine is ready关键是要看到LLM engine is ready这样的提示这表示模型已经加载完成可以接受请求了。1.2 了解API端点信息vLLM部署后会提供一个标准的OpenAI兼容的API接口。默认情况下它会在本地启动一个HTTP服务器。我们需要知道服务器的地址和端口。通常vLLM的API服务运行在http://localhost:8000。主要的API端点包括/v1/completions- 用于文本补全/v1/chat/completions- 用于对话补全我们主要用这个/v1/models- 查看模型信息现在让我们进入正题看看如何用Python代码调用这个API。2. Python调用vLLM API基础2.1 安装必要的Python库首先确保你的Python环境中有requests库这是进行HTTP请求的基础。如果没有安装可以通过以下命令安装pip install requests如果你想要更优雅的调用方式也可以安装openai库vLLM兼容OpenAI API格式pip install openai2.2 最简单的API调用示例我们先从一个最简单的例子开始了解如何向vLLM发送请求并获取响应。import requests import json def simple_chat_completion(prompt, api_urlhttp://localhost:8000/v1/chat/completions): 最简单的聊天补全函数 # 构造请求数据 data { model: Qwen1.5-1.8B-Chat-GPTQ-Int4, messages: [ {role: user, content: prompt} ], max_tokens: 512, # 最大生成token数 temperature: 0.7, # 温度参数控制随机性 stream: False # 是否流式输出 } # 发送POST请求 headers {Content-Type: application/json} response requests.post(api_url, jsondata, headersheaders) # 检查响应状态 if response.status_code 200: result response.json() # 提取生成的文本 reply result[choices][0][message][content] return reply else: print(f请求失败状态码: {response.status_code}) print(f错误信息: {response.text}) return None # 测试调用 if __name__ __main__: test_prompt 你好请介绍一下你自己。 response simple_chat_completion(test_prompt) if response: print(模型回复) print(response)这段代码做了以下几件事构造了一个符合OpenAI API格式的请求指定了我们要使用的模型名称设置了生成参数最大token数、温度等发送HTTP POST请求到vLLM API解析响应并提取生成的文本运行这个脚本你应该能看到模型的自我介绍。3. 实现交互式对话程序现在让我们创建一个更实用的交互式对话程序。这个程序会持续接收用户输入并与模型进行多轮对话。3.1 完整的对话管理类import requests import json from typing import List, Dict, Optional class QwenChatClient: 通义千问聊天客户端 def __init__(self, api_url: str http://localhost:8000/v1/chat/completions): self.api_url api_url self.model_name Qwen1.5-1.8B-Chat-GPTQ-Int4 self.conversation_history: List[Dict] [] def add_message(self, role: str, content: str): 添加消息到对话历史 self.conversation_history.append({ role: role, content: content }) def clear_history(self): 清空对话历史 self.conversation_history [] def chat(self, user_input: str, max_tokens: int 512, temperature: float 0.7, top_p: float 0.9, stream: bool False) - Optional[str]: 发送聊天请求 # 添加用户消息到历史 self.add_message(user, user_input) # 构造请求数据 data { model: self.model_name, messages: self.conversation_history, max_tokens: max_tokens, temperature: temperature, top_p: top_p, stream: stream } try: headers {Content-Type: application/json} response requests.post(self.api_url, jsondata, headersheaders, timeout30) if response.status_code 200: result response.json() assistant_reply result[choices][0][message][content] # 添加助手回复到历史 self.add_message(assistant, assistant_reply) return assistant_reply else: print(fAPI请求失败: {response.status_code}) print(f错误详情: {response.text}) # 移除刚才添加的用户消息因为请求失败了 self.conversation_history.pop() return None except requests.exceptions.RequestException as e: print(f网络请求异常: {e}) # 移除刚才添加的用户消息 self.conversation_history.pop() return None def chat_stream(self, user_input: str, **kwargs): 流式聊天高级功能需要处理SSE kwargs[stream] True self.add_message(user, user_input) data { model: self.model_name, messages: self.conversation_history, **kwargs } try: response requests.post(self.api_url, jsondata, streamTrue, timeout60) if response.status_code 200: full_reply print(模型回复流式: , end, flushTrue) for line in response.iter_lines(): if line: line line.decode(utf-8) if line.startswith(data: ): data_str line[6:] # 去掉data: 前缀 if data_str [DONE]: break try: data_json json.loads(data_str) delta data_json[choices][0][delta] if content in delta: content delta[content] print(content, end, flushTrue) full_reply content except json.JSONDecodeError: continue print() # 换行 self.add_message(assistant, full_reply) return full_reply else: print(f流式请求失败: {response.status_code}) self.conversation_history.pop() return None except Exception as e: print(f流式请求异常: {e}) self.conversation_history.pop() return None def interactive_chat(): 交互式聊天主函数 print( * 50) print(通义千问1.5-1.8B-Chat-GPTQ-Int4 交互式对话) print(输入 quit 或 退出 结束对话) print(输入 clear 或 清空 清空对话历史) print(输入 stream 或 流式 切换流式输出模式) print( * 50) client QwenChatClient() use_stream False while True: try: # 获取用户输入 user_input input(\n你: ).strip() if not user_input: continue # 处理特殊命令 if user_input.lower() in [quit, 退出, exit]: print(对话结束再见) break elif user_input.lower() in [clear, 清空, reset]: client.clear_history() print(对话历史已清空) continue elif user_input.lower() in [stream, 流式, streaming]: use_stream not use_stream mode 开启 if use_stream else 关闭 print(f流式输出模式已{mode}) continue # 发送聊天请求 print(\n模型: , end, flushTrue) if use_stream: reply client.chat_stream(user_input, max_tokens256, temperature0.8) else: reply client.chat(user_input, max_tokens256, temperature0.8) if not reply: print(获取回复失败请检查API服务是否正常运行) except KeyboardInterrupt: print(\n\n对话被中断) break except Exception as e: print(f\n发生错误: {e}) if __name__ __main__: interactive_chat()这个程序提供了完整的对话管理功能对话历史管理自动维护用户和模型的对话历史流式输出支持可以实时看到模型生成的内容特殊命令处理支持清空历史、退出等操作错误处理网络异常、API错误等情况都有相应处理3.2 运行交互式对话保存上面的代码为qwen_chat.py然后运行python qwen_chat.py你会看到一个简单的命令行界面可以开始与模型对话了。试试问一些问题你好请介绍一下你自己Python是什么写一个简单的Python函数计算斐波那契数列4. 高级功能与实用技巧4.1 调整生成参数不同的任务可能需要不同的生成参数。下面是一些常用的参数及其作用def chat_with_params(client, user_input): 使用不同参数进行聊天 # 示例1创意写作 - 更高的温度更多的随机性 creative_params { max_tokens: 300, temperature: 0.9, # 更高的温度输出更随机 top_p: 0.95, # 核采样参数 frequency_penalty: 0.5, # 降低重复词频 presence_penalty: 0.3 # 鼓励新话题 } # 示例2技术问答 - 更低的温度更确定性的输出 technical_params { max_tokens: 512, temperature: 0.3, # 更低的温度输出更确定 top_p: 0.8, frequency_penalty: 0.0, presence_penalty: 0.0 } # 示例3代码生成 - 特定的参数组合 code_params { max_tokens: 1024, temperature: 0.2, top_p: 0.9, stop: [] # 遇到代码块结束符时停止 } # 根据任务类型选择参数 if 代码 in user_input or 编程 in user_input: params code_params elif 创意 in user_input or 故事 in user_input: params creative_params else: params technical_params return client.chat(user_input, **params)4.2 处理长文本和上下文管理对于长文本对话需要注意上下文长度限制。Qwen1.5-1.8B模型通常支持4K或8K的上下文长度。def manage_long_conversation(client, user_input): 管理长对话避免超出上下文限制 # 检查对话历史长度粗略估计 total_chars sum(len(msg[content]) for msg in client.conversation_history) # 如果对话历史太长进行压缩或截断 if total_chars 3000: # 假设字符数超过3000 print(提示对话历史较长正在优化...) # 方法1只保留最近几轮对话 if len(client.conversation_history) 6: # 保留系统提示如果有和最近3轮对话 keep_messages [] if client.conversation_history[0][role] system: keep_messages.append(client.conversation_history[0]) # 添加最近3轮对话 keep_messages.extend(client.conversation_history[-6:]) client.conversation_history keep_messages # 方法2或者使用总结的方式压缩历史 # 这里可以调用模型本身来总结之前的对话 return client.chat(user_input)4.3 批量处理请求如果你需要处理多个问题可以使用批量请求提高效率import concurrent.futures import time def batch_chat_questions(questions, max_workers3): 批量处理多个问题 results [] def process_question(q): client QwenChatClient() start_time time.time() response client.chat(q, max_tokens200) elapsed time.time() - start_time return { question: q, answer: response, time: elapsed } # 使用线程池并发处理 with concurrent.futures.ThreadPoolExecutor(max_workersmax_workers) as executor: future_to_question {executor.submit(process_question, q): q for q in questions} for future in concurrent.futures.as_completed(future_to_question): question future_to_question[future] try: result future.result() results.append(result) print(f处理完成: {question[:30]}... (耗时: {result[time]:.2f}秒)) except Exception as e: print(f处理失败 {question}: {e}) return results # 示例使用 if __name__ __main__: questions [ Python是什么, 如何学习编程, 人工智能有哪些应用, 写一个简单的Hello World程序, 解释一下机器学习 ] print(开始批量处理问题...) results batch_chat_questions(questions) print(\n处理结果) for i, result in enumerate(results, 1): print(f\n{i}. 问题: {result[question]}) print(f 回答: {result[answer][:100]}...) print(f 耗时: {result[time]:.2f}秒)5. 常见问题与解决方案在实际使用中你可能会遇到一些问题。这里整理了一些常见问题及其解决方法5.1 API连接问题def check_api_health(api_urlhttp://localhost:8000/v1/models): 检查API服务是否健康 try: response requests.get(api_url, timeout5) if response.status_code 200: print(API服务正常) models response.json().get(data, []) print(f可用模型: {[m[id] for m in models]}) return True else: print(fAPI服务异常状态码: {response.status_code}) return False except requests.exceptions.ConnectionError: print(无法连接到API服务请检查) print(1. vLLM服务是否已启动) print(2. 端口8000是否被占用) print(3. 防火墙设置是否正确) return False except Exception as e: print(f检查API健康时出错: {e}) return False5.2 响应速度慢或超时如果发现响应速度慢可以尝试以下优化def optimize_chat_performance(client, user_input): 优化聊天性能 # 方法1调整生成参数减少max_tokens response client.chat( user_input, max_tokens150, # 减少生成长度 temperature0.3 # 降低随机性加快生成 ) # 方法2使用流式输出虽然总时间可能不变但用户体验更好 # response client.chat_stream(user_input, max_tokens150) return response5.3 内存不足问题对于1.8B的量化模型内存需求通常不高但如果遇到内存问题def monitor_resource_usage(): 监控资源使用情况示例 import psutil import os process psutil.Process(os.getpid()) memory_info process.memory_info() print(f内存使用: {memory_info.rss / 1024 / 1024:.2f} MB) print(f虚拟内存: {memory_info.vms / 1024 / 1024:.2f} MB) # 如果内存使用过高考虑清理对话历史 # client.clear_history()6. 实际应用示例6.1 构建简单的问答系统class SimpleQASystem: 简单的问答系统 def __init__(self): self.client QwenChatClient() # 添加系统提示让模型更好地扮演问答角色 self.client.add_message(system, 你是一个专业的问答助手请准确、简洁地回答用户的问题。) def answer_question(self, question, contextNone): 回答问题可以附加上下文 if context: # 如果有上下文信息一起发送 full_prompt f上下文信息{context}\n\n问题{question} else: full_prompt question return self.client.chat(full_prompt, max_tokens300, temperature0.3) def answer_multiple(self, questions_with_context): 回答多个带上下文的问题 answers [] for q, ctx in questions_with_context: answer self.answer_question(q, ctx) answers.append({ question: q, context: ctx, answer: answer }) return answers # 使用示例 if __name__ __main__: qa_system SimpleQASystem() # 单个问题 answer qa_system.answer_question(Python中的列表和元组有什么区别) print(回答, answer) # 带上下文的问题 context 在Python中列表是可变的元组是不可变的。 answer_with_ctx qa_system.answer_question(那么它们各自在什么场景下使用, context) print(带上下文的回答, answer_with_ctx)6.2 文本摘要功能def text_summarization(client, text, max_length100): 文本摘要功能 prompt f请将以下文本摘要为{max_length}字以内的简洁版本 {text} 摘要 summary client.chat(prompt, max_tokens150, temperature0.2) return summary # 使用示例 long_text 人工智能是计算机科学的一个分支它企图了解智能的实质并生产出一种新的能以人类智能相似的方式做出反应的智能机器该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来理论和技术日益成熟应用领域也不断扩大可以设想未来人工智能带来的科技产品将会是人类智慧的容器。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能但能像人那样思考、也可能超过人的智能。 summary text_summarization(QwenChatClient(), long_text, max_length50) print(原文长度:, len(long_text)) print(摘要:, summary) print(摘要长度:, len(summary))7. 总结通过本文的介绍你应该已经掌握了如何使用Python调用vLLM部署的Qwen1.5-1.8B-Chat-GPTQ-Int4模型。我们涵盖了从基础调用到高级应用的各个方面基础API调用学会了如何通过HTTP请求与模型交互交互式对话构建了一个完整的命令行聊天程序参数调优了解了如何调整生成参数以获得不同风格的输出实用技巧掌握了处理长对话、批量请求等高级功能问题解决学会了诊断和解决常见的API问题实际应用看到了如何将模型集成到问答系统、文本摘要等实际场景中这个1.8B的量化模型虽然参数量不大但在很多任务上表现不错而且对硬件要求低响应速度快非常适合学习和开发使用。关键要点回顾vLLM提供了标准的OpenAI兼容API调用非常简单通过调整temperature、max_tokens等参数可以控制生成效果流式输出能显著改善用户体验合理管理对话历史可以避免上下文过长的问题错误处理和资源监控是生产环境应用的重要考虑现在你可以基于这些代码示例开发自己的AI应用了。无论是构建聊天机器人、智能助手还是集成到现有系统中这个轻量级模型都是一个不错的起点。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。