【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 io

import 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 ChatOpenAI
    from langchain.prompts import PromptTemplate
    from 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_parser

    response = 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 io

import 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 ChatOpenAI

    from langchain.prompts import PromptTemplate
    from 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_parser

    response = 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领域玩的开心!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AIGC专题:2024年生成式人工智能预测报告(英文版)

今天分享的是AIGC系列深度研究报告:《AIGC专题:2024年生成式人工智能预测报告(英文版)》。 (报告出品方:CBINSIGHTS) 报告共计:112页 我们没有足够的高质量数据来训练LLM 研究人员…

计算机视觉中的目标跟踪

从保护我们城市的监控系统到自动驾驶车辆在道路上行驶,目标跟踪已经成为计算机视觉中的一项基础技术。本文深入探讨了目标跟踪,探索了其基本原理、多样化的方法以及在现实世界中的应用。 什么是目标跟踪? 目标跟踪是深度学习在计算机视觉中广…

刷存在感,Excel转Protobuf/Json通用配置文件

使用场景 最近工作流中有将Excel转Protobuf作为配置文件的技术方案。具体实现是先定一个proto文件,再在一个对应excel表中定义对应字段,由策划在excel进行更改。proto文件可以生成对应语言的脚本,然后将excel转成对应protobuf的binary。 我…

SQLMap的Tamper脚本

由于SQL注入的影响过于广泛以及人们的网络安全意识普遍提升,网站往往 会针对SQL注入添加防SQL注入系统或者WAF 。这时,在渗透测试过程中就需要 绕过网站的安全防护系统。SQLMap是一款用来检测与利用SQL注入漏洞的免费 开源工具,不仅可以实现S…

Matomo 访问图形显示异常

近期我们的把 PHP 系统完全升级后,访问 Matomo 的站点有关访问的曲线无法显示。 出现的情况如下图: 我们可以看到图片中有关的访问曲线无法显示。 如果具体直接访问链接的话,会有下面的错误信息。 问题和解决 出现上面问题的原因是缺少 ph…

JavaScript 基础 - 第4天

函数 理解函数的封装特性,掌握函数的语法规则 声明和调用 函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。 声明(定义) 声明&a…

互联网加竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …

Qt 的安装以及项目的创建

目录 Qt简介Qt 开发环境安装的过程环境变量的配置Qt SDK 中的重要的工具创建一个 Qt 项目 Qt简介 开始安装教程前,首先来了解一下什么是QT。 QT(Quick Thought)是一个基于Qt库的快速应用程序开发框架。它提供了一套完整的开发工具和库&…

apipost 简单的性能压测总结

1、简单的使用机型牌评估 1)jdk默认256M给100用,推荐给1000人同时用JVM 堆栈建议2G~4G(目前定了机型4核8G内存 2T磁盘做radio0存储); 2)数据库配置文件写了占了2G内存(my.cnf文件&#xff09…

记录Git无法连接Github(443报错)的一种可能——代理问题

参考文章: Git安装配置与使用(超级详细)_git配置-CSDN博客 github代理报错_valueerror: unable to determine socks version from-CSDN博客 速通 如果在使用 git 时遇到了这样的报错: OpenSSL SSL_connect: SSL_ERROR_SYSCAL…

思科交换机调试流程介绍(主要适用于OEM的思科的浪潮FS6700)

文章目录 1、光纤交换机配置流程2、交换机初始化 2-1、 默认管理地址 2-2、 更改默认管理地址 2-3、 远程登录模式 2-4、 更改用户名 3、VSAN 3-1、什么是VSAN 3-2、关于 VSAN 的一些主意事项 3-3、配置VSAN 3-4、配置验证…

龙龙送外卖pta[代码+讲解]

题目 题解 代码 题目 龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址…

网工每日一练(2月4日)

试题1 通过HFC网络实现宽带接入,用户端需要的设备是(A),局端用于控制和管理用户的设备是(D)。 (1)A.Cable Modem B.ADSL Modem C.OLT D.CMTS (2)A. Cable Mo…

Node.js的安装

目录 1 下载安装包 2 安装 3 以管理员身份打开命令提示符窗口 4 验证Node.js的环境变量 5 配置npm的全局安装路径 6 更换源 1 下载安装包 在浏览器中打开链接,即可看到如下页面,点击即可下载安装包 2 安装 除了下面这一步,其它无脑Nex…

docker安装nacos

nacos v2.3.0 docker run --name nacos -e MODEstandalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:2.3.0访问:http://192.168.2.209:8848/nacos

24.云原生ArgoCD高级之钩子

云原生专栏大纲 文章目录 Argo CD钩子如何定义钩子钩子删除策略 Argo CD钩子 Argo CD 是一个用于部署和管理 Kubernetes 应用程序的工具,它提供了一种声明式的方式来定义和自动化应用程序的部署过程。Argo CD 钩子(Hooks)是一种机制&#x…

TQ15EG开发板教程:开发板Vivado硬件设置

1,串口的配置 PS端有2个串口,在BANK500, 1.8V IO电平 管脚名称 电平 说明 UART0 RX MIO18 1.8V MPSOC方向看 TX MIO19 1.8V UART1 RX MIO21 1.8V TX MIO20 1.8V 2,QSPI的配置 采用2片MT25QU256 拼接成8bit的QSPI存储系统。采用1.8V…

OceanBase 4.2.2 GA 发布,全新特性快速预览!

在 2023 年度发布会上,OceanBase 沿着“一体化”产品战略思路,发布了一体化数据库的首个长期支持版本 4.2.1 LTS。作为 4.0 系列的首个 LTS 版本,该版本的定位是支撑客户关键业务稳定长久运行,我们非常认真的打磨了这个版本&#…

代码随想录刷题第24天

今天正式进入回溯。看了看文章介绍,回溯并不是很高效的算法,本质上是穷举操作。代码形式较为固定。 第一题为组合问题,用树形结构模拟,利用回溯算法三部曲,确定终止条件与单层逻辑,写出如下代码。 不难发现…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1(网络框架) 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点:网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…