大模型:LangChain技术讲解

一、什么是LangChain

1、介绍

LangChain是一个用于开发由大型语言模型提供支持的Python框架。它提供了一系列工具和组件,帮助我们将语言模型集成到自己的应用程序中。
有了它之后,我们可以更轻松地实现对话系统、文本生成、文本分类、问答系统等功能。

2、LangChain官网文档

官网:https://python.langchain.com/docs/introduction/

3、LangChain的核心组件

  • 语言模型(Model):如OpenAI的GPT-3。
  • 提示管理(Prompt):Prompt管理。
  • 链(chain):允许将多个组件(如语言模型、提示模板、记忆等)串联起来,形成一个工作流。
  • 记忆(Memory):记忆模块用于保存对话历史或上下文信息,以便在后续对话中使用。
  • 代理(Agent):代理是一种智能组件,可以根据用户的输入自动选择和执行不同的操作。
  • 工具(Tool):工具是一些内置的功能模块,如文本处理工具、数据查询工具等。

二、语言模型

1、介绍

把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。以下是使用语言模型从输入到输出的基本流程:
在这里插入图片描述
一下是对每一块的总结:

  • Format(格式化):将原始数据格式化成模型可以处理的形式,插入到一个模版问题中,然后送入模型进行处理。
  • Predict(预测):接受被送进来的问题,然后基于这个问题进行预测或生成回答。
  • parse(生成):预测输出被进一步格式化成一个结构化的JSON对象。

2、单轮对话

3、多轮对话

# 1、创建模型
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_ollama import ChatOllama

ollama = ChatOllama(base_url='http://localhost:11434', model="qwen2")

messages = [
    SystemMessage(content="你是langchain的课程助理。"),
    HumanMessage(content="我是学员,我叫 Tom"),
    AIMessage(content="欢迎"), # 提前模拟场景,为后续交互做准备
    HumanMessage("我是谁,你是谁")
]

print(ollama.invoke(messages).content)

通过这种方式,我们可以:

  • 测试AI模型在特定上下文下的表现。
  • 确保AI模型能够正确理解并响应用户的输入。
  • 调整和优化对话流程,以便在实际应用中提供更好的用户体验。

三、Prompt模板封装

Prompt作为输入的控制是相当重要的。langchain也提供了多种管理方法

1、PromptTemplate

基本的提示模板,可以定义输入变量和模板文本。适用于大多数自定义的提示需求。

from langchain_core.prompts import PromptTemplate

template = """
You are an expert data scientist with an expertise in building deep Learning models. Explain the concept of {concept} in a couple of lines
"""

# 实例化模版的第一种方式
one_prompt = PromptTemplate(template = template, input_variables=["concept"])

# 实例化模版的第二种方式
two_prompt = PromptTemplate.from_template(template)

# 将用户的输入通过format方法嵌入提示模版,并且做格式化处理
final_prompt = two_prompt.format(concept = "hello")
print(final_prompt)


2、ChatPromptTemplate

针对聊天场景的提示模板,支持定义多个角色的消息(用户、AI和系统)

from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate

template = """
You are an expert data scientist with an expertise in building deep learning models.
"""

system_message_prompt = SystemMessagePromptTemplate.from_template(template)

human_template = """
Explain the concept of {concept} in a couple of lines
"""

human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([
    system_message_prompt,
    human_message_prompt
])

print(chat_prompt.format_prompt(concept = "hello").to_string())

3、FewShotPromptTemplate

Prompt中给几个例子可以让大模型更好地生成正确的结果。这个模板就是给例子的。

from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_ollama import ChatOllama

examples = [
    {"input":"高", "output":"矮"},
    {"input":"胖","output":"瘦"},
    {"input":"精力充沛","output":"萎靡不振"},
    {"input":"快乐","output":"伤心"},
    {"input":"黑", "output":"白"}
]

example_prompt = PromptTemplate(input_variables=["input","output"], template="""
词语:{input}\n
反义词:{output}\n
""")

example_message = example_prompt.format(**examples[0])
#print(example_message)

few_shot_prompt = FewShotPromptTemplate(
    examples = examples,
    example_prompt = example_prompt,
    example_separator = "\n",
    prefix = "来玩个反义词接龙游戏,我说词语,你说它的反义词\n",
    suffix = "现在轮到你了,词语:{input}\n反义词:",
    input_variables = ["input"]
)

ollama = ChatOllama(base_url='http://localhost:11434', model="qwen2")
chain = few_shot_prompt | ollama
print(chain.invoke("精力充沛"))

4、文档模板

simple_prompt.json

{
	"_type":"prompt",
	"input_variables":[
		"name",
		"love"
	],
	"template":"我的名字叫{name},我喜欢{love}"
}

四、格式化输出

1、列表解析器(CommaSeparatedListOutputParser)

CSV parser当您想要返回以逗号分隔的项目列表时,可以使用此输出解析器。

from langchain_core.output_parsers import CommaSeparatedListOutputParser

output_parser = CommaSeparatedListOutputParser()
# 返回一些指令或模版,这些指令告诉系统如何解析或格式化输出数据
print(output_parser.get_format_instructions())

# 输入的字符串按照特定的规则进行解析和转换
reply = 'foo,bar,baz'
print(output_parser.parse(reply))

在这里插入图片描述

2、日期时间解析器(DatetimeOutputParser)

该输出解析器演示如何将LLM输出解析为日期时间格式。

3、枚举解析器

4、自动修复解析器

5、Pydantic(JSON)解析器

6、重试解析器

7、结构化输出解析器 structured

五、检索

1、介绍

许多LLM应用程序需要用户特定数据,这些数据不是模型的训练集的一部分. 完成这一任务的主要方法是通过检索增强生成(RAG). 在此过程中,检索外部数据,然后在生成步骤中将其传递给LLM。
LangChain为RAG应用程序提供了所有的构建模块-从简单到复杂. 本文档部分涵盖了与检索步骤相关的所有内容,例如数据的获取. 虽然听起来很简单,但可能有微妙的复杂性. 这涵盖了几个关键模块。
在这里插入图片描述

2、文档加载器

从许多不同来源加载文档. LangChain提供了100多种不同的文档加载器,并与空间中的其他主要提供商(如AirByte和Unstructured)集成. 我们提供了加载各种类型文档(HTML、PDF、代码)的集成,从各种位置(私人S3存储桶、公共网站)加载.主要支持一下文档:

  • CSV
  • HTML
  • JSON
  • Markdown
  • PDF

3、文本嵌入模型

检索的另一个关键部分是为文档创建嵌入. 嵌入捕捉文本的语义含义,使您能够快速高效地查找其他相似的文本. LangChain与25多个不同的嵌入提供商和方法进行集成, 从开源到专有API, 使您能够选择最适合您需求的一种. LangChain提供了标准接口,使您可以轻松切换模型。

在深度学习和自然语言处理领域,嵌入(Embedding)是一种将文本数据转换为浮点数值表示形式的技术,它能够分析两段文本之间的相关性。嵌入的一个典型的例子是词嵌入,这种嵌入将每个词映射到多维空间中的一个点,使得语义上相似的词在空间中的距离更近。

4、向量存储库

当使用文本嵌入模型得到浮点数列表即向量后,使用向量存储库进行存储。对于开发者来说,使用向量存储库可以极大地简化工作。开发者不需要关心如何与各个模型平台进行交互,也不需要将数据处理成其他形式。向量存储库会在底层处理数据格式转换、解析模型包装器的返回。据等各种复杂工作。

5、检索器

检索器为各种向量存储库提供了统一的标准接口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法篇】2----复写零

---------------------------------------begin--------------------------------------- 这道算法题相对于移动零,就上了一点点强度咯,不过还是很容易理解的啦~ 题目解析: 这道题如果没理解好题目,是很难的,但理解题…

office 2019 关闭word窗口后卡死未响应

最近关闭word文件总是出现卡死未响应的状态,必须从任务管理器才能杀掉word 进程,然后重新打开word再保存,很是麻烦。(#其他特征,在word中打字会特别变慢,敲击键盘半秒才出现字符。) office官网…

acm培训 part 1(学习总结)

第一部分的重点为语法糖,时空复杂度,stl容器等等,下面就简单介绍一下这些部分。 1. 语法糖 1.1 定义 语法糖是由英国计算机科学家彼得约翰兰达提出的一个术语,指的是编程语言中添加的某种语法,这种语法对语言的功能…

Arduino基础入门学习——OLED显示屏+DHT11采集温湿度并显示

Arduino基础入门学习——OLED显示屏DHT11显示温湿度 一、前言二、准备工作三、程序代码四、结束语 一、前言 本篇文章主要使用OLED液晶显示屏模块和DHT11温湿度传感器,获取环境温湿度并显示在显示屏,也算是结合之前我所编写的博客给大家带来一个算是比较…

Kubernetes相关知识入门详解

一、Pod的滚动升级 1.服务升级的一般思路:停止与该服务相关的所有服务pod,重新拉去更新后的镜像并启动。这种方法存在一个比较现实的问题是逐步升级导致较长时间的服务不可用。 2.Kubernetes滚动升级的思路:通过滚动升级的命令创建新的rc&…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控…

Qt 5.14.2 学习记录 —— 십구 事件

文章目录 1、事件的概念2、处理事件3、鼠标事件1、鼠标单击和双击2、鼠标移动3、鼠标滚轮滚动 4、键盘事件5、定时器事件6、窗口移动和大小改变事件 1、事件的概念 用户进行操作时会产生事件,事件可以关联处理函数。Qt封装了操作系统的事件机制,然后进一…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后: 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…

地学专业想提前准备春招?怎么准备自己的简历?

眼看着即将过年,过完年后基本上春招也要开始提上日程 之前咱们说过,很多同学认为自身技术过硬就会一路顺风,自己经验丰富、编程技术过硬,就不愁找不到工作,这固然是取得好offer的基础。 但再好的技术也不可能通过混乱…

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库,针对IoTDB的内容不做过多介绍,在使用该时序库时,往往有一定入门门槛,不同于关系型数据库或文档型数据库那般方便维护和接入开发,…

Go语言的栈空间管理

Go 语言的栈空间管理 Go 语言的栈空间管理是其并发模型的核心之一。Go 的运行时环境(runtime)采用动态栈分配机制,能够根据 Goroutine 的需求动态扩展和收缩栈空间,避免了传统固定栈大小的限制。Go 的栈管理经历了从 分块式栈 到…

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 (1) 时钟 (2) DEBUG、LED1、KeyRight、USART6、CodeGenerator (3&#x…

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后,在廖老师的指导下,才厘清了各章之间的关系。首先,这是两个学科综合的一门课程,这一门课程中还有术语冲突的问题。这一门课程一条线两个分支,脉络很清晰。 概率论与统计学 概率论…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道,还有2道找时间再磨一磨。现在把做的一些思路总结如下: 题1:握手问题 问题描述 小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [,column] ...)] VALUES(value_list)[,(value_list)] ... # value 后面的列的个数和类型,要和表结构匹配…

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查,较基础,因此直接导入代码。 地址表 一个用户可以有多个地址,同时有一个地址为默认地址。用户还可为地址添加例如&q…

从ChatGPT热潮看智算崛起

2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

【express-generator】06-RESTFUL API设计(第二阶段)

前言: 前面我们学习了第一阶段的express-generator内容以及做了对应练习,现在我们正式开始第二阶段的学习以及练习。本篇介绍的内容是RESTFUL API设计。 第二阶段的大纲如下: RESTful API 设计: 学习如何设计符合 REST 原则的 …