使用LangChain创建简易聊天机器人


LangChain 是什么
就是一个框架或者说是一个工具,用来写 AI 应用。对,没有错!AI小白也可以,有手就行!
LangChain有几个核心模块:Models、Prompts、Chains、Indexes、Memory、Agents。
这篇主要介绍Models、Prompts这2个最基本的模块。

配置环境
开发之前需要先配置好开发环境变量,我使用Python语言,然后安装LangChain即可。这2项都可以通过pip 命令完成
pip install Python
pip install langchain

Models
LangChain 最核心的功能就是能够集成各种大模型LLM,后续所有的功能实现以及扩展都是基于此功能的基础之上。
云端大模型 API
LangChain 官网列举了它能够集成调用的所有大模型,如下图:

几乎你在网上能看到的模型LangChain都支持。以 OpenAi 使用为例,可以通过以下方式导入并创建OpenAi大模型:
from langchain.llms import OpenAI
llm = OpenAI() 上述代码中的llm 就是创建的OpenAi模型对象。接下来只要传入相应的Prompt(提示词),并调用invoke方法就可以拿到OpenAi大模型的输出,如下:
response = llm.invoke("List the seven wonders of the world.")
print(response) "List the seven wonders of the world." 就是传入大模型的Prompt(提示词), response就是调用大模型invoke方法之后的结果,将结果打印出来如下:
1. Great Pyramid of Giza
2. Hanging Gardens of Babylon
3. Temple of Artemis at Ephesus, Turkey
4. Statue of Zeus at Olympia, Greece
5. Colossus of Rhodes, Greece
6. Lighthouse of Alexandria, Egypt
7. Mausoleum at Halicarnassus, Turkey 本地 local 模型
除了 OpenAi 这些收费的大模型之外,LangChain也可以集成本地大模型。以Meta公司的Llama举例。在LangChain官网的支持的大模型介绍中,有如下描述:

可以看出,使用 Llama.cpp 加载本地的gguf格式大模型。
因此我们需要下载一个大模型到电脑本地,我使用的是Mistral的免费模型,可以在 HugginFace 网站中找到,如下:

下载好 gguf 格式大模型文件并保存后,在同级目录下创建langchain_intro.py文件,目录结构如下:

然后在 langchain_intro.py 中导入 LlamaCpp,并创建模型实例。如下:
from langchain_community.llms import LlamaCpp# 声明大模型的路径
MODEL_NAME = 'mistral-7b-instruct-v0.1.Q4_K_M.gguf'# 加载本地 mistal 大模型
llm = LlamaCpp(
model_path=MODEL_NAME,
n_gpu_layers=40,
n_batch=512, # Batch size for model processing
verbose=False, # Enable detailed logging for debugging
) 创建好 llm 模型实例之后,就可以构建模型需要的Prompt(提示词)。最终调用 llm 模型的 invoke 方法就可以获取大模型的返回结果了。如下:
question = "What is a good name for a company that makes Chocolate Milk ?"result = llm.invoke(question)
print(result) 最终打印结果如下:
This is an open-ended question, so there are many potential names that could work well depending on your specific vision and goals for the company. Here are some suggestions to get you started:1. Creamy Delight: This name plays off the creamy texture of chocolate milk and suggests a delicious treat.
2. Chocolate Bliss: A simple and straightforward name that captures the pleasure of enjoying chocolate milk.
3. Sweet Milk: This name emphasizes the sweetness of chocolate milk and could appeal to customers who enjoy a sweet drink.
4. Velvet Chocolate: The velvety texture of chocolate milk is highlighted in this name, which also suggests a rich and indulgent taste.
5. Rich and Creamy: This name emphasizes the richness and creaminess of chocolate milk, making it sound like a luxurious treat.
6. Milk Chocolate Dreams: This name plays off the idea of enjoying chocolate milk as a way to escape from everyday stresses and indulge in a sweet moment of bliss.
7. Cocoa Delight: A name that emphasizes the cocoa content of chocolate milk, which could appeal to customers who enjoy the rich taste of Prompt
在上面加载 LLM 的实例代码中,直接使用了 "What is a good name for a company that makes Chocolate Milk ?" 来当做大模型的文本输入。
但是这种文本输入格式不具备灵活性。比如我们做的大模型应用是根据用户的输入来动态设置制作的产品,也就是将 Chocolate Milk 设置为一个变量。
这就需要 LangChain 中的 Prompts 模块发挥作用。具体通过 PromptTemplate 来创建 Prompt 模版。如下所示:
from langchain_community.llms import LlamaCpp
from langchain.prompts import PromptTemplateMODEL_NAME = 'mistral-7b-instruct-v0.1.Q4_K_M.gguf'# 加载本地 mistal 大模型
llm = LlamaCpp(model_path=MODEL_NAME,n_gpu_layers=40,n_batch=512, # Batch size for model processingverbose=False, # Enable detailed logging for debugging
)# 在 question 中添加占位符
question = "What is a good name for a company that makes {product}?"# 构建 PromptTemplate
prompt = PromptTemplate(input_variables=["product"],template=question,
) 可以看到,对 question 进行了修改,主要是添加了占位符{product}。然后创建PromptTemplate实例,并设置LangChain的第一个输入将占位符进行替换。
建好 PromptTemplate 之后,就可以通过LangChain将 LLM 和 prompt 对象进行组合,并调用大模型方法获取结果。如下:
product_name = "candy"
product_format = prompt.format(product=product_name)
print("final prompt is " + product_format)
# 使用 LLM Chain 组合 Prompt 和 LLM
llm_chain = prompt | llm# 执行 llm_chain,并打印结果
answer = llm_chain.invoke(product_name)
print(answer, '\n') 可以看到,设置了 product=candy。最终打印结果如下:

使用 LangChain 实现简易聊天机器人
通过加载 Models,并创建合适的Prompts。我们已经可以调用本地大模型获取相应的输出结果。可以在此基础上,再加上循环接收用户输入。并将输入设置到 PromptTemplate 中,并最终从本地大模型中获取结果。完整代码如下:
from langchain_community.llms import LlamaCpp
from langchain.prompts import PromptTemplateMODEL_NAME = 'mistral-7b-instruct-v0.1.Q4_K_M.gguf'# 加载本地 mistal 大模型
llm = LlamaCpp(model_path=MODEL_NAME,n_gpu_layers=40,n_batch=512, # Batch size for model processingverbose=False, # Enable detailed logging for debugging
)# 在 question 中添加占位符
question = "What is a good name for a company that makes {product}?"# 构建 PromptTemplate
prompt = PromptTemplate(input_variables=["product"],template=question,
)# 使用 LLM Chain 组合 Prompt 和 LLM
llm_chain = prompt | llmprint("请输入产品名称:")while True:# 由用户输入 product_name,并设置到PromptTemplate中product_name = input("> ")product_format = prompt.format(product=product_name)print("final prompt is " + product_format)# 执行 llm_chain,并打印结果answer = llm_chain.invoke(product_name)print(answer, '\n') 运行效果如下:


如果你喜欢本文
长按二维码关注


相关文章:
使用LangChain创建简易聊天机器人
LangChain 是什么 就是一个框架或者说是一个工具,用来写 AI 应用。对,没有错!AI小白也可以,有手就行! LangChain有几个核心模块:Models、Prompts、Chains、Indexes、Memory、Agents。 这篇主要介绍Models、…...
研究生学习---找工作
规划 研一~研二上学期完成小论文,实习,秋招 竞赛:kaggle? 面试题一般简单且为原题,笔试题目很难,不会出原题 项目 找工作软件...
偶然发现了Python的一个BUG。。。
一般情况下,dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下,再来执行这句代码,却是会报KeyError,如下图: Python3.10和Python3.9也能复现该情况,正当我摩拳踩掌,…...
36. 有效的数独 - 力扣(LeetCode)
基础知识要求: Java:方法、for循环、if判断、数组 Python: 方法、for循环、if判断、列表、集合 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一…...
开源收银系统在服装连锁店中发挥的重要作用
在当今竞争激烈的零售市场中,服装连锁店面临着日益复杂的经营环境和多样化的消费需求。在这样的背景下,开源收银系统成为了服装连锁店管理的关键利器。该系统不仅提供了高效的收银功能,还涵盖了进销存管理、会员管理、门店补货等多方面功能&a…...
代码随想录三刷day51
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣200. 岛屿数量二、力扣695. 岛屿的最大面积三、力扣1020. 飞地的数量四、力扣130. 被围绕的区域 前言 依然是从地图周边出发,将周边空格相邻…...
基于python+Django的二维码生成算法设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
pytorch 2.0 多线程并行,导致GPU利用100%,卡住
背景: 程序中有pytorch模型两个,yolov5,crnn。 之前无论是pth格式,还是TRT格式,并行的都没有问题。 最近发现,多线程ThreadPoolExecutor(max_workers2)调用的时候,即单个进程内处理一张图像&a…...
后端开发面经系列 -- 阿里C++二面面经
阿里C二面面经 公众号:阿Q技术站 来源:https://www.nowcoder.com/feed/main/detail/fc4a48403b534aafa6a6bce14b542c4e?sourceSSRsearch 1、智能指针? std::shared_ptr: 原理:std::shared_ptr是基于引用计数的智能指…...
【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程
In Defense of Grid Features for Visual Question Answering实现流程 网格特征预训练代码 这是该论文的特征预训练代码发布: @InProceedings{jiang2020defense,title={In Defense of Grid Features for Visual Question Answering},author={Jiang, Huaizu and Misra, Ishan…...
MySQL用SQL取三列中最大的数据值
1、有如下数据: ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式: ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…...
【Mac】如何解决打开PD虚拟机后Mac无法上网的问题?
问题描述 部分用户在运行Parallels Desktop并打开Windows 11后,发现Windows上网没有问题,但是Mac主机不能访问带域名的网站,而访问带IP的网站没问题,退出Parallels虚拟机以后,Mac网络又恢复正常。 解决办法 退出 Pa…...
【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库
今天是第七专题,主要内容是:导入ArduinoUZlib功能库,借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据,进行解压缩和t解析,在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容,请…...
leetcode题目9
回文数 简单 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数:是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 思路 对于数字进行反转&a…...
CNAME记录
CNAME记录 维基百科,自由的百科全书 (重定向自CNAME) 真实名称记录(英语:Canonical Name Record),即CNAME记录,是域名系统(DNS)的一种记录。CNAME记录用于…...
pytest + yaml 框架 -69.新增depend 关键字,导入其它yaml用例
前言 有小伙伴提到,test_a.yml 中已经写了几个流程,test_b.yml 中希望能接着test_a.yml去写用例,于是就需要先导入test_a.yml用例。 为了满足此需求,v1.6.3版本 在config 中新增 depend 关键字。 需求场景 test_a.yml 中已经写…...
【网络】tcp的初始化序列号为什么要随机生成
TCP序列号和确认序列号 在TCP协议中,每个数据包都包含一个序列号和一个确认序列号,用于实现可靠的数据传输和流量控制。 序列号(Sequence Number):序列号是发送端为每个发送的数据包分配的唯一标识,用于标…...
【SRC实战】利用APP前端加密构造数据包
挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场,如有雷同,纯属巧合” 01 — 漏洞证明 “ 参数加密的情况,不会逆向怎么办?” 1、新用户首次设置密码时抓包,此处设置为0000…...
ThreadLocal描述
ThreadLocal是Java中的一个类,用于在多线程环境下存储和获取线程相关的数据。每个ThreadLocal对象都可以维护一个线程本地的变量副本,这意味着每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。这种特性使得ThreadLocal非常适合…...
Linux-基础命令第三天
1、命令:wc 作用:统计行数、单词数、字符数 格式:wc 选项 文件名 例: 统计文件中的行数、单词数、字符数 说明:59代表行数,111代表单词数,2713代表字符数,a.txt代表文件名 选项…...
Python点云处理入门:从零开始用pypcd4库读取.pcd文件并可视化(附完整代码)
Python点云处理入门:从零开始用pypcd4库读取.pcd文件并可视化 点云数据正逐渐成为三维感知领域的通用语言,从自动驾驶的环境建模到工业质检的精密测量,这些由数百万个空间点构成的数据集正在重塑我们与物理世界交互的方式。对于刚接触这一领域…...
从蓝牙时钟到通用Timer:详解非32位满量程下的时间回环处理技巧
从蓝牙时钟到通用Timer:非标准位宽下的时间回环处理实战指南 在嵌入式系统中,时间管理如同隐形的骨架,支撑着各类关键功能的稳定运行。当开发者从32位通用定时器转向蓝牙协议栈中的28位时钟,或面对某些硬件平台上的24位专用定时器…...
Purple Pi OH开发板Android 11系统ROOT权限获取与Magisk实战指南
1. 项目概述:为什么我们需要对Purple Pi OH进行ROOT?拿到一块Purple Pi OH开发板,刷上Android 11系统,对于开发者或极客玩家来说,最常遇到的第一个“痒点”可能就是权限不足。系统默认运行在“用户模式”下,…...
【Perplexity知识图谱查询实战指南】:20年专家亲授3大隐性陷阱与5步精准检索法
更多请点击: https://codechina.net 第一章:Perplexity知识图谱查询的核心原理与能力边界 Perplexity 知识图谱查询并非传统关键词匹配,而是基于语义解析的多跳推理引擎。其核心依赖于三元组嵌入(Triple Embedding)与…...
嵌入式存储优化实战:如何为你的AUTOSAR FEE模块选择合适的FeeMainFunctionPeriod与FeeMaxBytesPerCycle?
嵌入式存储优化实战:AUTOSAR FEE模块参数配置与性能调优 在汽车电子控制单元(ECU)的开发中,存储管理一直是影响系统性能和可靠性的关键因素。AUTOSAR的Flash EEPROM Emulation(FEE)模块作为非易失性数据存储…...
4大技术支柱:构建Pixelle-Video的模块化AI视频生成系统
4大技术支柱:构建Pixelle-Video的模块化AI视频生成系统 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 传统视频制作流程需要…...
Prodigal原核生物基因预测工具:3天从零到精通的完整指南
Prodigal原核生物基因预测工具:3天从零到精通的完整指南 【免费下载链接】Prodigal Prodigal Gene Prediction Software 项目地址: https://gitcode.com/gh_mirrors/pr/Prodigal 你是否正在为原核生物基因组分析而烦恼?面对海量的DNA序列数据&…...
从FPS相机到无人机控制:在Unity中实战Pitch、Yaw、Roll角的应用与调试技巧
从FPS相机到无人机控制:在Unity中实战Pitch、Yaw、Roll角的应用与调试技巧 在游戏开发中,相机控制和物体旋转是构建沉浸式体验的核心技术。无论是第一人称射击游戏中玩家视角的流畅转动,还是飞行模拟器中飞机的真实运动,都离不开对…...
DB2数据字段拼接实战:从LISTAGG到XMLAGG的进阶应用与避坑指南
1. 从LISTAGG到XMLAGG:DB2字段拼接的进化之路 第一次在DB2里用LISTAGG函数时,那种丝滑的体验让我误以为找到了终极解决方案——直到某天凌晨三点,生产环境突然报警,日志里赫然写着"SQL0407N The result of a scalar fullsel…...
C51内存优化:DATA段间隙问题解决方案
1. C51内存空间中的DATA段间隙问题解析作为一名长期使用Keil C51开发工具链的嵌入式工程师,我经常遇到内存空间利用率问题。最近在调试一个使用bit变量的项目时,发现链接器在寄存器组和bit区域之间留下了15字节的间隙。这种内存浪费在资源紧张的8051系统…...
