【Langchain+Streamlit】打造一个旅游问答AI

        利用Langchain+Streamlit打造一个交互简单的旅游问答AI机器人,如果你有openai账号,可以按照如下的网址直接体验,如果你没有的话可以站内私信博主要一下临时key体验一下:

        产品使用传送门—— http://101.33.225.241:8501/

        这里有演示效果和代码讲解的视频传送门 ——【Langchain+Streamlit】超简单旅游问答AI(代码共享&账号分享)_哔哩哔哩_bilibili

        github传送门 —— GitHub - jerry1900/langchain_qabot: 用langchain,streamlit实现的简单问答机器人,只回答旅游方面的问题,适合langchain和streamlit初学者

        下面是一些使用效果截图,如果你问的是地理和旅游问题,他会给出很好的答案:

        如果你问的问题和旅游无关,他将不予回答:

         这么酷的旅游问答AI机器人,只用了不到100行代码,让我们来一起愉快地看代码吧!

1. 前端和页面部分用Streamlit构造,简单pyhon即可搞定

        首先引入必要的包,然后设置标题和主题内容(基本每行代码都有注释,结构简单清晰易懂):

import ioimport streamlit as st
from PIL import Image# 设置page_title内容
st.set_page_config(page_title="AI小万的旅游问答机器人")# 设置首行内容
st.title('🤖AI小万的旅游问答机器人😜')

        然后设置左侧用于输入openai_key和base_url的sidebar:

# 设置左边的sidebar内容
with st.sidebar:# 设置输入openai_key和接口访问地址的两个输入框openai_key = st.text_input('OpenAI API Key', key='open_ai_key')openai_base_url = st.text_input('OpenAI BASE URL', 'https://api.openai.com', key='openai_base_url')# 设置一个可点击打开的展开区域with st.expander("🤓国内可访问的openai账号"):st.write("""1. 如果使用默认地址,可以使用openai官网账号(需科学上网🥵).2. 如果你没有openai官网账号,可以联系博主免费试用国内openai节点账号🥳.""")# 本地图片无法直接加载,需先将图片读取加载为bytes流,然后才能正常在streamlit中显示image_path = r"C:\Users\PycharmProjects\langchain\wechat.jpg"image = Image.open(image_path)image_bytes = io.BytesIO()image.save(image_bytes, format='JPEG')st.image(image_bytes, caption='AI小万老师的微信', use_column_width=True)

        在设置openai_key和openai_base_url的时候,使用了st的session技术,使用key来标记这两个元素,这两个元素在后面的代码中会使用到。

        我们在加载本地图片的时候有一点问题,没有办法直接用(如果是http网络资源直接加载就OK了,但是本地图片不行)。所以我们需要先把图片读取加载为bytes流,然后才能在streamlit中显示。

        至此,页面的主体结构就有了。

2.  构造一个输入用户问题以及openai相关参数,输出openai回答的函数

        首先是函数的入参说明和引入的包,主要是langchain相关的包,对于这一块不太熟的同学可以去看我以前的langchain专栏教学,这里是传送门——【2024最全最细Langchain教程-3 】Langchain模型I/O之提示Prompt(一)-CSDN博客:

def generate_response(input_text, open_ai_key, openai_base_url):""":param input_text:  用户输入的查询问题,类型为str:param open_ai_key: 用户输入的openai_key,类型为str:param openai_base_url: 用户输入的openai访问地址,类型为str:return: 返回langchain查询openai获得的结果,类型为str"""from langchain_openai import ChatOpenAIfrom langchain.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParser

        构造一个语言模型包装器llm,注意这里的openai相关参数是调用函数的时候传入进来的:

  # 构造一个聊天模型包装器,key和url从函数输入中获取llm = ChatOpenAI(temperature=0,openai_api_key=open_ai_key,base_url=openai_base_url)

       构造完语言模型包装器之后,我们来构造提示词模板和提示词,这里的提示词模板是实现AI机器人只回答旅游相关问题的关键,这里你能领略到prompt engineering提示词工程的初步魅力:

# 构造一个模板template和一个prompt,从这里你可以看到提示词工程(prompt  engineering)的重要性template = """你是一个万贺创造的旅游问答机器人,你只回答用户关于旅游和地理方面的问题。你回答用户提问时使用的语言,要像诗一样优美,要能给用户画面感!如果用户的问题中没有出现地名或者没有出现如下词语则可以判定为与旅游无关:‘玩、旅游、好看、有趣、风景’案例:1. 用户问题:今天天气如何? 你的回答:抱歉,我只负责回答和旅游、地理相关的问题。2. 用户问题:你是谁?你的回答:我是万贺创造的旅游问答机器人,我只负责回答和旅游、地理相关的问题。3. 用户问题:今天股市表现如何?你的回答:抱歉我只负责回答和旅游、地理相关的问题以下是用户的问题:{question}"""prompt = PromptTemplate(template=template, input_variables=["question"])

        构造完prompt之后我们开始构造输出解析器和链:

  # 构造一个输出解析器和链output_parser = StrOutputParser()chain = prompt | llm | output_parserresponse = chain.invoke({"question": input_text})st.info(response)

3. 构造一个用户用于输入问题的表单

        我们来构造一个给用户输入问题的表单,这里每一步都有详细的中文注释,细的不能再细了,大家自己看就好了:

# 构造一个用于输入问题的表单
with st.form('提交问题的表单'):text = st.text_area('请提一个您感兴趣的旅游或地理问题', '英国的首都在哪儿?')submitted = st.form_submit_button('提交')# 如果用户提交的key格式有误提醒用户if not st.session_state['open_ai_key'].startswith('sk-'):st.warning('您输入的openai秘钥格式有误')# 如果用户点击了提交按钮并且key格式无误则加载一个spinner加载状态if submitted and st.session_state['open_ai_key'].startswith('sk-'):with st.spinner("AI小万正在飞快加载中..."):# 加载状态进行中,调用我们之前构造的generate_response()方法,把用户的输入,key和url等参数传递给函数generate_response(text, st.session_state['open_ai_key'], st.session_state['openai_base_url'])st.success("AI小万为您加载完成!")

        至此,整个项目就构造完了,加上注释才不到100行。注意要运行这个代码,你要用python3.8以上的环境(建议使用虚拟环境,如何设置看我以前的视频)。这个项目主要需要streamlit,langchain,langchain_openai这些依赖库,可以自己pip下载。

        项目的运行也非常简单,用 streamlit run streamlit_app.py即可本地运行,运行之后在浏览器打开:http:\\localhost:8051 即可查看项目。你也可以在我提供的ur上看效果(http://101.33.225.241:8501/)。

        可以git上拉去代码实现,上面为了讲解把代码切成一块一块的了,下面是全部的代码方便大家下载:

import ioimport streamlit as st
from PIL import Image# 设置page_title内容
st.set_page_config(page_title="AI小万的旅游问答机器人")# 设置首行内容
st.title('🤖AI小万的旅游问答机器人😜')# 设置左边的sidebar内容
with st.sidebar:# 设置输入openai_key和接口访问地址的两个输入框openai_key = st.text_input('OpenAI API Key', key='open_ai_key')openai_base_url = st.text_input('OpenAI BASE URL', 'https://api.openai.com', key='openai_base_url')# 设置一个可点击打开的展开区域with st.expander("🤓国内可访问的openai账号"):st.write("""1. 如果使用默认地址,可以使用openai官网账号(需科学上网🥵).2. 如果你没有openai官网账号,可以联系博主免费试用国内openai节点账号🥳.""")# 本地图片无法直接加载,需先将图片读取加载为bytes流,然后才能正常在streamlit中显示image_path = r"C:\Users\PycharmProjects\langchain\wechat.jpg"image = Image.open(image_path)image_bytes = io.BytesIO()image.save(image_bytes, format='JPEG')st.image(image_bytes, caption='AI小万老师的微信', use_column_width=True)def generate_response(input_text, open_ai_key, openai_base_url):""":param input_text:  用户输入的查询问题,类型为str:param open_ai_key: 用户输入的openai_key,类型为str:param openai_base_url: 用户输入的openai访问地址,类型为str:return: 返回langchain查询openai获得的结果,类型为str"""from langchain_openai import ChatOpenAIfrom langchain.prompts import PromptTemplatefrom langchain_core.output_parsers import StrOutputParser# 构造一个聊天模型包装器,key和url从函数输入中获取llm = ChatOpenAI(temperature=0,openai_api_key=open_ai_key,base_url=openai_base_url)# 构造一个模板template和一个prompt,从这里你可以看到提示词工程(prompt  engineering)的重要性template = """你是一个万贺创造的旅游问答机器人,你只回答用户关于旅游和地理方面的问题。你回答用户提问时使用的语言,要像诗一样优美,要能给用户画面感!如果用户的问题中没有出现地名或者没有出现如下词语则可以判定为与旅游无关:‘玩、旅游、好看、有趣、风景’案例:1. 用户问题:今天天气如何? 你的回答:抱歉,我只负责回答和旅游、地理相关的问题。2. 用户问题:你是谁?你的回答:我是万贺创造的旅游问答机器人,我只负责回答和旅游、地理相关的问题。3. 用户问题:今天股市表现如何?你的回答:抱歉我只负责回答和旅游、地理相关的问题以下是用户的问题:{question}"""prompt = PromptTemplate(template=template, input_variables=["question"])# 构造一个输出解析器和链output_parser = StrOutputParser()chain = prompt | llm | output_parserresponse = chain.invoke({"question": input_text})st.info(response)# 构造一个用于输入问题的表单
with st.form('提交问题的表单'):text = st.text_area('请提一个您感兴趣的旅游或地理问题', '英国的首都在哪儿?')submitted = st.form_submit_button('提交')# 如果用户提交的key格式有误提醒用户if not st.session_state['open_ai_key'].startswith('sk-'):st.warning('您输入的openai秘钥格式有误')# 如果用户点击了提交按钮并且key格式无误则加载一个spinner加载状态if submitted and st.session_state['open_ai_key'].startswith('sk-'):with st.spinner("AI小万正在飞快加载中..."):# 加载状态进行中,调用我们之前构造的generate_response()方法,把用户的输入,key和url等参数传递给函数generate_response(text, st.session_state['open_ai_key'], st.session_state['openai_base_url'])st.success("AI小万为您加载完成!")

        以后我会尝试用国产的chatGLM来做一些内容,希望大家都能在AI领域玩的开心!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新话费充值系统源码,附带系统安装教程

搭建教程 亲测环境:PHP7.0MySQL5.6 PHP扩展安装:sg11 数据库配置文件路径:/config/database.php 伪静态设置为thinkphp 后台地址:/admin 账号密码:admin/123456

node.js后端+小程序前端+mongoDB(增删改查)

前言 今天我对比了以下node.js的express与python的fastAPI,我决定我还是出一期关于node.jsmangoDB小程序的小案例吧。 不是python的fastAPI不好用,因为fastAPI是python较新的技术,我不敢果断发出教学文章(这件事情还是留着给pyt…

[机器学习]K-means——聚类算法

一.K-means算法概念 二.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt # 画图依赖 from sklearn.datasets import make_blobs # 从sklearn中直接生成聚类数据# 1. 数据加载 # 生成(n_samples:样本点,centers&…

HarmonyOS开发工具DevEco Studio安装以及汉化

HUAWEI DevEco Studio 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE), 助力高效开发。 应用内共享HSP开发 支持在Stage模型和模块化编译方式下开发HSP,以及共享HSP给应用内其他模块使用;支持运行态共享HSP。Code Linter代码检查 支持ArkTS/T…

幻兽帕鲁转移/迁移游戏存档之后,无法迁移角色存档,进入游戏需要重新建角色问题(已解决),服务器到服务器之间的存档转移

很多朋友在迁移幻兽帕鲁游戏存档到服务器的时候,可能会遇到一个问题,就是迁移完成后,进入到游戏会发现又需要从头开始,重新新建角色。 其实这个问题也很好解决,因为Palworld服务端有两种,一种是有APPID&…

SpringFramework实战指南(六)

SpringFramework实战指南(六) 4.4 基于 配置类 方式管理 Bean4.4.1 完全注解开发理解4.4.2 实验一:配置类和扫描注解4.4.3 实验二:@Bean定义组件4.4.4 实验三:高级特性:@Bean注解细节4.4.5 实验四:高级特性:@Import扩展4.4.6 实验五:基于注解+配置类方式整合三层架构组…

vue项目集成booststrap

1.首先安装bootstrap npm install bootstrap 我安装的是4.3的版本 2.在main.js中引用bootstrap import bootstrap/dist/css/bootstrap.css import bootstrap/dist/css/bootstrap.min.css import bootstrap/dist/js/bootstrap.js import bootstrap/dist/js/bootstrap.min.…

(Python)字典列表数据本地存储工具

前言 一个简单的实现简便 "列表字典" 数据存储本地。 适合不会SQL但又想实现数据存储本地的同学。 操作使用都非常简单。 文件只做了简单的加密处理,如果需要复杂加密的同学可以修改加密函数。 温馨提示: 1.使用前,在项目目录…

CentOS7如何安装宝塔面板并实现固定公网地址远程访问

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…

数据结构第十一天(栈)

目录 前言 概述 源码: 主函数: 运行结果: ​编辑 前言 今天简单的实现了栈,主要还是指针操作,soeasy! 友友们如果想存储其他内容,只需修改结构体中的内容即可。 哈哈,要是感觉不错&…

[React] ref属性

简介 ref 即 reference ,是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。 组件被调用时会新建一个该组件的实例,而 ref 就会指向这个实例。它可以是一个回调函数,这个回调函数会在组件被挂载后立即执行。 为了防止内存泄漏…

【C生万物】C语言分支和循环语句

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

京东云StarDB for openGauss实现混合多云场景元数据安全可控

推进产业数字化,构筑数智供应链技术底座,绕不开全球信息技术基础三大件之一的数据库。以技术创新为手段,以满足未来业务需求为目标,京东云自主研发的分布式数据库StarDB在长期的业务实践过程中不断进化,在海量且复杂的…

深入理解网络编程之BIO和NIO

目录 原生JDK网络编程BIO BIO通信模型服务端代码 BIO通信模型客户端代码 伪异步模型服务端代码(客户端跟之前一致) 原生JDK网络编程NIO 什么是NIO? NIO和BIO的主要区别 阻塞与非阻塞IO NIO之Reactor模式 NIO中Reactor模式的基本组成…

零基础学Python之网络编程

1.什么是socket 官方定义: 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用…

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后,一般情况下,宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易,即使对老师来说,找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家,为论文提出问题…

【操作系统·考研】I/O管理概述

1.I/O设备 1.1 块设备 信息交换以数据块为单位,它属于有结构设备。 块设备传输速率较高,可寻址,且可对该设备随机地的读写。 栗子🌰:磁盘。 1.2 字符设备 信息交换以字符为单位,属于无结构类型。 字符…

电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于LSTM、TCN的电力负荷预测(Python) 源码设计 #------------------

一文彻底搞懂Redis的三种集群模式

文章目录 1. 主从模式1.1 基本原理1.2 工作机制1.3 优缺点 2. 哨兵模式2.1 基本原理2.2 工作机制2.3 优缺点 3. 集群模式3.1 基本原理3.2 工作机制3.3 优缺点 4. 总结 redis高可用的三种模式:主从模式,哨兵模式,集群模式。 所谓的高可用&…

如何修改远程端服务器密钥

前言 一段时间没改密码后,远程就会自动提示CtrlAltEnd键修改密码。但我电脑是笔记本,没有end键。打开屏幕键盘按这三个键也没用。 解决方法 打开远程 1、远程端WINC 输入osk 可以发现打开了屏幕键盘 2、电脑键盘同时按住CtrlAlt(若自身电…