当前位置: 首页 > news >正文

利用 LangChain 构建对话式 AI 应用

随着人工智能技术的快速发展,对话式 AI 已成为现代应用的核心部分。在构建智能客服、虚拟助手以及交互式学习平台时,一个强大且灵活的框架显得尤为重要。本文将深度解析 LangChain 这一框架的功能及实际使用,帮助开发者快速上手。

什么是 LangChain?

LangChain 是一个开源的 Python 和 JavaScript 库,专注于构建由大型语言模型 (LLM) 驱动的应用程序。它提供了强大的工具来管理复杂的提示链条、持久化用户上下文以及与外部数据源交互。

LangChain 的核心功能包括:

  1. Prompt 模板:灵活地管理多级提示。

  2. Chains:串联任务以实现复杂功能。

  3. Memory:支持对话上下文的记忆。

  4. 连接器:与数据库、API 和文件系统无缝集成。

接下来,我们将通过一个具体示例演示如何使用 LangChain 构建一个对话式 AI 应用。


案例构建:知识问答机器人

我们将创建一个知识问答机器人,能够根据用户的问题,实时检索相关文档并生成回答。

环境准备

  1. 安装必要库:

pip install langchain openai faiss-cpu tiktoken
  1. 获取 OpenAI 的 API 密钥:OpenAI API

  2. 准备一些示例数据,例如一个 PDF 文件,作为机器人回答问题的知识来源。

步骤 1:数据预处理

首先,我们需要将知识源(PDF 文件)转换为 LangChain 可处理的文档格式:

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载 PDF 文件
loader = PyPDFLoader("sample_document.pdf")
documents = loader.load()# 将文本拆分成小块
txt_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
split_docs = txt_splitter.split_documents(documents)

步骤 2:构建知识索引

为了快速检索答案,我们可以使用 FAISS 创建向量化搜索索引:

from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings# 将文档向量化
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(split_docs, embeddings)# 保存索引以便后续使用
vectorstore.save_local("faiss_index")

步骤 3:定义对话逻辑

接下来,使用 LangChain 的 RetrievalQA 模块定义机器人如何从索引中检索并生成答案:

from langchain.chains import RetrievalQA
from langchain.llms import OpenAI# 加载已保存的索引
vectorstore = FAISS.load_local("faiss_index", embeddings)# 创建 LLM 和 QA Chain
llm = OpenAI(model="gpt-4", temperature=0.5)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())# 测试问答逻辑
query = "什么是 LangChain?"
response = qa_chain.run(query)
print(response)

步骤 4:添加记忆功能

为了让机器人 "记住" 用户的上下文,可以结合 Memory 模块实现:

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory# 初始化记忆模块
memory = ConversationBufferMemory()
conversation = ConversationChain(llm=llm, memory=memory)# 模拟多轮对话
print(conversation.run("告诉我关于LangChain的用途。"))
print(conversation.run("它支持哪些集成功能?"))

步骤 5:部署 API 服务

最后,我们可以通过 FastAPI 将这个知识问答机器人部署为一个在线服务:

from fastapi import FastAPI, Requestapp = FastAPI()@app.post("/chat")
async def chat(request: Request):data = await request.json()user_input = data["input"]response = conversation.run(user_input)return {"response": response}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

关键点总结

  1. 模块化设计:LangChain 将不同功能模块化,方便开发者灵活组合。

  2. 支持扩展:可与 FAISS、OpenAI API 等外部工具无缝集成。

  3. 强大的记忆机制:提升对话式 AI 的交互体验。

通过本文示例,大家可以看到 LangChain 的实际应用场景与便捷之处。不论是构建简单的问答机器人还是复杂的对话式 AI,LangChain 都是一个值得尝试的工具。


下一步学习资源

  • LangChain 官方文档

  • OpenAI API 文档

  • FAISS 官方仓库

如果您在实践中遇到问题或有其他技术问题,欢迎在评论区留言,我们一起探讨学习!

相关文章:

利用 LangChain 构建对话式 AI 应用

随着人工智能技术的快速发展,对话式 AI 已成为现代应用的核心部分。在构建智能客服、虚拟助手以及交互式学习平台时,一个强大且灵活的框架显得尤为重要。本文将深度解析 LangChain 这一框架的功能及实际使用,帮助开发者快速上手。 什么是 La…...

力扣--34.在排序数组中查找元素的第一个和最后一个位置

题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&…...

【Java回顾】Day2 正则表达式----异常处理

参考资料:菜鸟教程 https://www.runoob.com/java/java-exceptions.html 正则表达式 有一部分没看完 介绍 字符串的模式搜索、编辑或处理文本java.util.regex包,包含了pattern和mathcer类,用于处理正则表达式的匹配操作。 捕获组 把多个字符…...

【SpringBoot】当 @PathVariable 遇到 /,如何处理

1. 问题复现 在解析一个 URL 时,我们经常会使用 PathVariable 这个注解。例如我们会经常见到如下风格的代码: RestController Slf4j public class HelloWorldController {RequestMapping(path "/hi1/{name}", method RequestMethod.GET)publ…...

【FlutterDart】页面切换 PageView PageController(9 /100)

上效果: 有些不能理解官方例子里的动画为什么没有效果,有可能是我写法不对 后续如果有动画效果修复了,再更新这篇,没有动画效果,总觉得感受的丝滑效果差了很多 上代码: import package:flutter/material.…...

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 (1)常见的日志级别优先级 (2&…...

Flask是什么?深入解析 Flask 的设计与应用实践

文章目录 一、引言:从微框架到生态系统二、Flask 的核心设计理念三、Flask 的关键组件解析3.1 路由系统3.2 请求与响应对象3.3 模板引擎 Jinja23.4 扩展系统 四、Flask 的并发与性能优化4.1 默认的单线程模型4.2 提升并发性能的方法4.3 性能优化技巧 五、在企业级场…...

malloc函数和calloc函数的区别是什么?

malloc函数和calloc函数在动态内存管理中都起着分配内存空间的作用,但它们存在以下区别: 参数方面 - malloc函数:它只有一个参数,该参数表示要分配的字节数。例如, int *ptr (int *)malloc(10 * sizeof(int)); &#…...

Ansys Maxwell:3PH 变压器电感计算

各位变形金刚粉丝们,大家好: 在本博客中,我讨论了如何使用 Ansys Maxwell 计算三相变压器中的自感、互感和漏感。有多种方法和表达式可用于计算这些电感。 基本电感定义 电感的单位是亨利(H),其基本单位…...

【Go】Go文件操作详解

1. 前言 相信如果看过之前文章的朋友们一定知道我想讲什么了?灵魂三问:文件是什么?为什么需要文件?文件怎么操作?前面章节我们已经能够编写各种各样的功能代码了,但是一个很现实的问题就是我们没有任何 持…...

[react+ts] useRef获取自定义组件dom或方法声明

想用useRef获取自定义组件? 如果获取dom,直接写 const sonRef useRef<HTMLDivElement>(null); 然后子组件用forwardRef包一层,注意是HTMLDivElement,别写错, 写HTMLElement不行 const Son forwardRef<HTMLDivElement, IProps>((props, ref) > {}) 切记这…...

AI 将在今年获得“永久记忆”,2028美国会耗尽能源储备

AI的“永久记忆”时代即将来临 谷歌前CEO施密特揭示了AI技术的前景&#xff0c;他相信即将在2025年迎来一场伟大的变化。AI将实现“永久记忆”&#xff0c;改变我们与科技的互动过程。施密特将现有的AI上下文窗口比作人类的短期记忆&#xff0c;难以持久保存信息。他的设想是…...

【视频笔记】基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil【持续更新】

视频链接: 基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil 从头编写一个视觉语言模型:PloyGamma,是谷歌的一个模型 1:原始图像 2:视觉编码器(本文是viT),通过对比学习进行训练。这个对比学习最开始是CLIP,后来被谷歌改成了SigLIP 3:线性投影层 4:如何将图…...

解决 C++ 中头文件相互引用和解耦问题

在 C 中&#xff0c;当多个 .h 文件相互引用时&#xff0c;可能会导致 循环依赖 或 头文件冗余 问题&#xff0c;进而引发编译时间延迟、代码复杂度增加等问题。为了有效地解耦和组织代码&#xff0c;可以采用以下几种策略和思想&#xff1a; 1. 前向声明&#xff08;Forward …...

河马剧场(短剧)APP的邀请码怎么填写

上篇给大家说到河马剧场免费看短剧还能领5.2元3天vip会员&#xff0c;本文就说一下河马剧场河马短剧APP的邀请码怎么填写。 河马短剧APP填写邀请码分三步&#xff1a; 1、安装登陆河马短剧APP 2、点击底部导航栏中间的“福利” 3、往下划会看到“填写邀请码领3天vip” 4、…...

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下&#xff1a;CPU&#xff0c;ARM(能读能写)&#xff0c;Flash&#xff08;能读&a…...

第1章:数据库基础

第1章&#xff1a;数据库基础 1.1 数据库概述 1.1.1 什么是数据库 数据库的定义数据库的发展历程数据库的重要性 1.1.2 关系型数据库简介 关系型数据库模型常见的关系型数据库关系型数据库的特点 1.1.3 MySQL在企业中的应用 Web应用电商平台金融系统大数据存储 1.2 数据…...

C++教程 | string类的定义和初始化方法

在C中&#xff0c;string是标准库中用于处理字符串的类&#xff0c;定义在 头文件中&#xff0c;它提供了方便、灵活的字符串操作功能。以下是一些常见的定义和初始化string对象的方法&#xff1a; 1. 默认初始化 可以直接定义一个空的string对象&#xff0c;语法如下&#x…...

React中的合成事件

合成事件与原生事件 区别&#xff1a; 1. 命名不一样&#xff0c;原生用纯小写方式&#xff0c;react用小驼峰的方式 原生&#xff1a;onclick React的&#xff1a;onClick 2. 事件处理函数的写法不一样 原生的是传入一个字符串&#xff0c;react写法传入一个回调函数 3.…...

[SMARTFORMS] 创建FORM

输入事务码SMARTFORMS进入表单开发界面&#xff0c;选中表单&#xff0c;自定义表单名称ZFS_DEMO_2025 点击"创建"按钮&#xff0c;跳转至"SAP表格设计器"页面 在"表格属性"填写表单描述、指定页格式和样式 在"表格接口"可以填写SMART…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...