07LangChain实战课 - LLM模块使用与自定义模型调用

81 阅读5分钟

我正在参加「豆包MarsCode AI练中学体验活动」详情请看:掘金小册上线 AI练中学功能 | 你的 AI 编程助教喊你免费领小册啦!

LangChain实战课 - LLM模块使用与自定义模型调用

1. 课程简介

  • 本节课聚焦于LangChain中的LLM(Large Language Model)模块,探讨如何使用不同的大语言模型,包括开源模型和自定义模型。

2. 大语言模型的发展

  • Transformer架构:Google在2018年提出的架构,是现代预训练模型的核心。
  • 基础模型:基于Transformer预训练的大规模语言模型,学习词汇、语法等语言知识。
  • BERT:早期代表性模型,通过学习文本的前后文信息,实现句子结构的深入理解。

3. 预训练与微调

  • 预训练:在大规模无标注数据上训练,学习通用语言知识。
  • 微调:在预训练模型基础上,针对特定任务进行调整,适应特定需求。

4. 使用开源模型

  • HuggingFace:提供多种开源模型和工具,简化模型调用和部署。
  • Llama2:Meta(Facebook)推出的模型,可通过HuggingFace下载和使用。

5. 调用Llama2模型

  • 安装HuggingFace库:使用pip install transformers安装。
  • 设置API Token:在命令行中运行huggingface-cli login
  • 代码示例
    from transformers import AutoTokenizer, AutoModelForCausalLM
    tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
    model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device_map='auto')
    inputs = tokenizer("请给我讲个玫瑰的爱情故事?", return_tensors="pt").to("cuda")
    outputs = model.generate(inputs["input_ids"], max_new_tokens=2000)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    print(response)
    

6. LangChain与HuggingFace集成

  • HuggingFace Hub:通过HuggingFace Hub集成模型,简化下载和使用流程。
  • HuggingFace Pipeline:简化NLP任务的使用流程,无需深入了解模型细节。

7. 调用自定义语言模型

  • 自定义LLM类:继承自LangChain的LLM基类,实现_call方法进行模型调用。
  • 代码示例
    from langchain.llms.base import LLM
    class CustomLLM(LLM):
        def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
            llm = Llama(model_path=MODEL_PATH+MODEL_NAME, n_threads=4)
            response = llm(f"Q: {prompt} A: ", max_tokens=256)
            output = response['choices'][0]['text'].replace('A: ', '').strip()
            return output[len(prompt)+5:]
    

8. 总结

  • 本节课介绍了大模型的训练、微调和量化,以及如何在LangChain中使用不同的模型。
  • 强调了PyTorch、HuggingFace和LangChain在AI模型开发中的重要性。

9. 思考题

  1. 何时使用OpenAI的API?何时使用开源模型或自定义模型?
  2. 使用HuggingFace的Transformers库下载新模型进行推理,比较性能。
  3. 在LangChain中使用HuggingFaceHub和HuggingFace Pipeline调用最流行的大语言模型。
思考题解答
1. 何时使用OpenAI的API?何时使用开源模型或自定义模型?

使用OpenAI的API、开源模型或自定义模型的选择取决于多个因素:

  • OpenAI的API

    • 便捷性:如果你需要快速部署模型并且不想自己管理基础设施,OpenAI的API是一个便捷的选择。
    • 性能和可靠性:OpenAI提供的模型通常经过了广泛的测试和优化,可以提供较高的性能和可靠性。
    • 安全性:对于需要高安全性和隐私保护的应用,OpenAI的API可以提供更好的数据保护。
    • 商业支持:如果你需要商业级别的支持和服务,OpenAI的API可能是更好的选择。
  • 开源模型

    • 成本效益:开源模型可以减少成本,因为它们通常是免费的或者成本较低。
    • 定制化:如果你需要对模型进行特定的定制化修改,开源模型提供了这种灵活性。
    • 社区支持:开源模型通常有活跃的社区,可以帮助解决使用过程中的问题。
  • 自定义模型

    • 特定需求:当你有非常特定的业务需求,而现有的模型无法满足时,自定义模型可以提供针对性的解决方案。
    • 数据隐私:如果你对数据隐私有严格要求,不希望数据离开你的服务器,自定义模型可以在本地部署。
    • 控制权:自定义模型允许你完全控制模型的训练和部署过程。
2. 使用HuggingFace的Transformers库下载新模型进行推理,比较性能。

要使用HuggingFace的Transformers库下载新模型并进行推理比较性能,可以按照以下步骤操作:

  • 安装Transformers库

    pip install transformers
    
  • 选择模型:根据需求选择一个或多个模型进行比较。

  • 加载模型并进行推理

    from transformers import AutoModel, AutoTokenizer
    
    # 以bert-base-uncased和distilbert-base-uncased为例
    model_names = ["bert-base-uncased", "distilbert-base-uncased"]
    
    for model_name in model_names:
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        model = AutoModel.from_pretrained(model_name)
        
        # 假设输入文本
        input_text = "The quick brown fox jumps over the lazy dog"
        inputs = tokenizer(input_text, return_tensors="pt")
        outputs = model(**inputs)
        
        # 打印模型名称和推理结果的某些指标
        print(f"Model: {model_name}")
        print(f"Outputs: {outputs}")
    
  • 性能比较:可以通过比较模型的推理时间、资源消耗(如GPU/CPU使用率)和结果的准确性来进行性能比较。

3. 在LangChain中使用HuggingFaceHub和HuggingFace Pipeline调用最流行的大语言模型。

在LangChain中使用HuggingFaceHub和HuggingFace Pipeline调用模型的步骤如下:

  • 安装LangChain

    pip install langchain
    
  • 使用HuggingFaceHub

    from langchain.chains import HuggingFaceHubChain
    from langchain.llms import HuggingFaceHub
    
    # 初始化HuggingFaceHub
    hfh = HuggingFaceHub(repo_id="bigscience/bloom-3b")
    
    # 创建链
    hfh_chain = HuggingFaceHubChain(llm=hfh)
    
    # 调用链
    result = hfh_chain.run("Tell me a joke")
    print(result)
    
  • 使用HuggingFace Pipeline

    from langchain.chains import HuggingFacePipelineChain
    from transformers import pipeline
    
    # 创建pipeline
    pipeline_model = pipeline("text-generation", model="bigscience/bloom-3b")
    
    # 创建链
    pipeline_chain = HuggingFacePipelineChain(pipeline=pipeline_model)
    
    # 调用链
    result = pipeline_chain.run("Tell me a joke")
    print(result)
    
  • 比较两种方法:可以通过比较两种方法的易用性、灵活性和性能来决定在不同场景下使用哪种方法。

10. 延伸阅读

  • Llama2、HuggingFace Transformer文档、PyTorch官方教程、AutoGPTQ、Llama CPP。

这节课内容丰富,涵盖了大模型的多个方面,从理论到实践,为深入理解大模型提供了全面的视角。通过实际操作和代码示例,学员可以更好地掌握如何在实际项目中应用这些知识。