不用编码构建本地RAG聊天机器人

前言

还记得开发一个智能聊天机器人需要花费数月编码的时间吗?

像 LangChain 这样的框架确实简化了开发,但是对于非程序员来说,数百行代码仍然是一个障碍。⁤

就在那时,我发现了“Lang Flow”,这是一个基于 Python 版 LangChain 的开源软件包。它让你无需编写任何代码即可创建 AI 应用程序。它为你提供了一个画布,你可以拖动组件并将它们链接起来以构建你的聊天机器人。

在这篇文章中,我们将使用LangFlow在几分钟内构建一个智能 AI 聊天机器人原型。对于后端,我们将使用Ollama嵌入模型和大型语言模型,这意味着该应用程序可以在本地免费运行!最后,我们将用最少的编码将此流程转换为Streamlit应用程序。

检索增强生成管道、LangChain、LangFlow 和 Ollama 简介

在这个项目中,我们将构建一个 AI 聊天机器人,我们将其命名为“Dinnerly — 您的健康菜肴规划师”。它旨在推荐健康菜肴食谱,这些食谱是在检索增强生成 (RAG) 的帮助下从食谱 PDF 文件中提取的。

在深入研究如何实现这一目标之前,让我们快速回顾一下我们将在项目中使用的主要要素。

检索增强生成 (RAG)

RAG(检索增强生成)通过从外部来源向大型语言模型 (LLM) 提供相关信息来为其提供帮助。这使得 LLM 在生成响应时可以考虑此上下文,从而使响应更加准确和最新。

您可以从 2img.ai 中获取更多源代码资源

RAG 管道通常包括以下步骤,如《检索增强生成指南》中所述:

  1. 加载文档:首先加载文档或数据源。
  2. 分成块:将文档分成可管理的部分。
  3. 创建嵌入:使用嵌入将这些块转换为向量表示。
  4. 存储在矢量数据库中:将这些矢量保存在数据库中,以便有效检索。
  5. 用户交互:接收来自用户的查询或输入并将其转换为嵌入。
  6. VectorDB中的语义搜索:连接到矢量数据库,根据用户的查询进行语义搜索。
  7. 检索和处理响应:获取相关响应,将其传递给 LLM,并生成答案。
  8. 向用户提供答案:将 LLM 生成的最终输出呈现给用户。

Han HELOIR 博士对 RAG 工作流程的概述。☕️

LangChain

LangChain 是一个围绕 LLM 构建的开源框架,它促进了各种 GenAI 应用程序的设计和开发,包括聊天机器人、摘要等。

该库的核心思想是将不同的组件“链接”在一起,以简化复杂的 AI 任务并围绕 LLM 创建更高级的用例。


LangFLow

LangFlow 是一款专为 LangChain 设计的 Web 工具。它提供了一个用户界面,用户只需拖放组件即可构建和测试 LangChain 应用程序,无需任何编码。

但是,您首先需要对 LangChain 的工作原理及其不同组件有一个基本的了解,才能使用 LangFlow 来设计您的 AI 应用程序流程。

LangFlow 接口


Ollama

对我来说, Ollama是启动和运行开源 LLM 的最佳和最简单方法。它支持 Llama 2 和 Mistral 等功能最强大的 LLM,您可以在ollama.ai/library上找到可用模型列表。



设置Ollama

安装 Ollama

首先,进入Ollama下载页面,选择与你的操作系统匹配的版本,下载并安装。

安装 Ollama 后,打开命令终端并输入以下命令。这些命令将下载模型并在您的机器上本地运行它们。

对于这个项目,我们将使用 Llama2 作为大型语言模型 (LLM),并使用“nomic-embed-text”作为嵌入模型。“ Nomic-embed-text ”是一个功能强大的开源嵌入模型,具有较大的上下文窗口。这让我们可以在本地运行整个应用程序,而无需任何云服务!ollama serve
ollama pull llama2
ollama pull nomic-embed-text
ollama run llama2

设置 LangFlow

先决条件

在开始使用 LangFlow 之前,请务必检查您的计算机上是否安装了 Python。您的 Python 版本应高于 3.9 但低于 3.12。

安装 LangFlow

接下来,让我们继续安装 LangFlow。我建议在虚拟环境中执行此操作。这种方法有助于在其自己的空间内整齐地管理依赖项。在我的 Mac 上,我使用 Conda 进行设置。只需在命令行终端中输入以下命令即可使用 Python 3.11 创建名为“langflow”的虚拟环境。conda create -n langflow python=3.11
conda activate langflow
pip install langflow

如果你没有Conda,你也可以直接用Python搭建虚拟环境,命令如下。python -m venv langflow
source langflow/bin/activate
pip install langflow

完成安装后,启动 LangFlow 很简单,只需在终端输入“ langflow run ”即可。

Langflow 后端控制台。


然后,获取它提供的 URL(在上面的示例中为http://127.0.0.1:7860),将其粘贴到您的 Web 浏览器中,瞧!您应该会看到类似这样的界面。此页面显示您的所有项目。


Langflow UI 项目页面。

设计聊天机器人的流程

现在是时候制作您的第一个流程了!

首先点击“新项目”,这会为您打开一个空白画布。在左侧窗格中,您会看到各种组件,您可以将其拖放到您的工作区中。

LangFlow Canvas。

对于我们的项目,我们正在构建一个能够回答 PDF 文件中问题的聊天机器人。还记得我们之前讨论过的 RAG 管道吗?我们需要某些元素来将其拼凑在一起:

  1. PDF Loader:我们在这里使用“PyPDFLoader”。您需要输入 PDF 文档的文件路径。
  2. 文本分割器:“RecursiveCharacterTextSplitter”将是我们的选择,默认设置就可以了。
  3. 文本嵌入模型:选择“OllamaEmbeddings”以利用免费的开源嵌入。
  4. 矢量数据库:我们将使用“FAISS”来存储嵌入并促进矢量搜索。
  5. 用于生成响应的 LLM:选择“ChatOllama”并将模型指定为“llama2”。
  6. 对话记忆:这使我们的聊天机器人能够保留聊天记录,帮助回答后续问题。我们将使用“ConversationBufferMemory”。
  7. 对话检索链:这将连接各种组件,如 LLM、内存和检索到的文本以生成响应。“ConversationRetrievalChain” 是我们的选择。

将所有这些组件拖放到画布上,并设置所需的字段,如 PDF 文件路径和 LLM 模型名称。其他设置保留默认设置即可。

接下来,连接这些组件以形成流程。

连接好所有东西后,点击右下角的“闪电”按钮编译流程。如果一切顺利,按钮会变成绿色,表示成功。

成功编译流程后,单击“聊天机器人”图标来测试您的创建。

Langflow 聊天机器人演示。


几点建议:

  1. 流程完成后,您可以将其保存为 JSON 文件或在“我的收藏”下找到它,以供将来访问或编辑。
  2. 使用预构建的示例深入研究 LangFlow 可以为您提供极大的启发并帮助您入门。方法如下:- “LangFlow Store” 包含示例,但您需要 API 密钥才能访问。- LangFlow GitHub页面允许您下载示例,然后您可以使用“上传”按钮将其上传到您的 LangFlow UI。
  3. 如果本地设置不适合您,您也可以选择 OpenAI 来构建您的 RAG 管道。只需确保您拥有用于设置的 OpenAI API 密钥即可。

将 Flow 转变为 Streamlit 聊天机器人

现在,如果流程设置正确,就可以将其集成到您的应用程序中。构建流程后,LangFlow 会提供必要的代码片段,让操作变得简单。只需点击侧边栏中的“代码”按钮即可。

让我们继续将此流程集成到 Streamlit 聊天机器人中。

  1. 设置依赖项:首先,我们必须安装依赖项。pip install streamlit
    pip install langflow
    pip install langchain-community

2.获取 Lang Flow 代码片段:创建一个新的 Python 文件“app.py”。返回 LangFlow UI 并再次找到“代码”按钮。导航到“Python API”选项卡,复制代码片段并粘贴到“app.py”中。
import requests
from typing import Optional

BASE_API_URL = "http://127.0.0.1:7860/api/v1/process"
FLOW_ID = "d9392262-a912-42b4-8582-cc9e48894a00"

# You can tweak the flow by adding a tweaks dictionary
# e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}}
TWEAKS = {
"VectorStoreAgent-brRPx": {},
"VectorStoreInfo-BS24v": {},
"OpenAIEmbeddings-lnfRZ": {},
"RecursiveCharacterTextSplitter-bErPe": {},
"WebBaseLoader-HLOqm": {},
"ChatOpenAI-aQOv0": {},
"FAISS-o0WIf": {}
}

def run_flow(inputs: dict, flow_id: str, tweaks: Optional[dict] = None) -> dict:
"""
Run a flow with a given message and optional tweaks.

:param message: The message to send to the flow
:param flow_id: The ID of the flow to run
:param tweaks: Optional tweaks to customize the flow
:return: The JSON response from the flow
"""
api_url = f"{BASE_API_URL}/{flow_id}"

payload = {"inputs": inputs}
headers = None
if tweaks:
payload["tweaks"] = tweaks
response = requests.post(api_url, json=payload, headers=headers)
return response.json()


3. 构建聊天函数:在同一个 Python 文件中,我们将定义一个专用于聊天的函数。此函数运行流程以获取来自用户的每个新查询的响应。然后,它将此响应流式传输到界面上。def chat(prompt: str):
with current_chat_message:
# Block input to prevent sending messages whilst AI is responding
st.session_state.disabled = True

# Add user message to chat history
st.session_state.messages.append(("human", prompt))

# Display user message in chat message container
with st.chat_message("human"):
st.markdown(prompt)

# Display assistant response in chat message container
with st.chat_message("ai"):
# Get complete chat history, including latest question as last message
history = "\n".join(
[
f"{role}: {msg}" for role, msg in st.session_state.messages]
)

query =
f"{history}\nAI:"

# Setup any tweaks you want to apply to the flow
inputs = {"input": query}

output = run_flow(inputs, flow_id=FLOW_ID, tweaks=TWEAKS)
print(output)
try:
output = output[
'result']['output']
except Exception :
output =
f"Application error : {output}"

placeholder = st.empty()
response =
""

for tokens in output:
response += tokens
# write response with "▌" to indicate streaming.
with placeholder:
st.markdown(response +
"▌")

# write response without "▌" to indicate completed message.
with placeholder:
st.markdown(response)

# Log AI response to chat history
st.session_state.messages.append(("ai", response))
# Unblock chat input
st.session_state.disabled = False

st.rerun()

4. 制作界面:现在我们将在同一个 python 文件中使用以下代码构建一个简单的 Streamlit 用户界面。st.set_page_config(page_title="Dinnerly")
st.title("Welcome to Dinnerly : Your Healthy Dish Planner")

system_prompt = "You´re a helpful assistant to suggest and provide healthy dishes recipes to users"
if "messages" not in st.session_state:
st.session_state.messages = [("system", system_prompt)]
if "disabled" not in st.session_state:
# `disable` flag to prevent user from sending messages whilst the AI is responding
st.session_state.disabled = False


with st.chat_message("ai"):
st.markdown(
f"Hi! I'm your healthy dish planner. Happy to help you prepare healthy and yummy dishes!"
)

# Display chat messages from history on app rerun
for role, message in st.session_state.messages:
if role == "system":
continue
with st.chat_message(role):
st.markdown(message)

current_chat_message = st.container()
prompt = st.chat_input("Ask your question here...", disabled=st.session_state.disabled)

if prompt:
chat(prompt)

运行 Streamlit 应用后,您将能够与自己的菜肴规划师聊天!它将帮助您制作美味又健康的饭菜。

Streamlit 应用程序演示。图片由作者提供。

Tips:

您可以对不同的流程使用相同的代码和接口。只需更改 FLOW_ID 即可测试并将新流程集成到您的应用程序中。

结束语

在这篇文章中,我们制作了一个基于 RAG 的智能聊天机器人。我们利用 LangFlow 建立 RAG 管道而无需编写代码,利用开源模型进行嵌入和 LLM 处理,使我们的应用程序在本地运行且无需推理成本,最后,我们将此设置转换为 Streamlit 应用程序。

我特别欣赏 LangFlow 的无代码方式,我相信它可能会彻底改变我们构建和制作 AI 应用程序原型的方式。

然而,值得一提的是,一些组件仍在开发中,有时可能无法按预期工作。当出现这种情况时,缺乏对问题的可见性或故障排除指导。另一个改进可能是直接提供底层 Python 代码以提供更大的定制化。

总的来说,我发现 LangFlow 是一款满足快速原型设计需求的有价值的工具。您可以从 2img.ai 中获取更多源代码资源


欢迎你分享你的作品到我们的平台上. http://www.shxcj.com 或者 www.2img.ai 让更多的人看到你的才华。

创作不易,觉得不错的话,点个赞吧!!!

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

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

相关文章

鸿蒙开发设备管理:【@ohos.settings (设置数据项名称)】

设置数据项名称 说明: 本模块首批接口从API version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块提供设置数据项的访问功能相关接口的说明及示例。 导入模块 import settings from ohos.settings;settings.getUri…

Windows Hello | 看起来您已经在另一个帐户上设置了 Windows Hello。

问题: 换了新电脑之后一直设置不了Window Hello,报错是 "it looks like youve already setup Windows Hello on another account."。 >>重复set up不行。 >>从旧电脑移除了Windows Hello设置也不行。 >>确认过我的Local…

工具:颜色查询 / CMYK颜色查询RGB、HSL、HSV、XYZ的颜色值

一、颜色查询-网址 RGB(90,223,9),#5ADF09 颜色查询,颜色梯度,色彩搭配,色盲模拟 - RGB颜色查询 - 在线工具 - Fontke.com 二、CMYK颜色查询RGB、HSL、HSV、XYZ的颜色值 三、颜色梯度 四、色彩搭配 五、色盲模拟 六、欢迎交流指正

素颜简约的个人导航网站源码

源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 素颜简约的个人导航网站源码

高级IO_多路转接之select

文章目录 [TOC](文章目录) 前言文件描述符的阻塞和非阻塞fcntl 多路转接之selectselect接口select的缺点 前言 关于IO,我们已经用过了不少IO接口,从最简单的printf、scanf->C语言文件接口fprintf、fscanf->系统文件接口read、write->再到我们的…

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

Unity Shader 极坐标

Unity Shader 极坐标 前言项目简单极坐标极坐标变体之方形极坐标变体之圆形拉花封装方法 鸣谢 前言 极坐标记录 项目 简单极坐标 极坐标变体之方形 极坐标变体之圆形 拉花 封装方法 鸣谢 【菲兹杂货铺】【Unity Shader教程】极坐标实现以及极坐标的两种变体

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…

巴西市场有哪些电商平台?巴西最畅销的产品有哪些?

巴西&#xff0c;作为南美洲最大的经济体之一&#xff0c;近年来在电子商务领域展现出强劲的增长势头。随着互联网的普及和消费者购物习惯的改变&#xff0c;电商平台在巴西市场上“打”得热火朝天&#xff0c;不过占据市场份额最大的依然还是美客多。本文将探讨巴西市场上的主…

[C++][设计模式][访问器]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构件过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为(方法)&#xff0c;如果直接在基类中做这样的更改&#xff0c; 将会给子类带来很繁重的变更负担&#xff0c…

数据泄露时代的安全之道:访问认证的重要性

引言 想象一下&#xff1a;你一觉醒来&#xff0c;收到一条通知——你的公司遭遇了数据泄露。你感到恐惧&#xff0c;因为这意味着客户数据被曝光&#xff0c;公司声誉受损&#xff0c;还有巨额罚款在等着你。在当今的数字化环境中&#xff0c;这种情况太常见了。全球各地的组…

数据库组成及原理

属性&#xff1a; 把数据库中的一个表类比成一个公司&#xff0c;那么公司里的每个人都是一个“属性”&#xff08;表中的一个字段视为一个属性&#xff09;&#xff0c;不管老板还是员工&#xff0c;只要是公司里的人&#xff0c;就都是一个属性。 主键&#xff1a; 老板就是“…

R语言学习,入门

我是一名6年开发经验的程序员&#xff0c;后端&#xff0c;大数据&#xff0c;前端都会。 现在加入了医疗行业&#xff0c;要做数据分析&#xff0c;前同事的实验室生信专业的&#xff0c;用的是R语言&#xff0c;为了跑通他的程序。就来学一下吧&#xff0c;看了一下好像挺简…

色彩魔术-空气远近法

1. 定义 空气远近法&#xff0c;是使用色彩差异表现远近的一种方法&#xff0c;即色彩透视法。 色彩透视法&#xff1a;也称色彩远近法&#xff0c;它是空气透视法的一种&#xff0c;它也是跟空气的厚薄有关&#xff0c;景物距离观察者越远其颜色饱和度越低&#xff0c;亮度也…

尝试修改苍穹外卖为”李小罗餐厅“

学习苍穹外卖后&#xff0c;将其修改为自己所需要的项目&#xff0c;也是对苍穹外卖项目的加深理解 对项目之间的连接等关系进一步清晰&#xff0c;那么便开始吧 d1_开始修改 修改名字为”李小罗餐厅“ src\views\login\index.vue src\router.ts 结果展示 修改进来之后的展示…

nginx转发的问题

我在项目配置的时候遇到一个问题&#xff1a; 配置了域名转发&#xff0c;且配置了https nginx配置如下&#xff1a; server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…

动物检测yolo格式数据集(水牛 、大象 、犀牛 、斑马四类)

动物检测数据集 1、下载地址&#xff1a; https://download.csdn.net/download/qq_15060477/89512588?spm1001.2101.3001.9500 2、数据集介绍 本数据集含有四种动物可以检测&#xff0c;分别是水牛 、大象 、犀牛 、斑马四类&#xff0c;数据集格式为yolo格式&#xff0c;…

【Java环境配置过程详解(包括IDEA配置Java)】

目录 一、JDK下载安装 1. 官网下载JDK 2. 本地安装JDK 3. 配置环境变量 4. 验证是否安装成功 ​编辑二、IDEA进行安装下载 1. 官网下载 IDEA 2、IDEA进行Java开发 1. 创建Java项目 2. 程序测试 一、JDK下载安装 1. 官网下载JDK 1&#xff09;官网链接: https://www.o…

Redis理解【精细】【快速上手】

目录 1. 了解3V和3高 2.什么是redis 3. redis可以做什么 4. Windows安装 5. 使用redis客户端操作redis 5.1 redis基本命令 5.1.1 切换数据库 5.1.2 查看当前数据库的大小 5.1.3 查看当前数据库所有的key ​​​​​​​ 5.1.4 清空当前数据库所有key 5.1.5 清空所…

网口串口(Serialport)服务器

文章所用工具http://t.csdnimg.cn/2gIR8http://t.csdnimg.cn/2gIR8 搭建服务器界面 操作配置文件保存方式类 public string FileName { get; set; }public IniHelper(string name) {this.FileName name; //在构造函数中给路径赋值} 1 先导入c语言进行读取操作ini文件的方法 …