使用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代表文件名 选项…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
