大模型工具:LangChain 原理与实战案例

LangChain 是什么?

LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使得可以构建以下类型的应用程序:

  • 数据感知:将语言模型与其他数据源连接起来

  • 智能:允许语言模型与其环境进行交互

图片

LangChain的主要价值在于:

  • 组件:提供了处理语言模型的抽象,以及每个抽象的多个实现。组件是模块化且易于使用的,无论您是否使用LangChain的其他部分。

  • 现成的链:结构化组件的组合,用于完成特定的高层任务。

LangChain 安装

要安装LangChain,请运行以下命令:

  • 使用Pip

  • 使用Conda

pip install langchain

这是安装LangChain的最基本要求。LangChain的真正价值在于将其与各种模型提供者、数据存储等进行集成时产生。默认情况下,安装LangChain不会安装这些依赖项。不过,有两种其他方法可以安装带有这些依赖项的LangChain

要安装与常见的LLM提供者相关的模块,请运行:

pip install langchain[llms]

要安装所有集成所需的模块,请运行:

pip install langchain[all]

请注意,如果您使用的是zsh,在将方括号作为命令参数传递时,需要使用引号括起来,例如:

pip install 'langchain[all]'

技术交流

建了技术交流群!想要进交流群、获取如下原版资料的同学,可以直接加微信号:dkl88194。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、添加微信号:dkl88194,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

资料1
在这里插入图片描述
资料2

在这里插入图片描述

LangChain 基础案例

OpenAI Key设置

from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")

使用LLMs进行预测,并通过设置温度参数来调整生成的文本的随机性。

from langchain.llms import OpenAI
llm = OpenAI(temperature=0.9)
llm.predict("What would be a good company name for a company that makes colorful socks?")
# >> Feetful of Fun

使用聊天模型进行对话的方法,包括使用不同类型的消息对象进行输入和输出。

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

chat = ChatOpenAI(temperature=0)
chat.predict_messages([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
# >> AIMessage(content="J'aime programmer.", additional_kwargs={})

使用提示模板将用户输入和指令结合起来,以提供更多上下文信息。

from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
prompt.format(product="colorful socks")

使用链将模型和提示模板连接起来,实现更复杂的工作流程。

from langchain import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(input_language="English", output_language="French", text="I love programming.")

代理可以根据输入动态选择不同的操作。

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")

使用存储器来保持应用程序的状态,并在下一次运行时使用存储的状态。

from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "The following is a friendly conversation between a human and an AI. The AI is talkative and "
        "provides lots of specific details from its context. If the AI does not know the answer to a "
        "question, it truthfully says it does not know."
    ),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])

llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
conversation.predict(input="Hi there!")

LangChain 组成结构

LangChain提供了标准、可扩展的接口和外部集成,用于以下模块,按照从简单到复杂的顺序排列。

Model I/O

Model I/O是任何语言模型应用程序的核心元素。LangChain提供了与任何语言模型进行交互的构建模块。

图片

  1. Prompts(提示):将模型输入进行模板化、动态选择和管理。

  2. Language models(语言模型):通过通用接口调用语言模型。

  3. Output parsers(输出解析器):从模型输出中提取信息。

使用这些模块,可以有效地管理和处理与语言模型的交互。模板化输入、调用模型和解析输出是构建语言模型应用程序的关键步骤。

Data connection

Data connection是许多LLM应用程序所需的一部分,它涉及用户特定的数据,这些数据不是模型的训练集的一部分。LangChain提供了构建模块,通过以下方式加载、转换、存储和查询数据:

图片

  1. Document loaders(文档加载器):从多种不同的来源加载文档。

  2. Document transformers(文档转换器):对文档进行分割、去除冗余文档等操作。

  3. Text embedding models(文本嵌入模型):将非结构化文本转换为浮点数列表。

  4. Vector stores(向量存储):存储和检索嵌入数据。

  5. Retrievers(检索器):对数据进行查询。

使用这些构建模块,可以有效地加载、转换、存储和查询用户特定的数据,为LLM应用程序提供必要的数据连接。

Chains

Chains是LangChain提供的用于构建“链式”应用程序的接口。在简单的应用程序中,单独使用LLM是可以的,但更复杂的应用程序需要将LLM进行链接,无论是与其他LLM还是其他组件进行链接。

LangChain为这种“链式”应用程序提供了Chain接口。我们将Chain定义为对组件的一系列调用,可以包括其他链。

Agents

Agents在一些应用程序中需要根据用户输入灵活地调用LLMs和其他工具。Agent接口提供了这种应用程序的灵活性。Agent可以访问一系列工具,并根据用户输入决定使用哪些工具。Agent可以使用多个工具,并将一个工具的输出作为下一个工具的输入。

Agent主要分为两种类型:

  1. Action agents(行动型Agent):在每个时间步骤中,根据之前所有行动的输出决定下一步的行动。

  2. Plan-and-execute agents(规划执行型Agent):在前期决定完整的行动序列,然后按计划依次执行,而无需更新计划。

Action agents适用于小任务,而plan-and-execute agents更适用于复杂或长时间运行的任务,这些任务需要维持长期目标和焦点。通常最佳方法是将action agent的动态性与plan-and-execute agent的规划能力相结合,让plan-and-execute agent使用action agents来执行计划。

Memory

Memory模块旨在处理应用程序中的状态,并在链式应用程序或代理的运行之间保留和持久化应用程序数据。它允许您记住和引用先前的交互,并在诸如聊天机器人等应用程序中保持上下文。

Callbacks

LangChain提供了一个回调系统,允许您在LLM应用程序的各个阶段进行钩子操作。这对于日志记录、监控、流式处理和其他任务非常有用。

可以根据需要实现这些方法来执行自定义的回调逻辑,例如记录日志、发送通知、保存输出等。这使您能够在应用程序执行过程中进行观察和干预,并根据需要采取相应的操作。

LangChain 优缺点

优点

  • LangChain采用组件化的设计,提供了一系列模块和接口,使得开发语言模型应用程序变得简单和灵活。开发人员可以选择和组合各个组件,以构建符合自己需求的应用。

  • LangChain支持外部集成和扩展,可以与各种语言模型提供商、数据存储和其他工具集成。这使得开发人员能够根据自己的需求选择最适合的组件和工具,提高应用的灵活性和功能性。

  • LangChain提供了各种模块和工具,适用于不同的应用场景,包括问题回答、聊天机器人、智能代理等。无论是简单的应用还是复杂的应用,LangChain都提供了相应的组件和示例,帮助开发人员快速构建应用。

  • LangChain提供了内存模块,可以在应用程序的不同运行周期中持久化应用状态。这对于需要记住之前交互的应用程序非常有用,如聊天机器人。内存模块使得开发人员可以方便地管理和访问之前的交互数据。

缺点

由于LangChain是一个功能强大且灵活的框架,对于新手开发人员来说,可能需要一定的学习曲线才能熟悉其各个组件和工作原理。对于没有经验的开发人员来说,可能需要花费一些时间来理解和掌握LangChain的使用方法。

目前,LangChain的文档尚未完全完善,有些部分还在施工中。这可能会给开发人员带来一些困扰,特别是在需要参考文档进行开发时。

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

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

相关文章

亚信安慧AntDB数据库携手U8C共创未来

AntDB数据库生态负责人在近期举行的商业创新大会上引领着数字化时代的浪潮,推出了令业界瞩目的U8CAntDB联合产品。这一创新性的合作将AntDB数据库与U8C云ERP产品紧密结合,为成长型企业提供了一套全栈、安全可靠的保障,为企业的数智化转型升级…

新/旧版本 QT 下载,全攻略【省资源下载币专用】

看到好多朋友找不到指定版本的QT下载路径,特此更新一篇新/旧版本 QT 下载攻略 收藏一下吧,需要的时候方便查找,能为你省下好多资源下载币。 通过图示可以看出,新旧版本的界限并没有那么明晰,如果你需要的版本两个链接…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

内网MSF--从入门到熟练

Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework,简称叫做MSF。Metasploit 作为全球最受欢迎的工具,不仅仅是因为它的方便性和强大性,更重要的是它的框架。它允许使用者开 发自己的漏洞脚本,从而进行测试。 一…

python实现多层级复选框选中

pythonpyqt5实现多层级复选框选中 效果如何插入一段漂亮的代码片 效果 如何插入一段漂亮的代码片 去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片. // An highlighted block class filterWindow(QWidget):def __init__(sel…

路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

路径规划综述 1. 背景介绍 路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用,包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展,路径规划技术也在不断地得到改进和应用。 路径规划…

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界,揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy,助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts,本书呈现生动直…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中,玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏,它不仅提供了一个有趣的辨色挑战,还能帮助玩…

[C/C++]数据结构: 链式二叉树的构建及遍历

一: 💬二叉树的概念 1.1:🚩 概念 二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

【网络编程】基于UDP数据报实现回显服务器程序

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 前言 我们如果…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行,直到指定的条件不满足为止。 while 条件: 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时,执行下方缩…

【JavaEE初阶一】线程的概念与简单创建

1. 认识线程(Thread) 1.1 关于线程 1.1.1 线程是什么 由前一节的内容可知,进程在进行频繁的创建和销毁的时候,开销比较大(主要体现在资源的申请和释放上),线程就是为了解决上述产生的问题而提…

软件测试 —— 如何测试图片上传功能?

作为一名专业的软件测试人员,测试图片上传功能是一个重要的任务,以下是一些测试该功能的常用方法: 1. 上传功能测试:确保图片上传功能正常工作,包括选择图片文件、点击上传按钮、上传进度显示、上传成功/失败的提示等。…

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2)postman下载与安装使用 我的百度网盘postman点击下载 提取码:bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2)发送get请求 选择自己的请求方式,输入请求…

1861_什么是H桥

Grey 全部学习内容汇总: GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1861_什么是H桥 H桥电路可以…

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

问题:下图中是一个生成库的模块,其中qglobal.h的使用有点疑惑,可以参考下文链接。 ​​​​​​​​​​​​https://www.cnblogs.com/techiel/p/8035014.htmlhttps://www.cnblogs.com/techiel/p/8035014.html

Redis过期删除策略和内存淘汰策略

1、设置Redis键过期时间 Redis提供了四个命令来设置过期时间&#xff08;生存时间&#xff09;。 EXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 秒。 PEXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 毫秒。…

算法基础之最长上升子序列 II

最长上升子序列 II 核心思想&#xff1a;不去遍历全部的数据(会有冗余) 用vector模拟栈 ①如果该元素大于栈顶元素,将该元素入栈 ②替换掉第一个大于或者等于这个数字的那个数&#xff08;二分&#xff09; #include<iostream>#include<algorithm>#include&l…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…