通义千问1.8B-GPTQ-Int4实战教程:Chainlit集成LangChain实现工具调用
本文介绍了如何在星图GPU平台上自动化部署通义千问1.5-1.8B-Chat-GPTQ-Int4镜像,并集成Chainlit与LangChain实现智能对话和工具调用。该方案能快速构建AI助手应用,适用于智能问答、时间查询和简单计算等场景,提升开发效率。
通义千问1.8B-GPTQ-Int4实战教程:Chainlit集成LangChain实现工具调用
1. 环境准备与模型部署
在开始之前,确保你已经准备好了运行环境。这个教程使用的是经过GPTQ-Int4量化的通义千问1.8B模型,相比原版模型,量化后的版本在保持较好性能的同时,大幅降低了显存需求。
1.1 系统要求
要运行这个模型,你的系统需要满足以下基本要求:
- GPU内存:至少8GB VRAM(量化后版本)
- 系统内存:16GB RAM或以上
- Python版本:3.8或更高版本
- CUDA版本:11.7或更高
如果你使用的是云服务器,选择配备NVIDIA GPU的实例即可。本地部署的话,确保安装了合适的NVIDIA驱动。
1.2 快速部署验证
部署完成后,可以通过以下命令检查模型服务状态:
# 查看模型部署日志
cat /root/workspace/llm.log
如果部署成功,你会看到类似下面的输出:
模型加载完成,服务启动成功
推理服务运行在端口: 8000
GPU内存使用: 6.2GB/8.0GB
看到这些信息说明模型已经准备好接收请求了。
2. Chainlit前端集成
Chainlit是一个专门为AI应用设计的聊天界面框架,它让搭建对话式AI应用变得非常简单。下面我们来看看如何集成Chainlit来调用通义千问模型。
2.1 安装必要依赖
首先安装所需的Python包:
pip install chainlit langchain openai requests
这些包的作用分别是:
chainlit:提供漂亮的聊天界面langchain:构建AI应用的工作流openai:用于与模型API交互requests:发送HTTP请求
2.2 创建Chainlit应用
创建一个名为app.py的文件,内容如下:
import chainlit as cl
import requests
import json
from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent
from langchain import LLMChain
# 配置模型API端点
MODEL_API_URL = "http://localhost:8000/v1/completions"
def call_qwen_model(prompt):
"""调用通义千问模型的函数"""
headers = {"Content-Type": "application/json"}
data = {
"prompt": prompt,
"max_tokens": 1024,
"temperature": 0.7,
"stop": ["<|endoftext|>"]
}
try:
response = requests.post(MODEL_API_URL, headers=headers, json=data)
response.raise_for_status()
result = response.json()
return result['choices'][0]['text']
except Exception as e:
return f"调用模型时出错: {str(e)}"
@cl.on_chat_start
async def start_chat():
"""聊天开始时初始化"""
tools = [
Tool(
name="Qwen模型",
func=call_qwen_model,
description="用于调用通义千问模型进行文本生成"
)
]
# 设置系统提示词
system_prompt = """你是一个有帮助的AI助手,基于通义千问模型。
请用中文回答用户的问题,回答要详细、准确、有帮助。"""
await cl.Message(content="你好!我是基于通义千问的AI助手,有什么可以帮你的吗?").send()
@cl.on_message
async def main(message: cl.Message):
"""处理用户消息"""
user_input = message.content
# 调用模型生成回复
response = call_qwen_model(user_input)
# 发送回复给用户
await cl.Message(content=response).send()
2.3 启动Chainlit应用
保存文件后,在终端中运行:
chainlit run app.py
这会启动一个本地服务器,通常在http://localhost:8000。打开浏览器访问这个地址,就能看到聊天界面了。
3. LangChain工具调用实战
LangChain的强大之处在于能够将多个工具组合使用。下面我们实现一个更复杂的例子,展示如何让模型调用外部工具。
3.1 定义多个工具
让我们扩展工具集,加入一些实用的功能:
from datetime import datetime
import math
def get_current_time():
"""获取当前时间"""
return f"当前时间是: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
def calculate(expression):
"""执行数学计算"""
try:
# 简单的安全计算,避免执行任意代码
allowed_chars = set('0123456789+-*/(). ')
if all(c in allowed_chars for c in expression):
result = eval(expression)
return f"计算结果: {expression} = {result}"
else:
return "表达式包含不安全字符"
except:
return "计算失败,请检查表达式格式"
# 更新工具列表
tools = [
Tool(
name="Qwen模型",
func=call_qwen_model,
description="用于智能对话和知识问答"
),
Tool(
name="当前时间",
func=lambda x: get_current_time(),
description="获取当前日期和时间"
),
Tool(
name="计算器",
func=calculate,
description="执行数学计算,支持加减乘除"
)
]
3.2 实现工具选择逻辑
我们需要让模型学会根据用户问题选择合适的工具:
from langchain.prompts import StringPromptTemplate
from langchain.schema import AgentAction, AgentFinish
class CustomPromptTemplate(StringPromptTemplate):
template: str
def format(self, **kwargs) -> str:
intermediate_steps = kwargs.pop("intermediate_steps")
thoughts = ""
for action, observation in intermediate_steps:
thoughts += f"\n[思考] 我执行了: {action.log}"
thoughts += f"\n[观察] 得到了: {observation}"
kwargs["agent_scratchpad"] = thoughts
return self.template.format(**kwargs)
# 定义提示词模板
tool_template = """你是一个智能助手,可以调用以下工具:
{tools}
请根据用户问题决定是否需要调用工具,以及调用哪个工具。
用户问题: {input}
{agent_scratchpad}
"""
prompt = CustomPromptTemplate(
template=tool_template,
tools="\n".join([f"{tool.name}: {tool.description}" for tool in tools]),
input_variables=["input", "intermediate_steps"]
)
4. 完整应用示例
下面是一个完整的集成示例,展示了如何将Chainlit、LangChain和通义千问模型结合起来:
import chainlit as cl
import requests
import json
from langchain.agents import Tool, AgentExecutor
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from datetime import datetime
class QwenClient:
def __init__(self, api_url):
self.api_url = api_url
def generate(self, prompt, max_tokens=1024, temperature=0.7):
headers = {"Content-Type": "application/json"}
data = {
"prompt": prompt,
"max_tokens": max_tokens,
"temperature": temperature,
"stop": ["<|endoftext|>"]
}
try:
response = requests.post(self.api_url, headers=headers, json=data)
response.raise_for_status()
result = response.json()
return result['choices'][0]['text']
except Exception as e:
return f"错误: {str(e)}"
# 初始化客户端
qwen_client = QwenClient("http://localhost:8000/v1/completions")
@cl.on_chat_start
async def start_chat():
# 定义工具
tools = [
Tool(
name="问答助手",
func=lambda x: qwen_client.generate(x),
description="用于回答各种问题,提供信息和帮助"
),
Tool(
name="时间查询",
func=lambda x: f"当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
description="查询当前日期和时间"
)
]
# 存储工具到用户会话中
cl.user_session.set("tools", tools)
await cl.Message(content="您好!我可以帮您回答问题或查询时间。请告诉我您需要什么帮助?").send()
@cl.on_message
async def handle_message(message: cl.Message):
user_input = message.content
tools = cl.user_session.get("tools")
# 简单的工具选择逻辑
if "时间" in user_input or "几点" in user_input or "日期" in user_input:
# 使用时间工具
time_tool = next((tool for tool in tools if tool.name == "时间查询"), None)
if time_tool:
response = time_tool.func(user_input)
await cl.Message(content=response).send()
return
# 默认使用问答助手
qa_tool = next((tool for tool in tools if tool.name == "问答助手"), None)
if qa_tool:
response = qa_tool.func(user_input)
await cl.Message(content=response).send()
if __name__ == "__main__":
# 启动应用
cl.run()
5. 实际效果测试
部署完成后,让我们测试一下应用的实际效果。打开Chainlit界面,尝试问一些问题:
测试用例1:基础问答
用户:你好,能介绍一下自己吗?
AI:你好!我是基于通义千问1.8B模型的AI助手,能够回答各种问题、提供信息帮助,还可以查询时间等。有什么我可以帮你的吗?
测试用例2:工具调用
用户:现在几点了?
AI:当前时间: 2024-01-15 14:30:25
测试用例3:知识问答
用户:能解释一下机器学习是什么吗?
AI:机器学习是人工智能的一个分支,它让计算机系统能够从数据中学习并改进,而不需要显式编程。通过算法分析数据、识别模式,然后做出预测或决策...
6. 常见问题解决
在实际使用中可能会遇到一些问题,这里提供一些解决方案:
6.1 模型响应慢
如果发现模型响应速度较慢,可以尝试:
# 调整生成参数优化速度
def optimize_for_speed():
return {
"max_tokens": 512, # 减少生成长度
"temperature": 0.3, # 降低随机性
"top_p": 0.9 # 限制采样范围
}
6.2 内存不足问题
如果遇到内存不足的错误:
- 检查GPU内存使用情况
- 减少批量处理的大小
- 确保模型正确量化(使用GPTQ-Int4版本)
6.3 API连接问题
如果无法连接到模型API:
# 检查模型服务状态
curl http://localhost:8000/health
# 查看服务日志
tail -f /root/workspace/llm.log
7. 总结
通过本教程,我们成功实现了:
- 模型部署:使用vLLM部署了通义千问1.8B-GPTQ-Int4量化模型
- 前端集成:用Chainlit构建了美观的聊天界面
- 工具调用:通过LangChain实现了智能工具选择和使用
- 实战应用:创建了一个完整的AI助手应用
这个方案的优势在于:
- 资源高效:量化后的模型大幅降低显存需求
- 易于使用:Chainlit提供开箱即用的聊天界面
- 灵活扩展:LangChain架构便于添加新工具和功能
- 部署简单:所有组件都可以容器化部署
你可以在此基础上进一步扩展功能,比如添加数据库查询、网络搜索、文件处理等更多工具,打造更强大的AI应用。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)