使用 Qwen2.5-7B 进行推理与知识检索的实践

效果展示

说明

本代码的主要目标是使用 Qwen2.5-7B 进行推理,就是让模型在给定输入的情况下,生成合理的文本输出,而非训练模型。

为什么选择推理而非训练?

在实际应用开发过程中,我们都希望模型具备特定领域的专业知识。然而,直接训练一个大语言模型需要大量的数据、计算资源和时间,对于大多数应用来说并不现实。所以推理更适用于实际开发场景。推理是指直接使用已经预训练好的模型来处理输入数据,并获取输出结果,而不是对模型进行参数更新。

如何让模型具备专业知识?

在推理过程中,我们通常结合 知识库检索(RAG),让大模型具备领域知识,而无需重新训练。

本次通过 LangChain 框架,实现了以下流程:

  1. 加载模型:从 Hugging Face 下载 Qwen2.5-7B 模型,并加载到 GPU。
  2. 文本生成:使用 transformers.pipeline 进行推理。
  3. 知识增强
    • 爬取网页数据(如 DeepSeek 官网内容),构建知识库。
    • 文本切割:使用 RecursiveCharacterTextSplitter 处理文本,使其适合索引。
    • 生成 Embeddings:使用 HuggingFaceEmbeddings 将文本转换为向量。
    • 存入 FAISS 索引:建立高效的向量检索数据库。
    • 对话检索链:通过 ConversationalRetrievalChain,让 LLM 结合知识库进行查询。

 环境配置

在开始之前,请确保环境满足以下要求:

  • Python 版本:3.10.16
  • 依赖库安装:
pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -U transformers accelerate huggingface_hub
pip install -U langchain langchain_huggingface

获取 Hugging Face Access Token

在使用 Hugging Face 模型时,需要进行身份认证,获取 access token。

  1. 访问 Hugging Face 官网:https://huggingface.co
  2. 登录或注册账号。
  3. 进入 Settings 页面。
  4. Access Tokens 部分,点击 New Token 按钮。
  5. 选择适当的权限(通常选择 read 权限即可),然后创建 token。
  6. 复制生成的 token,并在代码中使用:
    import os
    os.environ["HF_TOKEN"] = "your_huggingface_token_here"
    

代码核心实现

1. 加载模型

我们将 Qwen2.5-7B-Instruct-1M 加载到 GPU,并设置推理参数。

import os
import torch
import transformers
from transformers import StoppingCriteria, StoppingCriteriaList

# 确保 Hugging Face 认证
os.environ["HF_TOKEN"] = "your_huggingface_token"

# 选择模型
model_id = "Qwen/Qwen2.5-7B-Instruct-1M"

# 确保 GPU 可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 加载模型
torch_dtype = torch.float16  # 推荐 float16 以减少显存占用
model = transformers.AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    torch_dtype=torch_dtype,
    device_map="auto"
)
model.eval()

# 加载分词器
tokenizer = transformers.AutoTokenizer.from_pretrained(model_id)
2. 定义停止条件

为了优化对话流畅性,我们定义一个 StoppingCriteria,确保生成文本在遇到特定的停止词时终止。

stop_list = ['\nHuman:', '\n```\n']
stop_token_ids = [tokenizer(x)["input_ids"] for x in stop_list]
stop_token_ids = [torch.tensor(x, dtype=torch.long, device=device) for x in stop_token_ids]

class StopOnTokens(StoppingCriteria):
    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
        for stop_ids in stop_token_ids:
            if input_ids.shape[1] >= len(stop_ids) and torch.all(input_ids[0, -len(stop_ids):] == stop_ids):
                return True
        return False

stopping_criteria = StoppingCriteriaList([StopOnTokens()])
3. 创建 pipeline 进行推理

使用 transformers.pipeline 创建生成文本的 pipeline,并测试一个简单的输入。

generate_text = transformers.pipeline(
    task="text-generation",
    model=model,
    tokenizer=tokenizer,
    return_full_text=True,
    stopping_criteria=stopping_criteria,
    temperature=0.1,
    max_new_tokens=512,
    repetition_penalty=1.1
)

res = generate_text("deepseek是什么")
print(res[0]["generated_text"])
4. 爬取网页数据并构建知识库

使用 LangChain 读取网页数据,并创建 FAISS 向量数据库。

from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import ConversationalRetrievalChain

# 爬取网页数据
web_links = ["https://www.deepseek.com/"]
try:
    loader = WebBaseLoader(web_links)
    documents = loader.load()
except Exception as e:
    print(f"WebBaseLoader 错误: {e}")
    documents = []

# 文本切割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
all_splits = text_splitter.split_documents(documents)

# 加载 Embeddings
model_name = "sentence-transformers/all-mpnet-base-v2"
embeddings = HuggingFaceEmbeddings(model_name=model_name, model_kwargs={"device": device})

# 构建 FAISS 索引
vectorstore = FAISS.from_documents(all_splits, embeddings)
5. 创建对话检索链

我们将 generate_text 适配到 LangChain,并结合 FAISS 索引实现知识检索。

from langchain_huggingface import HuggingFacePipeline

# 创建 LLM 接口
llm = HuggingFacePipeline(pipeline=generate_text)

# 创建对话检索链
chain = ConversationalRetrievalChain.from_llm(
    llm, retriever=vectorstore.as_retriever(), return_source_documents=True
)

# 进行查询
chat_history = []
query = "deepseek是什么"
result = chain.invoke({"question": query, "chat_history": chat_history})

# 输出结果
print(result["answer"])

总结

  • 直接训练 LLM 需要高昂的计算资源,通常不适用于实际开发。
  • 采用推理结合 RAG(知识增强)的方法,可以让模型回答特定领域的问题。
  • 通过爬取网页等方式构建向量数据库(FAISS),我们可以动态扩展模型的知识范围。
  • 这种方法适用于问答机器人、知识管理系统等场景,能够提供更符合业务需求的回答。

这种方式不仅高效,而且成本远低于重新训练一个大模型。如果你有更深层次的需求,也可以尝试 Fine-tuning,但一般情况下,推理 + RAG 已经能解决大部分问题。

### 不同DeepSeek模型的核心功能、适用场景及优缺点 DeepSeek 是一系列基于 Transformer 的大型语言模型,旨在提供高性能的语言理解和生成能力。以下是几种主要的 DeepSeek 模型及其核心功能、适用场景以及各自的优缺点。 #### 1. **DeepSeek-Large** - **核心功能**: 这一版本提供了强大的基础性能,在多种自然语言处理任务上表现出色,例如文本分类、情感分析和问答系统[^1]。 - **适用场景**: 主要用于学术研究和技术开发环境下的通用 NLP 应用程序。适合需要高精度但计算资源有限的情况。 - **优点**: - 较低的成本运行复杂任务; - 能够快速适应新领域的小样本学习需求; - 更好的泛化能力和鲁棒性。 - **缺点**: - 对于极端复杂的多模态任务可能表现不足; - 需要进一步优化才能达到最佳效果。 #### 2. **DeepSeek-Max** - **核心功能**: 提供更高的参数量和支持更大的训练数据集,从而增强了其在大规模语料库上的理解力创造力。 - **适用场景**: 广泛应用于创意写作、高级对话代理等领域,尤其适用于那些对响应质量有极高要求的应用场合。 - **优点**: - 极高的表达能力和灵活性; - 可以更好地捕捉细微差别并生成更高质量的内容; - 支持更多样化的输入形式(如表格、图片描述等)。 - **缺点**: - 计算开销较大,部署成本较高; - 存储空间占用较多。 #### 3. **DeepSeek-NL** - **核心功能**: 特别针对特定国家或地区的本地化需求设计而成,能够很好地支持当地语言特性及相关文化背景的知识检索和服务供给[^3]。 - **适用场景**: 常见于国际化企业内部沟通工具定制化解决方案或者跨国电商平台客户服务自动化流程构建当中。 - **优点**: - 出色的文化敏感度和区域适配水平; - 显著提升了跨文化交流效率的同时降低了误解风险; - 用户体验更加贴近实际生活情境。 - **缺点**: - 如果目标市场范围过广,则难以全面覆盖所有细节差异; - 更新维护频率需保持高位以免落后于最新趋势变化。 ```python import deepseek as ds # Example usage of a DeepSeek model for text generation. model = ds.Model('deepseek-max') output = model.generate("Write an essay about artificial intelligence.", max_length=500) print(output) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值