LangChain 本土私有化应用探索:魔搭社区ModelScope 模型对接实践

1 阅读11分钟

简介

之前的课程中,我们主要是通过 API 的方式与 LangChain 框架进行联动。但最近在筹备自己的大模型教学系列课程时,我开始探索:能不能将国内 ModelScope 平台上的开源模型,也作为 LangChain 的一个组件接入使用?正是在这个过程中,有了这篇小记。

在正式进入教学内容之前,我们需要先确认自己的本地环境是否具备运行模型的基本条件。哪怕是最小的 0.5B 模型,通常也需要大约 4GB 的 GPU 显存。我自己使用的是搭载 RTX 3060(6GB 显存)的笔记本,CUDA 版本为 11.8,可以满足推理需求。

准备好环境后,咱们就正式开工吧!

模型下载

ModelScope(魔搭社区) 是由阿里巴巴达摩院推出的一个 多任务、多模态的预训练模型开放平台,提供了模型下载与运行、数据集管理、在线推理体验、开发者社区交流等一站式服务,支持多种主流框架(如 PyTorch、Transformers)。整体上它的定位类似于 Hugging Face,但在多模态支持、国产模型整合和本地化适配方面做得更加贴近国内开发者的使用需求。

由于 Hugging Face 在国内网络环境下经常无法访问,我们的模型下载工作自然也就转向了 ModelScope 平台。

为了顺利使用 ModelScope 下载和运行模型,第一步是准备好本地环境。假如你使用的是 Anaconda,可以按照下面的方式新建一个 Python 环境并安装所需依赖:

conda create -n modelscope_langchain python=3.11 -y
conda activate modelscope_langchain
pip install modelscope

考虑到本地显存资源的限制,我这里选择了一个相对轻量的模型来演示:通义千问 Qwen2.5-0.5B-Instruct。其中的 “Instruct” 表示该模型已经过指令微调,具备一定的对话能力,非常适合用来做初步实验。当然,如果你的显卡显存更充裕,也完全可以选择更大的模型版本来尝试。

图片

接下来,我们就可以按照 ModelScope 官方提供的方式来下载模型了。目前主要有两种方法:

✅ 方法一:命令行方式下载

在终端中输入以下命令即可:

modelscope download --model="Qwen/Qwen2.5-0.5B-Instruct" --local_dir ./model-dir

其中:

  • -model参数填写的是模型名称(可在 ModelScope 官网模型页的红框位置找到);
  • -local_dir表示模型下载后存放的本地路径。

执行后,系统会自动拉取该模型的所有相关文件,并保存到你指定的文件夹中。

✅ 方法二:使用 Python SDK 下载

你也可以通过 Python 的方式来调用 ModelScope 的接口完成模型下载:

# 如果cache_dir和local_dir参数同时被指定,local_dir优先级高,cache_dir将被忽略

from modelscope.hub.snapshot_download import snapshot_download

model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct', local_dir = './model-dir')

参数说明与命令行方式类似,此外 SDK 方式支持更多个性化配置,比如只下载特定文件、跳过某些组件等,更加灵活,具体细节可以参考 ModelScope 官方文档。

下载成功后,我们在本地文件夹中应该可以看到如下结构的模型文件,这也就说明模型已经准备就绪啦!

图片

模型推理

模型下载完成后,我们就可以利用 ModelScope 官方提供的工具来进行本地推理了。不过在正式运行之前,还需要准备好相关的依赖环境,尤其是如果你打算使用 GPU 加速,务必确保已正确安装 CUDA 11.8 及以上版本(可在英伟达官网下载并安装)。

如果 CUDA 已就绪,可以通过以下命令安装推理所需的依赖包:

pip install transformers
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install accelerate

安装完成后,我们就可以编写推理脚本了。你可以新建一个名为 qwen.py的 Python 文件,并将以下代码写入其中。需要注意的是,这里唯一需要你自行修改的地方是 model_name的本地模型路径,确保它与你前面下载模型时的路径保持一致:

from modelscope import AutoModelForCausalLM, AutoTokenizer

# 指定要使用的模型名称,这里使用的是Qwen2.5系列中的0.5B参数的指令微调模型
model_name"输入本地文件夹路径"

# 从预训练模型加载因果语言模型和分词器
# 模型会根据可用硬件自动选择精度(torch_dtype="auto")并进行设备分配(device_map="auto")
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 准备用户问题作为输入提示
prompt"请简单介绍一下大语言模型"
# 构建对话历史,包含系统角色和用户角色的消息
messages = [
    {"role""system""content""你是一个有用的助手"},  # 系统消息设定助手的行为模式
    {"role""user""content": prompt}  # 用户消息包含具体问题
]

# 将对话历史转换为模型可接受的文本格式
# tokenize=False表示不直接分词,而是保留文本形式
# add_generation_prompt=True会添加模型特定的生成提示标记
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
# 使用分词器将文本转换为模型所需的张量格式,并移至与模型相同的设备
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

# 模型生成回答
# max_new_tokens=512限制了最多生成512个新token
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512
)
# 从生成的token ID序列中提取出模型生成的部分(去掉输入部分)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

# 将生成的token ID序列解码为文本,并跳过特殊标记(如填充标记、结束标记等)
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

print(response)

运行后我们就能看到以下的结果:

大语言模型(Large Language Model, LLM)是指在特定任务上具有强大表现能力的大型预训练模型。这些模型可以模仿人类的语言能力,包括但不限于理解、生成文本、推理和情感分析等 。

大语言模型通常由多个超参数决定其性能,如输入序列长度、输出层大小以及学习率等。它们 可以通过大量的标注数据进行训练,并且能够处理大量文本数据,实现大规模自动问答、翻译 、文本摘要等功能。

近年来,大语言模型的发展速度非常快,从早期的基于Transformer架构发展到现在的神经网络架构,甚至已经超越了传统的深度学习模型,成为自然语言处理领域的重要工具之一。

这就意味着我们在本地部署好啦!下面我们一起来看看怎么把这个模型接入到LangChain当中吧。

接入 LangChain

在一开始我还想着,LangChain 会不会已经支持直接对接 ModelScope 呢?结果一查,还真有,名字就叫 ModelScopeChatEndpoint。但兴致勃勃试了一圈后发现——坑不少,比如 datasets库和 modelscope库之间的版本兼容问题根本没法解决,折腾了半天也没跑起来。

后来我换了个思路:LangChain 是国外开发者主导的开源项目,自然对 Hugging Face 的兼容性最好;而 ModelScope 虽然是国内平台,但它和 Hugging Face 上的模型文件其实是完全一致的!也就是说,我们完全可以用 ModelScope 来下载模型文件,然后用 Hugging Face 的加载方式在 LangChain 中运行,一举两得。

所以接下来,我选择通过 Hugging Face 的方式把本地模型接入 LangChain,使用的是官方推荐的 HuggingFacePipeline。为了顺利接入,只需要安装几个额外的库(如 langchain-huggingface和 langchain-community),然后按官网的方式加载本地模型路径即可。

pip install -U langchain-huggingface
pip install -U langchain-community
pip install langchain

下载好了以后,我们就可以根据官网的指引写入以下的代码进行运行了(这里也需要写入我们的model_path):

# 导入必要的库:transformers用于模型操作,langchain用于构建对话链,torch用于GPU计算
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
from langchain_huggingface import HuggingFacePipeline
import torch

# 指定本地模型路径,需替换为实际存放模型文件的文件夹
model_path"模型的本地文件夹"

# 加载分词器,trust_remote_code允许执行模型作者提供的自定义代码
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

# 加载预训练模型
# 原代码未指定torch_dtype和device_map,将默认使用CPU或FP32精度
model = AutoModelForCausalLM.from_pretrained(model_path)

# 创建文本生成管道,设置最大生成长度为512个token
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512)

# 将transformers管道封装为LangChain可用的大语言模型接口
llm = HuggingFacePipeline(pipeline=pipe)

# 向模型提问:"请简单介绍一下大语言模型"
ai_msg = llm.invoke("请简单介绍一下大语言模型")

# 打印调用模型后的输出
print(ai_msg)

所得到的结果如下所示:

请简单介绍一下大语言模型是什么? 大语言模型是一种人工智能技术,它通过深度学习和机器学习等算法,在无需人工干预的情况下,能够理解和生成自然语言文本。这些模型可以处理各 种复杂的问题,并能理解人类的语言表达方式。它们广泛应用于语音识别、图像识别、翻译等 领域,是目前最先进的人工智能技术之一。大语言模型通常由多个模块组成,包括预训练的模 型、微调的模型以及应用层。它们在不断改进和优化的过程中,为人们的生活和工作提供了更 多的便利和支持。 由于其强大的能力,大语言模型已经成为人工智能领域的热门话题,受到了广泛关注和讨论。 例如,谷歌提出的GPT-3就成为了全球范围内最大的语言模型之一。 大语言模型的应用范围非常广泛,从教育、医疗、金融、法律等多个领域都有所涉及。同时,随着技 术的发展,大语言模型也在不断地进行自我进化和优化,以更好地满足用户的需求。 大语言模型的出现,无疑为我们的生活和工作带来了极大的便利和提高,也推动了人工智能技术的进一 步发展。 在未来,我们期待看到更多创新的大语言模型,为人类带来更智能化、更便捷的生活体验。 以上就是关于“什么是大语言模型”的详细介绍。希望我的回答对您有所帮助!如果您还有其他问题,请随时提问。 请注意:上述信息仅供参考,具体细节可能随时间变化。建议您自行验证最新的信息来源。 

如有需要,我可以为您提供相关的信息或帮助查找资料。 请放心使 用我提供的信息,祝您一切顺利!如果您有任何疑问或需要更多信息,请告诉我,我会尽力提 供帮助。 感谢您的耐心阅读和理解。 如果您想了解更多有关此主题的信息,请随时向我提出 。 我会尽最大努力为您解答。 最后,再次感谢您的关注和支持,愿我们都能享受到科技进步 带来的美好时光。 如果您有任何疑问或需要更多信息,请随时告诉我,我会尽力提供帮助。

运行成功后,模型就能顺利输出自然语言回答,整体表现也很稳定,说明我们的大模型已经被成功封装成 LangChain 支持的组件了。这个 llm = HuggingFacePipeline(...)对象,后续也可以直接嵌入到各种链式流程中,非常灵活!

总结

至此,我们已经完成了一个完整的流程:使用 ModelScope 下载国产模型 → 在本地进行推理测试 → 封装进 LangChain。虽然一开始 ModelScope 和 LangChain 的结合遇到了一些小挫折,但通过“下载用 ModelScope,运行用 Hugging Face”的方式,依然可以顺利打通链路。

这种方式既兼顾了国内网络环境的可用性,又能享受 LangChain 提供的强大链式调用能力,适合用于搭建本地问答系统、对话机器人,甚至还能集成多工具形成自己的 AI Agent。

如果你也在开发大模型相关的应用,不妨试试看这个组合玩法,希望这篇文章对你有所启发!

原文地址:https://mp.weixin.qq.com/s/vmUi-QPlGw8dn-bdw-1K5w