Langchain入门教程

news2024/9/21 20:36:05

1、框架介绍

LangChain 是一个用于构建大语言模型应用的开源框架,2022年10月作为开源项目推出,目前已经在开发社区颇具名气,构建起了自己的一片开发生态。

LangChain 在 2023 年 3 月获得了 Benchmark Capital 的 1000 万美元种子轮融资,在近期又拿到了红杉2000-2500万美金的融资,估值已经提升到了2亿美金左右。

它提供了一系列模块,这些模块可以组合在一起,用于创建复杂的应用程序,也可以单独用于简单的应用程序。它逻辑上主要有6大模块:Models、prompt、chains、agents、memory、indexes。

image.png

一个LangChain应用是通过很多个组件实现的,LangChain主要支持6种组件:

  • Models:模型,各种类型的模型和模型集成,比如ChatGPT、ChatGLM、T5等大语言模型
  • Prompts:提示,包括提示管理、自定义提示词。
  • Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止; 授予大模型对于外部工具的使用权限。
  • Memory:记忆,用来保存和模型交互时的上下文状态
  • Indexes:索引,用来结构化文档,以便和模型交互
  • Chains:链,一系列对各种组件的调用

2、模块介绍

(1)、Agent

Agent 使用LLM来确定采取哪些行动以及顺序。 一个动作可以是使用工具并观察其输出,或返回给用户。

代理的灵活使用,可以增强大模型的能力。

例如,通过agent,我们可以赋予大模型 访问网络、访问数据库以及其他工具的能力。

from langchain.agents import initialize_agent,Tool
from langchain.llms import OpenAI
from langchain.tools import BaseTool
from agents.brand_search import BrandInfoSearchWrapper
import langchain

langchain.debug = True
from langchain.chat_models import ChatOpenAI

# llm = ChatOpenAI(temperature=0,model_name="gpt-3.5-turbo")
llm = ChatOpenAI(temperature=0,model_name="gpt-35-turbo-16k")
brand_serach = BrandInfoSearchWrapper(top_k=1,domain="zhihu.com")

tools = [
    Tool(
        name="BrandSearch",
        func=brand_serach.run,
        description="当问题中包含品牌信息是使用"
    )
    ]
agent = initialize_agent(
    tools, llm, agent="zero-shot-react-description", verbose=True)

# print("prompt",agent.agent.llm_chain.prompt.template)

print("问题:")
print("答案:" + agent.run("美宝莲这个品牌的化妆品在中国市场占有率如何?"))

  • zero-shot-react-description:仅基于工具的描述来确定要使用的工具。可以提供任意数量的工具。此代理需要为每个工具提供描述。
  • react-docstore:主要与文档存储进行交互。必须提供两个Search和Lookup 工具。Search工具用于搜索文档,而Lookup工具应该查找最近找到的文档中的一个术语。
  • self-ask-with-search:基于搜索引擎查找问题的答案。必须提供了Google搜索API作为工具。
(2)、Memory

LLMs本身是无状态的,对于连续的提问,大语言模型会独立地处理每个传入的查询。在某些应用程序中(聊天机器人是一个很好的例子),记住以前的交互非常重要,无论是在短期还是长期层面上。Memory模块主要用于存储历史的交互记录。

常用模式:

  • 将历史消息交互列表,在下一次提问时,作为上下文信息。
  • 将历史消息交互列,构建向量存储在VectorDB中,并在每次调用时查询最重要的K个文档。不明确跟踪交互的顺序。

langchain 提供多种组件完成交互记忆的存储:

  • (a)、ConversationBufferMemory

    该组件类似我们上面的描述,只不过它会将聊天内容记录在内存中,而不需要每次再手动拼接聊天记录。

  • (b)、ConversationBufferWindowMemory

    相比较第一个记忆组件,该组件增加了一个窗口参数,会保存最近看 k 论的聊天内容。

  • ©、ConversationTokenBufferMemory

    在内存中保留最近交互的缓冲区,并使用 token 长度而不是交互次数来确定何时刷新交互。

  • (d)、ConversationSummaryMemory

    相比第一个记忆组件,该组件只会存储一个用户和机器人之间的聊天内容的摘要。

  • (e)、ConversationSummaryBufferMemory

    结合了上面两个思路,存储一个用户和机器人之间的聊天内容的摘要并使用 token 长度来确定何时刷新交互。

  • (g)、VectorStoreRetrieverMemory

    它是将所有之前的对话通过向量的方式存储到 VectorDB(向量数据库)中,在每一轮新的对话中,会根据用户的输入信息,匹配向量数据库中最相似的 K 组对话。

(3)、Indexes

索引应用于知识库文档的构建和检索,以便 LLM 可以最好地获取问题相关的背景知识。

主要步骤:

  • 文档加载
  • 文字分割
  • 构建 Embedding
  • 向量存储

langchain 生态提供了多种向量库的接入方式:

  • AnalyticDB
  • Annoy
  • AtlasDB
  • Chroma
  • Deep Lake
  • ElasticSearch
  • FAISS
  • LanceDB
  • Milvus
  • MyScale
  • OpenSearch
  • PGVector
  • Pinecone
  • Qdrant
  • Redis
  • SupabaseVectorStore
  • Tair
  • Weaviate
  • Zilliz
(4)、Chains

使用单独的LLM对于一些简单的应用程序来说是可以的,但许多更复杂的应用程序往往难以获得满意的效果。

链允许我们将多个组件组合在一起,每个组件只完成目标明确的某一项操作,然后将格式化后的响应传递给 下一个组件,从而来构建更复杂的应用。

代码示例:

# location 链
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=1,model_name="gpt-35-turbo-16k")
template = """你的工作是根据用户的城市,推荐一道该地区的经典菜肴。
%用户城市
{user_location}

你的答案:
"""
prompt_template = PromptTemplate(input_variables=["user_location"], template=template)
location_chain = LLMChain(llm=llm, prompt=prompt_template)

# meal 链
template = """给你一道菜,就如何在家做这道菜给出一个简短而简单的食谱。
%菜名
{user_meal}

YOUR RESPONSE:
"""
prompt_template = PromptTemplate(input_variables=["user_meal"], template=template)
meal_chain = LLMChain(llm=llm, prompt=prompt_template)

# 通过 SimpleSequentialChain 串联起来,第一个答案会被替换第二个中的user_meal,然后再进行询问
overall_chain = SimpleSequentialChain(chains=[location_chain, meal_chain], verbose=True)
review = overall_chain.run("北京")

大模型输出结果:

> Entering new SimpleSequentialChain chain...

北京的经典菜肴是炸酱面。炸酱面是北京传统的面食之一,以酱肉和面条为主要材料。这道菜肴以面条爽滑细嫩,配上浓郁的酱料和加入的豆腐丁、黄瓜丝、大葱丝等配料,口感丰富,味道独特。炸酱面在北京有悠久的历史,是一道代表北京美食文化的经典菜肴。
炸酱面的制作方法如下:

材料:
- 面条
- 猪肉末
- 韩式豆瓣酱
- 豆腐丁
- 黄瓜丝
- 大葱丝
- 生抽
- 酱油
- 糖
- 盐
- 食用油

步骤:
1. 将猪肉末放入炒锅中炒熟。
2. 加入适量的韩式豆瓣酱继续炒煮几分钟,使酱料更加香味浓郁。
3. 加入少许生抽、酱油、糖和盐,调成酱料。
4. 煮开水,将面条煮熟后捞出备用。
5. 在炸锅中倒入适量的食用油,将豆腐丁炸熟。
6. 将煮熟的面条放在碗中,加入炸好的豆腐丁、黄瓜丝和大葱丝。
7. 倒入准备好的酱料,搅拌均匀即可。
炸酱面制作完成,可以根据个人口味加入适量的辣椒油或花生碎增添口感。

> Finished chain.

Langchain提供的链式处理模式:

  • SimpleSequentialChain: 顺序链的最简单形式,其中每个步骤都有一个单一的输入/输出,并且一个步骤的输出是下一步的输入。
  • SequentialChain: 相比 SimpleSequentialChain 只允许有单个输入输出,它是一种更通用的顺序链形式,允许多个输入/输出。
  • TransformChain: 转换链允许我们创建一个自定义的转换函数来处理输入,将处理后的结果用作下一个链的输入。

示例代码:

# 转换链:输入变量:text,输出变量:output_text
transform_chain = TransformChain(
    input_variables=["text"], output_variables=["output_text"], transform=transform_func
)

# 使用顺序链
sequential_chain = SimpleSequentialChain(chains=[transform_chain, llm_chain])
# 开始执行
sequential_chain.run(state_of_the_union)
# 结果

3、Function calling

ChatGPT 提供了Function calling功能,这个功能方便我们更加简单的构建大模型处理链。

functions的格式是一个json数组,每一个json是一个函数,包含:

  • name:函数名,
  • description:描述,
  • parameters参数,
  • param_description:参数描述。
  • required 需要的参数。

示例代码:

response = openai.ChatCompletion.create(
            messages=[
                {"role": "system", "content": "你是电商领域营销专家"},
                {"role": "user", "content": prompt}
            ],
            temperature=0,
            stream=False,
            headers=headers,
            # max_tokens=2048,
            # top_p=1,
            functions = [{
                "name":"brand_parse",
                "description":"给出品牌分析",
                "parameters":{
                "type":"object",
                "properties":{
                    "brand_name":{"type":"string","description":"分析的品牌名称"},
                    "value1":{"type":"string","description":"一段话描述品牌知名度,如果不了解请输入:无法给出评价"},
                    "value2":{"type":"string","description":"一段话描述品牌影响力,如果不了解请输入:无法给出评价"},
                    "value3":{"type":"string","description":"一段话描述品牌市场规模,如果不了解请输入:无法给出评价"},
                    "value4":{"type":"string","description":"一段话描述品牌调性,如果不了解请输入:无法给出评价"},
                    "value5":{"type":"string","description":"一段话描述产品风格,如果不了解请输入:无法给出评价"},
                    "value6":{"type":"string","description":"一段话描述品牌受众,如果不了解请输入:无法给出评价"}
                    },
                "required":["value1","value2","value3","value4","value5","value6"],
                },
            }],
            function_call={"name":"brand_parse"}
    )

输出结果:

{
"value1": "皮尔卡丹是一个非常知名的品牌,几乎每个人都听说过它。",
"value2": "皮尔卡丹在时尚界有很大的影响力,它的设计风格独特且受到广泛认可。",
"value3": "皮尔卡丹在连衣裙类目领域市场规模很大,是该领域的领导者之一。",
"value4": "皮尔卡丹的调性时尚、优雅,给人一种高贵大气的感觉。",
"value5": "皮尔卡丹的产品风格时尚、简约,注重细节和质感。",
"value6": "皮尔卡丹的受众主要是年轻女性,他们注重时尚和品质。"
}

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

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

相关文章

用于实现无线数据传输和通信连接的2.4GHz无线芯片-RF298

2.4GHz无线射频收发芯片是一种常见的无线通信模块,它工作在2.4GHz频段,用于实现无线数据传输和通信连接;通常用于各种无线通信设备,如手机、Wi-Fi路由器、蓝牙设备、无线鼠标键盘、电视和机顶盒遥控器、智能家居及物联网系统、遥控…

数据结构_study(五)

树 n(n>0)个结点的有限集 空树:n0 在非空树中: 有且仅有一个特定的根root结点; n>1时,其余结点可以分为m个互不相交的有限集,其中每个集合也是一棵树,根的子树 一对多 结点的度:结点拥…

SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志

SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志 一、前言二、技术介绍(Flink CDC)1、Flink CDC2、Postgres CDC 三、准备工作四、代码示例五、总结 一、前言 在工作中经常会遇到要实时获取数据库(postgresql、m…

“等保测评下的数据加密与隐私保护“

在当今数字化时代,数据已成为企业最宝贵的资产之一。然而,数据泄露、隐私侵犯等事件频发,不仅给企业带来经济损失,更严重损害了公众信任。等保测评,作为国家信息安全等级保护制度的重要组成部分,对数据加密…

微信小程序开发:宿主环境—组件

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Python安装与环境配置,2024最新,超详细保姆级教程!

安装Python 来到Python官网:https://www.python.org/ Downloads>Windows: 选择想要的版本后点击进去: 下载后点击安装: 在本地电脑输入命令提示符:winR 环境变量配置 若执行命令提示符,输入Python后&…

Centos7.9开机自启更新系统时间

在CentOS 7.9中设置自动同步系统时间,主要依赖于NTP(Network Time Protocol)服务。以下是详细的步骤: 1、安装NTP服务 首先,你需要确保NTP服务已经安装在系统上。如果尚未安装,可以通过以下命令进行安装&…

电脑怎么更新系统

电脑系统的更新不仅可以带来新的功能和改进,还能提升系统的安全性和稳定性。许多用户对于如何更新系统可能不太了解,本文将详细介绍电脑系统更新的方法和步骤,帮助大家轻松完成系统更新。 为什么要更新系统?在了解如何更新系统之…

532nm绿光激光模组技术原理及特征

在现代科技飞速发展的今天,绿光激光模组作为一种高精度、高效率的光学器件,在工业加工、指示测量、演示展示等领域展现出了其独特的优势。其中,532nm绿光激光模组以其稳定的光束质量和广泛的应用范围,成为了市场上的热门产品。接下…

如何将幻灯片中的图片背景设置为透明

在制作幻灯片时,我们经常需要插入图片来丰富内容,提升视觉效果。但有时,图片的背景可能会干扰幻灯片的整体设计,这时将图片背景设置为透明就显得尤为重要。本文将详细介绍如何在常用的幻灯片制作软件中实现这一效果,帮…

【Golang 面试 - 进阶题】每日 3 题(十)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

精选3款国内wordpress 主题,建站首选

WordPress作为一款功能强大且易于使用的建站平台,已经成为了许多企业和个人搭建网站的首选。为了帮助大家更好地选择适合自己的WordPress主题,小编将为大家推荐三款国内优秀的WordPress主题:子比主题、OneNav主题和RiTheme主题。 1.子比主题…

施耐德电气荣获HMS工业网络颁发的第1000万个Anybus模块奖

全球可持续能源解决方案领导者施耐德电气,荣获 HMS 工业网络颁发的第 1000 万个 Anybus 模块奖。通过将 Anybus 网络连接接口集成到其变频器系列中,施耐德电气为客户提供了多种可根据性能和能效进行微调的变频器。这一双重优势不仅提升了客户的运营效率&…

【mongodb】mongodb副本集的搭建和使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

连锁门店收银系统源码

近年来,随着移动互联网的快速发展,越来越多的企业开始注重私域流量的积累和管理。尤其针对连锁零售门店尤为重要。自然对收银系统的要求也越来越多,要有丰富的营销活动来助力商户玩转私域营销。今天一起来看看收银系统需要具备哪些营销功能吧…

【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例

目录 C语言进制转换详解精讲文章重点内容汇总表格1. 进制概念基础1.1 二进制(Binary)1.2 十进制(Decimal)1.3 八进制(Octal)1.4 十六进制(Hexadecimal) 2. 进制之间的相互转换2.1 十…

云WAF最新动态追踪,为您的网络安全防护加码升级!

技术创新引领防护升级 近年来,各大云运营商纷纷推出了基于人工智能和机器学习技术的增强型 WAF,能够在毫秒级内准确识别和抵御 OWASP排名前10的网络安全威胁,其中包括最近出现的各种病毒,保护效率和智能程度都提高到一个新的层次…

遗传算法与深度学习实战——生命模拟及其应用

遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然…

两种字符串有什么区别——字符数组和字符串,初步认识STL

两种字符串有什么区别——字符数组和字符串,初步认识STL 1.字符数组1.1.基础语法介绍1.2.例题1——自动修正题目描述输入格式输出格式输入输出样例输入 #1输出 #1 1.3.另解——getchar和putchar函数1.4.字符数组相关函数 2.字符串2.1.字符串简介和基础功能2.2.例题2…

MATLAB(6)水纹碰撞覆盖地形

前言 在MATLAB中模拟水纹(如水波)碰撞并覆盖地形的效果涉及到几个复杂的步骤,包括地形的生成、水波的模拟(通常使用波动方程)以及两者的交互。下面我将给出一个简化的示例,展示如何在MATLAB中创建一个基本的…