创建一个与 LangChain 集成的 Chainlit 应用程序
xsobi 2024-12-06 20:28 24 浏览
在本文中,我们将逐步介绍如何创建一个与 LangChain 集成的 Chainlit 应用程序。
前提条件
开始之前,请确保具备以下条件:
- 已安装并可正常使用的 Chainlit
- 安装了 LangChain 包
- OpenAI API 密钥
- 基本的 Python 编程知识
第 1 步:创建 Python 文件
在您的项目目录中创建一个名为 chainlit-app.py 的新 Python 文件。此文件将包含大型语言模型(LLM)应用程序的主要逻辑。
第 2 步:编写应用程序逻辑
在上述python文件中,导入必要的包,并定义一个函数来处理新的聊天会话,另一个函数来处理来自用户界面的消息。
使用 Langchain 表达式语言 (LCEL),示例代码如下所示:
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain.schema.runnable import Runnable
from langchain.schema.runnable.config import RunnableConfig
from typing import cast
from dotenv import load_dotenv
import chainlit as cl
import os
# 设置代理服务器的环境变量,以便通过代理进行网络请求
os.environ['HTTP_PROXY'] = 'http://127.0.0.1:8001' # 设置HTTP代理
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:8001' # 设置HTTPS代理
# 加载.env文件中的环境变量
load_dotenv()
# 在聊天开始时,创建一个模型实例和prompt模板
@cl.on_chat_start
async def on_chat_start():
# 创建一个模型实例,启用流式输出
model = ChatOpenAI(streaming=True)
# 创建一个prompt模板
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一位知识渊博的历史学家,对历史问题提供了准确而雄辩的答案。",
),
("human", "{question}"),
]
)
# 创建一个Runnable对象,用于处理聊天请求
runnable = prompt | model | StrOutputParser()
# 将Runnable对象存储在用户会话中
cl.user_session.set("runnable", runnable)
# 处理用户消息
@cl.on_message
async def on_message(message: cl.Message):
# 从用户会话中获取Runnable对
runnable = cast(Runnable, cl.user_session.get("runnable")) # type: Runnable
# 创建一个空消息对象,用于流式输出
msg = cl.Message(content="")
# 异步处理聊天请求,并流式输出结果
async for chunk in runnable.astream(
{"question": message.content},
config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]),
):
# 流式输出每个chunk
await msg.stream_token(chunk)
# 发送最终消息
await msg.send()
这段代码为每个聊天会话设置了 Runnable 的一个实例,并为每个会话定制了一个 ChatPromptTemplate。每当用户发送消息时,就会调用 Runnable 来生成响应。
回调处理器负责监听链的中间步骤,并将它们发送到用户界面。
第 3 步:运行应用程序
要启动应用程序,请打开终端,导航到包含 chainlit-app.py 的目录。然后运行以下命令:
chainlit run chainlit-app.py -w
-w 标志告诉 Chainlit 启用自动重载,因此不需要每次对应用程序进行更改时都重新启动服务器。聊天机器人用户界面现在应该可以在 http://localhost:8000 上访问。
了解智能体开发更多细节,访问智能体Agent轻松入门专栏,内容包括:理解什么是智能体(AI Agent),基于LangChain开源框架从零开始实现简单的智能体开发,学习如何使用 LangSmith 监控工具监控和追踪智能体的内部运行,以及综合使用PyPDF2库、Qdrant 向量数据库、Agent智能体、OpenAI 大语言模型、Gradio库等技术来进行开发实践。
相关推荐
- 我把家搬进了NAS?家庭资产数字化革命,现在连袜子都有编号了!
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙家里东西一多,总有一种“我记得我有这个,但我不知道放哪了”的错觉。...
- Mega Run第3关通关攻略-跳上高空(mega运动)
-
错过火炮等于失败,这是MegaRun在上一关中给玩家的一点小挑战,那在后面的关卡中,这中挑战会给你造成什么困难呢?具体请看MegaRun第3关通关攻略-跳上高空。MegaRun第3关在一开始我...
- Axure高保真教程:中继器表格自动合计模板
-
编辑导语:合计作为日常使用频率比较高的一个功能,但在Axure里面传统的表格如果做合计是很麻烦的,遇到数据多的时候很耗费时间,那么该如何优化,提高工作效率?本文以中继器表格为核心,教大家如何制作一个自...
- 多角色登录原型(分角色登录)
-
编辑导读:多角色登录是很多系统都需要具备的功能,例如在招聘网站里,登录的角色包括、求职者、招聘企业的hr、猎头、内部员工等等。本文作者分享了如何在Axure里面制作多角色登录的原型模板,希望对你有帮助...
- 利用Axure+js创建可配置地图页面(axure地址选择)
-
编辑导语:如何利用Axure实现自定义地图展示?本篇文章里,作者结合Axure与高德地图,对如何在Axure中设置相应参数、进而预览时实现自定义地图展示效果的操作流程进行了示范和总结,一起来看一下。本...
- 纬地智能模板的一些基础与概念(纬地智能模板的一些基础与概念是什么)
-
对于公路及相关土木工程的勘测设计工作,虽然基础的理论和方法是基本相同的,但是受到各国家、地区文化、制图习惯等方面因素的影响,不同地域公路勘测设计的习惯和表达方式有着很大的差异,当然语言方面的不同和差...
- WPF界面开发第三方控件入门指南——菜单项
-
点击“了解更多”获取工具DevExpressWPFSubscription拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强...
- 鸿蒙开发:自定义一个搜索模版(鸿蒙系统怎么添加百度搜索条)
-
前言代码案例基于Api13。...
- 简单介绍一下前端各框架中的模板标签
-
在各大前端框架、小程序中,此类标签的作用主要是用来帮助我们包裹多个元素。在浏览器实际渲染中会将其移除只渲染其包裹的DOM元素,所以说不会增加额外的DOM节点...
- 法媒:简单的几个步骤让你的运动鞋更加炫酷
-
【环球网综合报道】有没有觉得自己的运动鞋样式单调,希望它变得更加炫酷?法媒《ELLE》推荐了一种简单易行的装饰方法,让您的运动鞋更加时尚。制作前,您需要准备一张细毡子、一张闪光热胶合布、胶水、两个银夹...
- Blazor 代码隐藏(blazor 操作dom)
-
Razor组件通常是在单个.razor文件中创作的,这样就存在页面中包含html代码和后台代码(@code标记指定的代码)。如下...
- DevExpress WPF入门指南:DXBars, DXRibbon中使用MVVM的两种方式
-
你也可以下载Universal安装包或者到DevExpress中文网查看更多示例和教程哦本文档介绍在DXBars,DXRibbon和GalleryControl这三个控件中使用MVVM框架的...
- 干货,Uploadfive插件上传,Python接收存储
-
在Web开发工作中,经常遇到上传需求,上传照片,文件等,网上的上传插件有很多,我使用的是一款H5上传插件Uploadfive,与之对应的是Uploadify,后者是基于Flash的,不过现在越来越多的...
- 用DevExpress实现基于HTML&CSS的桌面应用程序的UI(二)
-
DevExpressWinForm拥有180+组件和UI库,能为WindowsForms...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)