LLM大模型教程:langchain 教程

news2025/3/17 14:08:14

软件安装

pip install pymupdf
pip install langchain
pip install langchain-cli
conda install -c pytorch -c nvidia faiss-gpu=1.7.4 mkl=2021 blas=1.0=mkl

由于langchain不支持qwen模型,我们需要自定义模型

from typing import Any

from langchain_core.language_models import LLM
from transformers import AutoTokenizer, AutoModelForCausalLM

class QwenLLM(LLM):
    model: Any = None
    tokenizer: Any = None
    device: str = None

    @classmethod
    def from_model_id(
            cls,
            model_id: str):
        model = AutoModelForCausalLM.from_pretrained(
            model_id,
            torch_dtype="auto",
            trust_remote_code=True,
            device_map="auto"
        )
        device = "cuda"
        tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
        return cls(
            model=model,
            device=device,
            tokenizer=tokenizer
        )

    @property
    def _llm_type(self) -> str:
        return "qwen"

    def _call(self, prompt: str, **kwargs: Any) -> str:
        messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
        ]

        text = self.tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True
        )
        model_inputs = self.tokenizer([text], return_tensors="pt").to(self.device)

        generated_ids = self.model.generate(
            model_inputs.input_ids,
            max_new_tokens=512
        )
        generated_ids = [
            output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
        ]

        return self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

langchain 查询代码

from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain_core.messages import HumanMessage, AIMessage
from qwen_llm import QwenLLM

def main():
    llm = QwenLLM.from_model_id(
        model_id="/home/chuan/models/qwen/Qwen1___5-7B-Chat-GPTQ-Int4")

    loader = PyMuPDFLoader("./汽车知识.pdf")
    docs = loader.load()

    embeddings = HuggingFaceEmbeddings(model_name="/home/chuan/models/BAAI/bge-m3")

    text_splitter = RecursiveCharacterTextSplitter(chunk_size=256)
    documents = text_splitter.split_documents(docs)
    vector = FAISS.from_documents(documents, embeddings)

    prompt = ChatPromptTemplate.from_template("""
    请根据提供的知识回答问题:
    <知识>
    {context}
    </知识>
    问题: {input}""")

    document_chain = create_stuff_documents_chain(llm=llm, prompt=prompt)

    retriever = vector.as_retriever()
    retrieval_chain = create_retrieval_chain(retriever, document_chain)

    response1 = retrieval_chain.invoke({"input": "什么是自动驾驶?"})
    print(response1["answer"])

    prompt = ChatPromptTemplate.from_messages([
        ("system", "请根据提供的知识回答问题:\n\n{context}"),
        MessagesPlaceholder(variable_name="chat_history"),
        ("user", "{input}"),
    ])
    document_chain = create_stuff_documents_chain(llm=llm, prompt=prompt)
    retrieval_chain = create_retrieval_chain(retriever, document_chain)

    chat_history = [HumanMessage(content="什么是自动驾驶?"), AIMessage(content=response1["answer"])]
    response2 = retrieval_chain.invoke({
        "chat_history": chat_history,
        "input": "怎么进行自动驾驶呢?"
    })
    print(response2["answer"])

if __name__ == '__main__':
    main()

整体流程:

  1. 初始化langchain 模型
  2. 加载知识库文档
  3. 分割文档
  4. 加载向量数据库
  5. 存储向量数据库
  6. 准备prompt
  7. 创建 chain
  8. 调用chain的invoke 方法

langchain+chatglm.png

整个流程如图所示,图片来源于:github.com/chatchat-sp…

LCEL(Lang Chain Expression Language)的原理

在上面的例子中,我们最后生成的retrieval_chain。

document_chain的初始化

RunnablePassthrough.assign(**{DOCUMENTS_KEY: format_docs}).with_config(
        run_name="format_inputs"
    )
| prompt
| llm
| _output_parser

在上面的代码中,我们总共组合了几种链的结构,即LCEL,为什么langchain可以用链式结构,是因为

在python中,运算符 | 实际上调用的是__or__方法

先看一下我们自定的QwenLLM的类关系图

2024-02-20_17-05.png

在父类方法中,可以看到 __or__方法的源码

class Runnable(Generic[Input, Output], ABC):
    def __or__(
        self,
        other: Union[
            Runnable[Any, Other],
            Callable[[Any], Other],
            Callable[[Iterator[Any]], Iterator[Other]],
            Mapping[str, Union[Runnable[Any, Other], Callable[[Any], Other], Any]],
        ],
    ) -> RunnableSerializable[Input, Other]:
        """Compose this runnable with another object to create a RunnableSequence."""
        return RunnableSequence(self, coerce_to_runnable(other))

class RunnableSequence(RunnableSerializable[Input, Output]):  
    def __or__(
        self,
        other: Union[
            Runnable[Any, Other],
            Callable[[Any], Other],
            Callable[[Iterator[Any]], Iterator[Other]],
            Mapping[str, Union[Runnable[Any, Other], Callable[[Any], Other], Any]],
        ],
    ) -> RunnableSerializable[Input, Other]:
        if isinstance(other, RunnableSequence):
            return RunnableSequence(
                self.first,
                *self.middle,
                self.last,
                other.first,
                *other.middle,
                other.last,
                name=self.name or other.name,
            )
        else:
            return RunnableSequence(
                self.first,
                *self.middle,
                self.last,
                coerce_to_runnable(other),
                name=self.name,
            )
            
    @property
    def steps(self) -> List[Runnable[Any, Any]]:
        """All the runnables that make up the sequence in order."""
        return [self.first] + self.middle + [self.last]

实际上整个链会被添加到steps方法中

实际上我们调用 invoke方法会直接调用所有的steps

def invoke(self, input: Input, config: Optional[RunnableConfig] = None) -> Output:
    try:
        for i, step in enumerate(self.steps):
            input = step.invoke(
                input,
                # mark each step as a child run
                patch_config(
                    config, callbacks=run_manager.get_child(f"seq:step:{i+1}")
                ),
            )

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

‌Python开发者必学:如何优雅地绕过round函数的四舍五入陷阱

引言 在最近交付测试的一个功能中&#xff0c;测试同学反馈一个数据统计四舍五入的问题&#xff0c;问题有点魔性&#xff1a;同样的条件&#xff0c;有的值可以四舍五入成功&#xff0c;有的值直接被舍弃。 例如2.5四舍五入整数直接变成了2&#xff1b;3.5却变成了4。因为使用…

IDEA 模板配置

IDEA 模板配置 一、tkMapper通用mapper配置 1 新建配置文件generatorConfig.xml&#xff0c;路径src/main/resources/generator/generatorConfig.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-…

基于单片机的多功能电子钟设计

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP…

C学习(数据结构)-->排序

目录 一、直接插入排序 二、希尔排序 三、直接选择排序 四、快速排序 1、取基准值 1&#xff09;hoare找基准值​编辑 2&#xff09; 挖坑法找基准值​编辑 3&#xff09;快慢指针找基准值​编辑 2、递归快速排序 3、非递归快速排序 ​编辑 五、归并排序 ​编辑 六、计…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月7日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月7日 星期六 农历八月初五 白露 1、 司法部&#xff1a;遏制地方乱发文、出台“奇葩”政策文件等情况。 2、 证监会&#xff1a;拉长离职人员入股禁止期至10年&#xff0c;扩大对离职人员从严监管范围。 3、 全国医护比…

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能&#xff0c;可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下&#xff0c;系统应用…

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)

超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平&#xff0c;所以直接设置成 普通的GPIO端口即可&#xff1b;回响信号使用外部中断&#xff0c;上升沿信号产生外部中断&#xff0c;打开定时器&#xff0c;下降沿再产生一次中断&#xff0c;读…

飞特STS3315基本使用方法

宁天道/FeelECH 01-介绍 串口总线舵机&#xff0c;可以通过一根线将多个舵机串联在一起&#xff0c;一个串口线片可以控制所有的舵机。 内带闭环&#xff0c;可以自定义舵机移动的最大速度&#xff0c;加速度&#xff0c; 可以修改各种模式&#xff0c;满足各种各样的需求&…

OTN光传送网-介绍

1. 引用 OTN光传送网--华为设备_otn传输设备建设方案-CSDN博客 OTN光传送网&#xff08;Optical Transport Network&#xff09;&什么是OTN-CSDN博客 https://zhuanlan.zhihu.com/p/403304019 术语&#xff1a; 英文缩写描述灰光模块彩光模块CWDM&#xff1a;Coarse Wa…

欺诈文本分类检测(十三):交叉训练验证

1. 引言 交叉验证主要讨论的是数据集的划分问题。 通常情况下&#xff0c;我们会采用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集&#xff0c;这三个集合不能有交集&#xff0c;常见的比例是8:1:1&#xff08;如同前文我们所作的划分)。这三个数据集…

吉利星座03组卫星发射

北京时间2024年9月6日2时30分&#xff0c;在太原卫星发射中心使用长征六号运载火箭&#xff0c;成功将民营“中国星链”——吉利未来出行星座第三个轨道面、吉利星座03组卫星发射升空&#xff0c;10颗卫星顺利进入预定轨道&#xff0c;发射任务获得圆满成功。此次任务是长征系列…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代&#xff0c;‌飞思相机以其卓越的成像质量和专业的性能&#xff0c;‌赢得了众多摄影师的青睐。‌然而&#xff0c;‌即使是专业的设备也难免遭遇数据丢失的困境&#xff0c;‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难&#xff0c;‌许多摄影师…

qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换

为了更清晰地解释场景坐标与局部坐标之间的转换过程&#xff0c;我们可以通过一个简单的实例来演示如何赋值场景坐标&#xff0c;并将其转换为图形项的局部坐标。 实例步骤 假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem&#xff0c;矩形的大小为 1…

Redis进阶(六):缓存

1.缓存 速度快的设备可以作为速度慢的设备的缓存 缓存能够有意义&#xff1a;二八定律&#xff0c;20%的数据可以应对80%的请求 通常使用redis作为数据库的缓存&#xff08;mysql&#xff09; 数据库是非常重要的组件&#xff0c;mysql速度比较慢 因为mysql等数据库&#x…

【 C++ 】类和对象的学习(三)

前言&#xff1a; &#x1f618;我的主页&#xff1a;OMGmyhair-CSDN博客 目录 一、初始化列表 二、类型转换 三、static成员 四、友元 五、内部类 六、匿名对象 一、初始化列表 当我们之前在写构造函数时&#xff0c;我们通常在构造函数内对成员变量进行赋值。但其实还…

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点&#xff1a; 第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲&#xff0c;本课时知识点会涉及案例分析题&#xff08;25分&#xff09;。在历年考试中&#xff0c;案例题对该部分内容都有固定考查&#xff0c;综合知识选择题目中有固定分值…

北大港中文腾讯提出ViewCrafter:一张图像就可以制作影视特效和游戏画面!

北大和港中文联合腾讯人工智能实验室提出了 ViewCrafter&#xff0c;这是一种利用视频扩散模型的先验从单个或稀疏图像合成一般场景的高保真新视图的新方法。 可以简单理解为将复杂的图像转换成新角度的图像版本。首先&#xff0c;它会使用特殊的算法来读取一张或几张图像&…

SpringBoot项目-实现简单的CRUD功能和分页查询

背景 本博文主要是创建了一个新的SpringBoot项目&#xff0c;实现基本的增删改查&#xff0c;分页查询&#xff0c;带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码&#xff0c;读者可根据博文&#xff0c;从自己动手创建一个新的SpringBoot项目…

Scratch教师节 —— 感恩教师节

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! Scratch教师节动画作品——感恩教师节 在这个特别的日子里&#xff0c;我们迎来了教师节。为了表达对老师们的感激之情&#xff0c;Scratch平台上的小朋友们用创意与热情制作了精彩的动画作品——“感恩教师节”。…

在国产芯片上实现YOLOv5/v8图像AI识别-【4.3】RK3588使用yolov8+bytetrack实现跟踪更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 背景…