大模型:LangChain技术讲解

devtools/2025/1/24 22:05:04/

一、什么是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 ChatOllamaollama = 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 PromptTemplatetemplate = """
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, ChatPromptTemplatetemplate = """
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 ChatOllamaexamples = [{"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 CommaSeparatedListOutputParseroutput_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、检索器

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


http://www.ppmy.cn/devtools/153242.html

相关文章

ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙

ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙 sudo fallocate -l 16G /swapfile fallocate: fallocate 失败: 文本文件忙这种情况是swap空间正在使用,需要先关闭swap分区: sudo swapoff /swapfile sudo fallocate -l 16G /swap…

Nginx 与后端服务的集成配置

一、引言 在当今数字化时代,后端服务的高效运行对于应用的成功至关重要。Nginx 作为一款强大的开源 HTTP 服务器和反向代理服务器,在后端服务集成中扮演着举足轻重的角色。它能够实现反向代理、负载均衡、缓存等多种功能,有效提升后端服务的…

C语言-----扫雷游戏

扫雷游戏的功能说明 : • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷: ◦ 如果位置不是雷,就显⽰周围有⼏个雷 ◦ 如果位置是雷,就…

财税资金数据管理一体化大屏 | 智慧金融合集

随着科技的快速进步和数字化转型的加速,金融、税务等机构和企业面临的数据量呈现出爆炸式增长。传统的数据分析方法早已无法胜任现代业务的需求。为此,许多机构开始尝试创新的软件工具来更好的管理繁琐的数据。 通过图扑软件的数据可视化大屏&#xff0c…

认识Django项目模版文件——Django学习日志(二)

1.默认文件介绍 └── djangoproject1/├── djangoproject1/│ ├── urls.py [URL和函数的对应关系]【常用文件】│ ├── settings.py [项目配置文件]【常用文件】│ ├── _init_.py│ ├── wsgi.py [接受网络请求] 【不要动】│ └──…

npm install安装缓慢或卡住不动

起因 今天执行npm install eslint-plugin-cypresslatest --save-dev命令时进度条一直卡着不动,于是想着安装yarn来操作。 方案1 全局安装yarn(Mac在npm前加sudo): npm install -g yarn yarn安装好之后安装依赖用: y…

Spring Boot 快速创建项目

目录 一. 创建项目 ​编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时,清除文本框内容是一个常见的需求。这可以通过多种方式实现,取决于你使用的是哪种编程语言(如Python、Java等)以及你的具体需求。以下是一些常见的方法: 1. 使用clear()方法 clear…