《使用 LangChain 进行大模型应用开发》学习笔记(五)

前言

本文是 Harrison Chase (LangChain 创建者)和吴恩达(Andrew Ng)的视频课程《LangChain for LLM Application Development》(使用 LangChain 进行大模型应用开发)的学习笔记。由于原课程为全英文视频课程,国内访问较慢,同时我整理和替换了部分内容以便于国内学习。阅读本文可快速学习课程内容。

课程介绍

本课程介绍了强大且易于扩展的 LangChain 框架,LangChain 框架是一款用于开发大语言模型(LLM)应用的开源框架,其使用提示词、记忆、链、代理等简化了大语言模型应用的开发工作。由于 LangChain 仍处于快速发展期,部分 API 还不稳定,课程中的部分代码已过时,我使用了目前最新的 v0.2 版本进行讲解,所有代码均可在 v0.2 版本下执行。另外,课程使用的 OpenAI 在国内难以访问,我替换为国内的 Kimi 大模型及开源自建的 Ollama,对于学习没有影响。

参考这篇文章来获取 Kimi 的 API 令牌。
参考这篇文章来用 Ollama 部署自己的大模型。

课程分为五个部分:

  • 第一部分
  • 第二部分
  • 第三部分
  • 第四部分
  • 第五部分

在这里插入图片描述

课程链接

第五部分

代理(Agent)

大语言模型往往被认为是擅长回答问题,但它也擅长作为推理引擎。你可以给它提供一系列的背景信息,大语言模型能从中学习新的知识并回答用户的疑问或者指导下一步的行动。LangChain 的代理框架可以帮助大家做这些。Agent 可以理解为是一个智能代理,它的任务是接收用户的需求(用户输入)和分析当前的情境(背景数据),然后从它的工具箱中选择最合适的工具来执行操作,最后返回给用户结果。

在这里插入图片描述
参考文献:ReAct: Synergizing Reasoning and Acting in Language Models

内置工具

接下来我们使用 LangChain 的内置工具来做一个代理的例子。

首先引入依赖。

请先安装 langgraph:pip install langgraph

from langchain_openai import ChatOpenAI
from langchain_community.tools.wikipedia.tool import WikipediaQueryRun
from langchain_community.utilities.wikipedia import WikipediaAPIWrapper
from langchain_community.tools.file_management import ListDirectoryTool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent

我们接着使用文件夹查找工具,来查找我们目录下的特定文件。

# 使用 Kimi 大模型
base_url = 'https://api.moonshot.cn/v1'
api_key = 'sk-xxx'  # 替换自己的 key
llm_model = 'moonshot-v1-8k'llm = ChatOpenAI(temperature=0.3, model=llm_model, base_url=base_url, api_key=api_key)# 创建工具
list_dir = ListDirectoryTool()
tools = [list_dir]
# 创建代理
agent_executor = create_react_agent(llm, tools)
# 调用代理
response = agent_executor.invoke({"messages": [HumanMessage(content="请找出当前文件夹下的 Python 文件")]})
# 输出最后的结果
print(response['messages'][-1])

可能会得到类似这样的输出(每个人当前的目录下文件不同,结果就不同)。

content='当前文件夹下包含以下 Python 文件:\n\n- l1.py\n- l4.py\n- l5.py\n- l7.py\n\n这些文件可以用于进一步的分析或操作。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 39, 'prompt_tokens': 126, 'total_tokens': 165}, 'model_name': 'moonshot-v1-8k', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-466a9016-7055-4948-b286-8311c2667674-0' usage_metadata={'input_tokens': 126, 'output_tokens': 39, 'total_tokens': 165}

上面 content 的内容就是我们要的结果。我的当前目录下确实只有这几个 Python 文件。

当前文件夹下包含以下 Python 文件:- l1.py
- l4.py
- l5.py
- l7.py这些文件可以用于进一步的分析或操作。

我们可以打开调试模式,看看代理究竟做了什么。

import langchain
langchain.debug = True

输出结果如下。

[chain/start] [chain:LangGraph] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:__start__] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:__start__] [0ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > chain:StateModifier] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > chain:StateModifier] [1ms] Exiting Chain run with output:
[outputs]
[llm/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{"prompts": ["Human: 请找出当前文件夹下的 Python 文件"]
}
[llm/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > llm:ChatOpenAI] [1.07s] Exiting LLM run with output:
{"generations": [[{"text": "","generation_info": {"finish_reason": "tool_calls","logprobs": null},"type": "ChatGeneration","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","messages","AIMessage"],"kwargs": {"content": "","additional_kwargs": {"tool_calls": [{"id": "list_directory:0","function": {"arguments": "{}","name": "list_directory"},"type": "function","index": 0}],"refusal": null},"response_metadata": {"token_usage": {"completion_tokens": 11,"prompt_tokens": 65,"total_tokens": 76},"model_name": "moonshot-v1-8k","system_fingerprint": null,"finish_reason": "tool_calls","logprobs": null},"type": "ai","id": "run-f5ea10c4-825c-4d35-b16a-8ad2d693f391-0","tool_calls": [{"name": "list_directory","args": {},"id": "list_directory:0","type": "tool_call"}],"usage_metadata": {"input_tokens": 65,"output_tokens": 11,"total_tokens": 76},"invalid_tool_calls": []}}}]],"llm_output": {"token_usage": {"completion_tokens": 11,"prompt_tokens": 65,"total_tokens": 76},"model_name": "moonshot-v1-8k","system_fingerprint": null},"run": null
}
[chain/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence] [1.07s] Exiting Chain run with output:
[outputs]
[chain/end] [chain:LangGraph > chain:agent > chain:call_model] [1.08s] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent > chain:ChannelWrite<agent,messages>] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:ChannelWrite<agent,messages>] [0ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent > chain:should_continue] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:should_continue] [0ms] Exiting Chain run with output:
{"output": "continue"
}
[chain/end] [chain:LangGraph > chain:agent] [1.08s] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:tools] Entering Chain run with input:
[inputs]
[tool/start] [chain:LangGraph > chain:tools > tool:list_directory] Entering Tool run with input:
"{}"
[tool/end] [chain:LangGraph > chain:tools > tool:list_directory] [1ms] Exiting Tool run with output:
"content='l7.py\npyproject.toml\ndata.csv\nl1.py\npoetry.lock\nl5.py\nl4.py\nproduct.csv\n.idea' name='list_directory' tool_call_id='list_directory:0'"
[chain/start] [chain:LangGraph > chain:tools > chain:ChannelWrite<tools,messages>] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:tools > chain:ChannelWrite<tools,messages>] [0ms] Exiting Chain run with output:
[outputs]
[chain/end] [chain:LangGraph > chain:tools] [2ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence] Entering Chain run with input:
[inputs]
[chain/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > chain:StateModifier] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > chain:StateModifier] [0ms] Exiting Chain run with output:
[outputs]
[llm/start] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{"prompts": ["Human: 请找出当前文件夹下的 Python 文件\nAI: \nTool: l7.py\npyproject.toml\ndata.csv\nl1.py\npoetry.lock\nl5.py\nl4.py\nproduct.csv\n.idea"]
}
[llm/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence > llm:ChatOpenAI] [2.70s] Exiting LLM run with output:
{"generations": [[{"text": "当前文件夹下包含以下 Python 文件:\n\n- l1.py\n- l4.py\n- l5.py\n- l7.py\n\n这些文件可以用于进一步的分析或操作。","generation_info": {"finish_reason": "stop","logprobs": null},"type": "ChatGeneration","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","messages","AIMessage"],"kwargs": {"content": "当前文件夹下包含以下 Python 文件:\n\n- l1.py\n- l4.py\n- l5.py\n- l7.py\n\n这些文件可以用于进一步的分析或操作。","additional_kwargs": {"refusal": null},"response_metadata": {"token_usage": {"completion_tokens": 39,"prompt_tokens": 126,"total_tokens": 165},"model_name": "moonshot-v1-8k","system_fingerprint": null,"finish_reason": "stop","logprobs": null},"type": "ai","id": "run-466a9016-7055-4948-b286-8311c2667674-0","usage_metadata": {"input_tokens": 126,"output_tokens": 39,"total_tokens": 165},"tool_calls": [],"invalid_tool_calls": []}}}]],"llm_output": {"token_usage": {"completion_tokens": 39,"prompt_tokens": 126,"total_tokens": 165},"model_name": "moonshot-v1-8k","system_fingerprint": null},"run": null
}
[chain/end] [chain:LangGraph > chain:agent > chain:call_model > chain:RunnableSequence] [2.71s] Exiting Chain run with output:
[outputs]
[chain/end] [chain:LangGraph > chain:agent > chain:call_model] [2.71s] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent > chain:ChannelWrite<agent,messages>] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:ChannelWrite<agent,messages>] [0ms] Exiting Chain run with output:
[outputs]
[chain/start] [chain:LangGraph > chain:agent > chain:should_continue] Entering Chain run with input:
[inputs]
[chain/end] [chain:LangGraph > chain:agent > chain:should_continue] [0ms] Exiting Chain run with output:
{"output": "end"
}
[chain/end] [chain:LangGraph > chain:agent] [2.71s] Exiting Chain run with output:
[outputs]
[chain/end] [chain:LangGraph] [3.79s] Exiting Chain run with output:
[outputs]

从上面可以看到,LangChain 构建了多条链,使用工具获取了当前目录下的所有文件,并作为背景信息提交给 LLM,找出其中的 Python 文件。

上面使用了 ListDirectoryTool 工具,LangChain 还提供了许多内置的工具,例如本地系统操作、搜索引擎整合、网络服务接口整合等等,内置工具可以在 langchain_community.tools 模块中查看。当然我们也可以编写自定义的工具,参考官方文档。

总结

在这个简短的课程中,我们看到了使用 LangChain 来构建多种应用,如基于内部知识库的问答、使用外部工具等。使用 LangChain 极大地加速了这些应用的开发。但这仅仅只是一个开始,我们还可以使用使用 LLM 强大的能力来构建 SQL 查询数据库,与外部系统 APIs 交互等等,希望大家可以继续深入了解和使用 LangChain,LangChain 的社区也在快速地发展,大家可以多多关注。感谢参与本课程的学习。

完结

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

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

相关文章

kafka动态认证 自定义认证 安全认证-亲测成功

kafka动态认证 自定义认证 安全认证-亲测成功 背景 Kafka默认是没有安全机制的&#xff0c;一直在裸奔。用户认证功能&#xff0c;是一个成熟组件不可或缺的功能。在0.9版本以前kafka是没有用户认证模块的&#xff08;或者说只有SSL&#xff09;&#xff0c;好在kafka0.9版本…

【全网首发】2024华为杯数学建模ABCDEF选题方向+完整思路代码+数据集处理+可视化结果

2024华为杯研究生数学建模比赛ABCDEF选题分析 建议选哪道题&#xff1f; 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%2BWNg1V%2Fiv3H…

Apifox Mock使用教程

Apifox是一个功能强大的可视化接口文档管理工具&#xff0c;使用Apifox可以让接口Mock变得更简单容易。Apifox具有出色的Mock功能&#xff0c;不仅兼容Mock.js语法&#xff0c;同时提供Nunjucks 和自定义脚本支持&#xff0c;能够满足不同场景需求&#xff0c;为前端接口调试提…

Element 表格相关操作

数据和页面展示分离操作 <script setup> // 从Element Plus中导入需要的图标组件 import {Check,Delete,Edit,Message,Search,Star, } from element-plus/icons-vue // 导入Vue的ref和onMounted函数 import {ref,onMounted} from vue;// 使用ref创建一个响应式的use…

vue-使用refs取值,打印出来是个数组??

背景&#xff1a; 经常使用$refs去获取组件实例&#xff0c;一般都是拿到实例对象&#xff0c;这次去取值的时候发现&#xff0c;拿到的竟然是个数组。 原因&#xff1a; 这是vue的特性,自动把v-for里面的ref展开成数组的形式&#xff0c;哪怕你的ref名字是唯一的&#xff01…

Java集合(List篇)

List a.使用List i.最基础的一种集合&#xff0c;是一种有序列表&#xff0c;内部按照放入元素的先后顺序存放&#xff0c;每个元素都可以通过索引确定自己的位置。 ii.数组的删除和新增 iii.ArrayList集合的新增和删除。 iv.LinkedList&#xff08;链表式集合&#x…

Ceph 基本架构(一)

Ceph架构图 Ceph整体组成 Ceph 是一个开源的分布式存储系统&#xff0c;设计用于提供优秀的性能、可靠性和可扩展性。Ceph 的架构主要由几个核心组件构成&#xff0c;每个组件都有特定的功能&#xff0c;共同协作以实现高可用性和数据的一致性。 以下是 Ceph 的整体架构及其…

Tomcat CVE-2017-12615 靶场攻略

漏洞描述 当 Tomcat运⾏在Windows操作系统时&#xff0c;且启⽤了HTTP PUT请求⽅法&#xff08;例如&#xff0c;将 readonly初始化参数由默认值设置为false&#xff09;&#xff0c;攻击者将有可能可通过精⼼构造的攻击请求数据包向服务器上传包含任意代 的 JSP ⽂件&#xf…

队列基础概念

文章目录 &#x1f34a;自我介绍&#x1f34a;现实生活中的例子&#x1f34a;队列的介绍&#x1f34a;循环队列&#x1f34a;小结 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…

LeetCode[中等] 54.螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 思路&#xff1a;定义方向数组&#xff0c;按照顺时针顺序&#xff1a;右(0,1)&#xff0c;下(1,0)&#xff0c;左(0,-1)&#xff0c;上(0,-1) 从矩阵的左上角开始遍历…

了解深度学习,张量,线性代数,激活函数的概念

在人工智能领域&#xff0c;尤其是深度学习中&#xff0c;张量和线性代数是不可或缺的数学工具。这些数学知识的应用主要体现在以下几个方面&#xff1a; 数据表示与运算&#xff1a;张量是多维数组&#xff0c;用于表示和存储数据。在深度学习中&#xff0c;大部分的数据和权重…

常见项目场景题1(数据量很大时如何去重,实现超时处理)

数据很多&#xff0c;限制内存&#xff0c;如何去重 对于大数据量去重的场景&#xff0c;我们可以考虑使用位图(Bitmap) Bitmap 是使用二进制来表示某个元素是否存在的数组。用0和1来表示存在与不存在 使用Bitmap的话&#xff0c;一个数字占用1bit&#xff0c;大大减少内存消耗…

Unity自我实现响应式属性

其实只是写着玩,响应式编程建议使用UniRx插件(一套成熟的响应式编程解决方案),我写的主要是借鉴一下这个思想,实现的也不够优雅,不过逻辑也算严密可以正常使用.你可以查看我写的理解响应式属性的思想. 借鉴UniRx的ReactiveProperty类,且UniRx不仅有响应式属性. using System; …

CertiK协助修复Solana大整数模幂运算中的DOS漏洞

导读&#xff1a; 本文深入探讨了区块链交易费⽤模型的重要性及其在确保网络安全和有效运行中的关键作用。通过对以太坊和Solana区块链网络的交易费⽤模型进行比较分析&#xff0c;揭示了不安全的交易计费可能引发的网络安全风险。特别关注了CertiK团队发现并协助修复的Solana…

【学术会议征稿】第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024)

第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024) The 4th International Conference on Computer Technology, Information Engineering and Electron Materials 随着信息技术的迅猛发展&#xff0c;计算机技术、信息工程以及电子材料领域的研究与创新成为推动现…

光伏设计软件的基本功能

一、屋顶绘制 光伏设计软件的首要功能是屋顶绘制。通过直观易用的界面&#xff0c;可以轻松绘制出建筑物的屋顶轮廓、结构细节等基本信息。软件支持多种屋顶类型的绘制&#xff0c;并允许用户自定义屋顶尺寸和形状。 二、参照物、障碍物放置 在光伏系统设计中&#xff0c;参照…

linux如何对c++进行内存分析

linux如何对c进行内存分析 背景分析方法以及原理原理分析结果以及重点关注 背景 在工作中&#xff0c;我遇到一个问题&#xff0c;需要将c写的进程部署到MCU上。由于MCU上可用的RAM 非常有限&#xff0c;所以在部署时就需要考虑到使用内存大小。所以为了搞清楚&#xff0c;内存…

go注册中心Eureka,注册到线上和线下,都可以访问

go注册中心Eureka&#xff0c;注册到线上和线下&#xff0c;都可以访问 本地通过127访问&#xff0c; 线上通过内网ip访问 package mainimport ("github.com/SimonWang00/goeureka""github.com/gin-gonic/gin""wbGo/controller""wbGo/task…

论文阅读 - MDFEND: Multi-domain Fake News Detection

https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…

机房动力环境监控系统组成

机房动力环境监控系统已经广泛应用于各种类型的机房,尤其稍微重要的机房,都需要做环境监控系统,因此我们要熟知这个系统,如果你还不懂的话,可以看看这篇文章。 一、动环系统简介 计算机系统数量与日俱增,其配套的环境设备也日益增多,计算机房已成为各大单位的重要组成…