前言
还记得开发一个智能聊天机器人需要花费数月编码的时间吗?
像 LangChain 这样的框架确实简化了开发,但是对于非程序员来说,数百行代码仍然是一个障碍。
就在那时,我发现了“Lang Flow”,这是一个基于 Python 版 LangChain 的开源软件包。它让你无需编写任何代码即可创建 AI 应用程序。它为你提供了一个画布,你可以拖动组件并将它们链接起来以构建你的聊天机器人。
在这篇文章中,我们将使用LangFlow在几分钟内构建一个智能 AI 聊天机器人原型。对于后端,我们将使用Ollama嵌入模型和大型语言模型,这意味着该应用程序可以在本地免费运行!最后,我们将用最少的编码将此流程转换为Streamlit应用程序。
检索增强生成管道、LangChain、LangFlow 和 Ollama 简介
在这个项目中,我们将构建一个 AI 聊天机器人,我们将其命名为“Dinnerly — 您的健康菜肴规划师”。它旨在推荐健康菜肴食谱,这些食谱是在检索增强生成 (RAG) 的帮助下从食谱 PDF 文件中提取的。
在深入研究如何实现这一目标之前,让我们快速回顾一下我们将在项目中使用的主要要素。
检索增强生成 (RAG)
RAG(检索增强生成)通过从外部来源向大型语言模型 (LLM) 提供相关信息来为其提供帮助。这使得 LLM 在生成响应时可以考虑此上下文,从而使响应更加准确和最新。
您可以从 2img.ai 中获取更多源代码资源
RAG 管道通常包括以下步骤,如《检索增强生成指南》中所述:
- 加载文档:首先加载文档或数据源。
- 分成块:将文档分成可管理的部分。
- 创建嵌入:使用嵌入将这些块转换为向量表示。
- 存储在矢量数据库中:将这些矢量保存在数据库中,以便有效检索。
- 用户交互:接收来自用户的查询或输入并将其转换为嵌入。
- VectorDB中的语义搜索:连接到矢量数据库,根据用户的查询进行语义搜索。
- 检索和处理响应:获取相关响应,将其传递给 LLM,并生成答案。
- 向用户提供答案:将 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 管道吗?我们需要某些元素来将其拼凑在一起:
- PDF Loader:我们在这里使用“PyPDFLoader”。您需要输入 PDF 文档的文件路径。
- 文本分割器:“RecursiveCharacterTextSplitter”将是我们的选择,默认设置就可以了。
- 文本嵌入模型:选择“OllamaEmbeddings”以利用免费的开源嵌入。
- 矢量数据库:我们将使用“FAISS”来存储嵌入并促进矢量搜索。
- 用于生成响应的 LLM:选择“ChatOllama”并将模型指定为“llama2”。
- 对话记忆:这使我们的聊天机器人能够保留聊天记录,帮助回答后续问题。我们将使用“ConversationBufferMemory”。
- 对话检索链:这将连接各种组件,如 LLM、内存和检索到的文本以生成响应。“ConversationRetrievalChain” 是我们的选择。
将所有这些组件拖放到画布上,并设置所需的字段,如 PDF 文件路径和 LLM 模型名称。其他设置保留默认设置即可。
接下来,连接这些组件以形成流程。
连接好所有东西后,点击右下角的“闪电”按钮编译流程。如果一切顺利,按钮会变成绿色,表示成功。
成功编译流程后,单击“聊天机器人”图标来测试您的创建。
Langflow 聊天机器人演示。
几点建议:
- 流程完成后,您可以将其保存为 JSON 文件或在“我的收藏”下找到它,以供将来访问或编辑。
- 使用预构建的示例深入研究 LangFlow 可以为您提供极大的启发并帮助您入门。方法如下:- “LangFlow Store” 包含示例,但您需要 API 密钥才能访问。- LangFlow GitHub页面允许您下载示例,然后您可以使用“上传”按钮将其上传到您的 LangFlow UI。
- 如果本地设置不适合您,您也可以选择 OpenAI 来构建您的 RAG 管道。只需确保您拥有用于设置的 OpenAI API 密钥即可。
将 Flow 转变为 Streamlit 聊天机器人
现在,如果流程设置正确,就可以将其集成到您的应用程序中。构建流程后,LangFlow 会提供必要的代码片段,让操作变得简单。只需点击侧边栏中的“代码”按钮即可。
让我们继续将此流程集成到 Streamlit 聊天机器人中。
- 设置依赖项:首先,我们必须安装依赖项。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 让更多的人看到你的才华。
创作不易,觉得不错的话,点个赞吧!!!