langchain主要模块(三):Chain

原文:langchain主要模块(三):Chain_江小皮不皮的博客-CSDN博客

langchain2之Chain
  • langchain
    • 1.概念
    • 2.主要模块
        • 模型输入/输出 (Model I/O)
        • 数据连接 (Data connection)
        • 链式组装 (Chains)
        • 代理 (Agents)
        • 内存 (Memory)
        • 回调 (Callbacks)
    • 3.链
      • • LLMChain:
      • • SimpleSequentialChain
      • • Sequential Chains:
      • • RouterChain:

langchain

1.概念

什么是LangChain?

源起:LangChain产生源于Harrison与领域内的一些人交谈,这些人正在构建复杂的LLM应用,他在开发方式

上看到了一些可以抽象的部分。一个应用可能需要多次提示LLM并解析其输出,因此需要编写大量的复制粘贴。

LangChain使这个开发过程更加简单。一经推出后,在社区被广泛采纳,不仅有众多用户,还有许多贡献者参

与开源工作。

还有大模型本身的问题,无法感知实时数据,无法和当前世界进行交互。

LangChain是一个用于开发大语言模型的框架。

主要特性:

\1. 数据感知:能够将语⾔模型与其他数据源进⾏连接。

\2. 代理性:允许语⾔模型与其环境进⾏交互。可以通过写⼯具的⽅式做各种事情,数据的写⼊更新。

主要价值:

1、组件化了需要开发LLM所需要的功能,提供了很多工具,方便使用。

2、有一些现成的可以完整特定功能的链,也可以理解为提高了工具方便使用。

2.主要模块

LangChain 为以下模块提供了标准、可扩展的接口和外部集成,按照复杂程度从低到高列出:

模型输入/输出 (Model I/O)

与语言模型进行接口交互

数据连接 (Data connection)

与特定于应用程序的数据进行接口交互

链式组装 (Chains)

构造调用序列

代理 (Agents)

根据高级指令让链式组装选择要使用的工具

内存 (Memory)

在链式组装的多次运行之间持久化应用程序状态

回调 (Callbacks)

记录和流式传输任何链式组装的中间步骤

3.链

链允许我们将多个组件组合在一起,创建一个单一而连贯的应用程序。例如,我们可以创建一个链,接受用户输入,使用 PromptTemplate 进行格式化,然后将格式化的响应传递给 LLM。我们可以通过将多个链组合在一起或将链与其他组件组合来构建更复杂的链。

目前内置的几种常用Chain:

• LLMChain:

这是一个简单的链,由PromptTemplate和LLM组成,它使用提供的输入键值格式化提示模板,将格式化的字符串传递给LLM,并返回LLM的输出。

1.模型配置

from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.prompts.chat import (ChatPromptTemplate,HumanMessagePromptTemplate,
)api_base_url = "http://192.168.175.6:8000/v1"  
api_key= "EMPTY"
LLM_MODEL = "Baichuan-13b-Chat"
model = ChatOpenAI(streaming=False,verbose=True,# callbacks=[callback],openai_api_key=api_key,openai_api_base=api_base_url,model_name=LLM_MODEL
)

2.设置模板

from langchain import PromptTemplatetemplate = """\
你是一个新公司的命名咨询顾问.
为制作 {product} 的公司起好的名字? 使用中文回答问题,不少于5个名字
"""chat_prompt = PromptTemplate.from_template(template)
chain = LLMChain(prompt=chat_prompt, llm=model)
print(chain.run("五颜六色的袜子"))

  1. 彩虹袜坊 2. 缤纷袜艺 3. 七彩袜语 4. 多彩袜尚 5. 绚丽袜裳
• SimpleSequentialChain

每个步骤都有一个单一的输入/输出,一个步骤的输出是下一个步骤的输入。

from langchain.prompts import ChatPromptTemplate
from langchain.chains import SimpleSequentialChain# 第一个Prompt和Chain
first_prompt = ChatPromptTemplate.from_template("你是一个新公司的命名咨询顾问.为制作 {product} 的公司起2个好的名字? 使用中文回答问题"
)
chain_one = LLMChain(llm=model, prompt=first_prompt)# 第二个Prompt和Chain
second_prompt = ChatPromptTemplate.from_template("为下面的公司写一个20字的简短描述:{company_name}"
)
chain_two = LLMChain(llm=model, prompt=second_prompt)

# 把第一个Chain和第二个Chain合在一起
overall_simple_chain = SimpleSequentialChain(chains=[chain_one, chain_two],verbose=True)
overall_simple_chain.run("智能手机")

• Sequential Chains:

不是所有的链都是有固定的输入和输出,有时候中间的链需要多个输入,最终也有多个输出,这个时候考虑用SequentialChain

# 这是一个LLMChain,给定一个剧本的标题和它所处的时代,它的任务是写一个概要。
template = """你是一位剧作家。给定剧本的标题和它所处的时代,你的任务是为该标题写一个概要。标题: {title}
时代: {era}
剧作家: 这是上述剧本的概要:"""
prompt_template = PromptTemplate(input_variables=["title", "era"], template=template)
synopsis_chain = LLMChain(llm=model, prompt=prompt_template, output_key="synopsis")# 这是一个LLMChain,给定一个剧本的概要,它的任务是写一个剧本的评论。
template = """你是一位专业的剧本评论家。给定剧本的概要,你的任务是为该剧本写一篇评论。剧本概要:
{synopsis}
你对上述剧本的评论:"""
prompt_template = PromptTemplate(input_variables=["synopsis"], template=template)
review_chain = LLMChain(llm=model, prompt=prompt_template, output_key="review")# 这是整体链,我们按顺序运行这两个链。
from langchain.chains import SequentialChain
overall_chain = SequentialChain(chains=[synopsis_chain, review_chain],input_variables=["era", "title"],# 这里我们返回多个变量output_variables=["synopsis", "review"],verbose=True)overall_chain({"title":"海滩上的日落悲剧", "era": "维多利亚时代的英格兰"})

• RouterChain:

有时候单个串行的Chain不能满足我们的诉求,这个时候考虑使用RouterChain

它在一系列的链(Chain)中动态地选择下一个要执行的链。这种模式通常用于处理复杂的逻辑流程,其中下一个执行的步骤取决于当前的输入或状态。


#例如,如果你正在构建一个问题回答系统,你可能有多个链,每个链专门处理一种类型的问题
# (例如,一个处理物理问题,一个处理数学问题等)。
# 然后,你可以使用一个"RouterChain"来检查每个问题的特性,并将问题路由到最适合处理该问题的链。
from langchain.chains.router import MultiPromptChain
from langchain.chains import ConversationChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplatephysics_template = """你是一位非常聪明的物理教授。 \
你擅长以简洁易懂的方式回答物理问题。 \
当你不知道问题的答案时,你会承认你不知道。这是一个问题:
{input}"""math_template = """你是一位非常好的数学家。你擅长回答数学问题。 \
你之所以这么好,是因为你能够将难题分解成各个组成部分, \
回答组成部分,然后将它们组合起来回答更广泛的问题。这是一个问题:
{input}"""prompt_infos = [{  "name": "物理", "description": "适合回答物理问题","prompt_template": physics_template,},{  "name": "数学", "description": "适合回答数学问题","prompt_template": math_template,},
]destination_chains = {}
for p_info in prompt_infos:name = p_info["name"]prompt_template = p_info["prompt_template"]prompt = PromptTemplate(template=prompt_template, input_variables=["input"])chain = LLMChain(llm=model, prompt=prompt)destination_chains[name] = chain# 默认的Chain
default_chain = ConversationChain(llm=model, output_key="text")

destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
print(destination_chains.keys())
print(destinations)

dict_keys([‘物理’, ‘数学’]) [‘物理: 适合回答物理问题’, ‘数学: 适合回答数学问题’]

 
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
# 物理: 适合回答物理问题', '数学: 适合回答数学问题
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)router_prompt_template = """\
给定一个原始的文本输入到语言模型中,选择最适合输入的模型提示。
你将得到可用提示的名称和提示最适合的描述。如果你认为修改原始输入最终会得到更好的语言模型响应,你也可以修改原始输入。<< 格式化 >>
返回一个markdown代码片段,其中包含一个格式化为如下样式的JSON对象:
​```json
{{{{"destination": string \\ 使用的提示名称或"DEFAULT""next_inputs": string \\ 可能修改过的原始输入
}}}}
​```记住:"destination" 必须是下面指定的候选提示名称之一,或者如果输入不适合任何候选提示,它可以是"DEFAULT"。
记住:"next_inputs" 可以是原始输入,如果你认为不需要任何修改。<< 候选提示 >>
{destinations}<< 输入 >>
{{input}}<< 输出 >>
"""
router_template = router_prompt_template.format(destinations=destinations_str)
router_prompt = PromptTemplate(template=router_template,input_variables=["input"],output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(model, router_prompt)# 构建RouterChains
chain = MultiPromptChain(router_chain=router_chain,destination_chains=destination_chains,default_chain=default_chain,verbose=True,
)
print(chain.run("什么是黑体辐射?"))

 
print(chain.run("计算下7乘以24,然后再乘以60等于多少?"))
 

 
print(chain.run("什么是彩虹?"))
 

深度学习大模型langchainChatGLM-6B百川大模型

分享

上一篇:langchain主要模块(二):数据连接

下一篇:langchain主要模块(四):Memory

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文编程语言开发工具开发的软件案例:定制开发扫码识别位置程序适用于车间物品摆放管理

中文编程语言开发工具开发的软件案例&#xff1a;定制开发扫码识别位置程序适用于车间物品摆放管理 中文编程语言开发工具开发的软件案例&#xff1a;定制开发扫码识别位置程序适用于车间物品摆放管理&#xff0c; 中文编程系统化教程&#xff0c;不需英语基础。学习链接 htt…

网站如何应对网络流量攻击

网络安全问题中&#xff0c;受到流量攻击是一种常见挑战。以下是一系列的专业建议&#xff0c;帮助您预防和减轻这类攻击&#xff0c;从而确保您的网站和数据的安全。 使用 Web 应用程序防火墙 (WAF) Web 应用程序防火墙是一项专门的安全工具&#xff0c;能够检测和拦截恶意流…

最新GMS地下水数值模拟教程

详情点击公众号链接&#xff1a;最新GMS地下水数值模拟教程 前言 GMS三维地质结构建模 GMS地下水流数值模拟 GMS溶质运移数值模拟与反应性溶质运移模 目标 1.GMS的建模数据的收集、数据预处理以及格式等&#xff1b; 2.GMS的建模流程&#xff0c;包括三维地质结构建模、直接…

【Flutter】第一篇基础:站在一名web前端开发者的角度看代框架

Flutter Flutter 是一个跨平台的 UI 工具集&#xff0c;它的设计初衷&#xff0c;就是允许在各种操作系统上复用同样的代码&#xff0c;例如 iOS 和 Android&#xff0c;同时让应用程序可以直接与底层平台服务进行交互。如此设计是为了让开发者能够在不同的平台上&#xff0c;…

Mistral AI发布一个拥有 73 亿参数模型Mistral 7B

导读法国人工智能初创公司 Mistral AI 宣布推出其首款大语言模型 Mistral 7B 是一个&#xff0c;号称是迄今为止同规模产品中最强大的语言模型&#xff1b;在 Apache-2.0 许可下开源&#xff0c;可完全免费使用&#xff0c;不受任何限制。 Mistral AI 是一个成立仅六个月的初创…

“第四十二天”

这个&#xff0c;之前用的b去存储a的总和和排名&#xff0c;后来在比较的过程中&#xff0c;只改变的b的值&#xff0c;却没有改变a的值&#xff0c;但在比较语文成绩的时候用的还是a&#xff0c;这个时候a和b同样是第i个对应的可能不是同一个对象了 &#xff0c;因为上面b的值…

12-网络篇-通信过程中的网络表

1.ARP表 主机1和主机2在同一个局域网内&#xff0c;通过之前的章节&#xff0c;我们知道在通信过程中&#xff0c;除了要知道对方的IP地址以外&#xff0c;我们还要知道对方的硬件地址&#xff0c;也就是Mac地址。而ARP协议就是为了解决此种问题。 ARP协议的用途是为了从网络层…

vector+算法sort与list+sort的效率比较,容易写错的地方原因探析

我写的代码&#xff1a; #include <iostream> using namespace std; #include <vector> #include <list> #include <algorithm> int main() {const int N 10000000;vector<int> v;list<int> l;for (int i 0; i < N; i){v.push_back(…

AcWing 5180. 正方形泳池

原题链接&#xff1a;5180. 正方形泳池 - AcWing题库 说实话题解和视频题解都不太好&#xff0c;有点过于复杂了&#xff0c;那就不得不记录一下我看视频题解衍生出的另一个较为简单的思路了。 根据答案形态出发&#xff0c;枚举所有这种形态找出最大值。 可以发现最大的泳池要…

Ubuntu18.04安装gdal3.4

一.依赖关系 所以&#xff0c;安装顺序&#xff1a;SQLite -> Proj -> Gdal

【AFL学习笔记(一)】简单的使用AFL进行漏洞挖掘测试

首先声明一点&#xff0c;ALF都是在Linux系统上运行 本文使用的是Ubuntu 20.4 版本进行演示 Step 1 下载afl-2.52b 官网地址afl2.52b 直接下载地址直接下载地址 下载完成之后在Ubuntu系统上进行解压&#xff1a; tar -afl-2.52b.tgzStep 2 创建测试用例 ①&#xff1a;创…

20 个有代码的 Python 脚本可使您的工作自动化

阿卜杜勒汉南哈桑 说明 在本文中&#xff0c;我们将探讨 20 个 Python 脚本及其代码&#xff0c;它们可以帮助您自动执行各种任务并提高工作效率。无论您是开发人员、数据分析师&#xff0c;还是只是希望简化工作流程的人&#xff0c;这些脚本都能满足您的需求。 目录 1. 简…

【软考-中级】系统集成项目管理工程师-配置管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2023 上 试题三(20分)2016 下 试题三(17分) 2023 上 试题三(20分) 某公司有自己的质量管理体系&#xff0c;其中配置管理程序已运行多年&#xff0c;由项目经理牵头组建变更控制委员会(CCB)&#xff0c;在创建配置管理环境后&…

数据库 MySql快速导入外部数据库流程

适用于新安装MySql本地没有数据情况 外部MySql数据库文件 任务管理器停用Mysql进程 将外部文件替换本地默认文件即可 重启电脑导入完成。

前端设计模式应应用场景

前端设计模式应应用场景 创建型模式(Creational Patterns)工厂模式单例模式原型模式 行为型模式(Behavioral Patterns)策略模式观察者模式/发布订阅模式迭代器模式状态模式 结构型模式(Structural Patterns)装饰器模式代理模式 创建型模式(Creational Patterns) 处理对象的创建…

填充颜色游戏

无语死了这题。 题目描述 小明最近迷上下面一款游戏。游戏开始时&#xff0c; 系统将随机生成一个 N N 的 正方形棋盘&#xff0c; 棋盘的每个格子都由六种颜色中的一种绘制。在每个步骤中&#xff0c; 玩家选择一种颜色&#xff0c; 并将与左上角连接的所有网格更改为该特…

树控件的使用

目录 1、修改树控件的基础属性&#xff1a; 2、准备图标 &#xff1a; &#xff08;1&#xff09;、ico后缀的图片放入当前文件路径的rc中 &#xff08;2&#xff09;、在Icon中添加资源&#xff0c;导入图片 &#xff08;3&#xff09;、准备HICON图标 &#xff08;4&am…

音频处理到雷达系统:滤波组的多领域应用 | 百能云芯

在电子元器件和电路设计领域&#xff0c;滤波组&#xff08;Filter Bank&#xff09;是一个关键概念&#xff0c;它用于处理和过滤信号&#xff0c;以满足各种应用的需求。云芯将带您深入研究滤波组在元器件中的应用&#xff0c;包括其工作原理、不同类型以及在通信、音频处理和…

qt 读取txt文本内容时,中文乱码

项目场景&#xff1a; 项目中&#xff0c;需要在TF卡中做类似txt阅读器的功能&#xff0c;因为app是在嵌入式系统下运行的&#xff0c;发现当读取txt的文本格式为ANSI时&#xff0c;中文的显示是乱码&#xff0c;故记录下解决方法 问题解决 中文乱码问题还是涉及到编码问题&…

【Unity】Unity开发微信小游戏(一)准备和了解工作

一、所需工具 0.Unity小游戏版本 如不使用此版本&#xff0c;则无法搜索到 InstantGame package 1.Unity插件&#xff1a;InstantGame package 此插件用于处理项目中的贴图、音频、网格、动画、场景等资源文件&#xff0c;保证小程序包体不会过大。 插件可以关联UOS服务&am…