Chainlit vs Streamlit和Gradio:为什么Chainlit是开发聊天机器人不错的选择

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序 Chainlit是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)应用程序的方式。Chainlit可以创建用户界面(UI),类似于由OpenAI开发的ChatGPT用户界面,Chainlit可以开发类似streamlit的web界面。 阅读详情
AI摘要

本文介绍大语言模型发展及相关应用框架,如Streamlit和Gradio,可助开发者快速构建交互式应用。着重介绍Chainlit,它能可视化模型中间步骤。文中展示了用Chainlit构建基础聊天机器人、SQL脚本生成器和高级文档聊天机器人的过程,虽目前部署受限,但未来可期。

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。

一、前言

随着大语言模型(LLM)的快速发展,国内外越来越多的大模型蜂拥而至,真可谓是百花齐放,相当热闹的掀起了一次百模大战,甚至是千模大战。然而,面对这么多的大模型,个个都声称占据排行榜第一,到底实际效果如何,最终还得需要花大量时间去进行验证,有没有比较简单快速的方式来实现模型的快速体验呢。

目前关于这方面比较成熟的方案包括 Streamlit、Gradio 等Web UI框架,基本上想要实现 ChatGPT/Claude 类似的聊天机器人或者文档机器人,只需要很少量的代码就可以实现。 这些 UI 框架可以帮助机器学习工程师和数据科学家将他们的模型能力快速转换为交互式 Web 应用程序,使得他们可以更加方便地展示和验证模型效果。这种思路在 Gradio 和 Streamlit 中得到了很好的体现。这些框架提供了简单易用的 API 和丰富的可视化组件,使得用户可以用少量代码快速构建交互式应用程序。因此,这些 UI 框架不仅可以提高开发效率,还可以帮助机器学习工程师和数据科学家更好地展示他们的工作成果。

从“私人”聊天机器人到多模态和语音聊天机器人,以及用于文档学习的聊天机器人,我探索了各种各样的人工智能语言应用。这些项目基本上都是使用 Streamlit 或者 Gradio 开发的,它们是一个非常强大但轻量级的库,即使你作为Python开发工程师,不具备任何 Web 框架或编码经验,也可以快速创建 Web 应用程序。

以上是一个用 Streamlit 构建的 Streamlit docs 文档聊天机器人。

二、Chainlit 概述

Chainlit 是一个开源 Python 包,可以以惊人的速度构建和共享 LLM 应用程序,彻底改变了我们构建和共享语言模型应用程序的方式。将 Chainlit API 集成到您现有的代码中,在几分钟内生成类似 ChatGPT 的界面!

Chainlit 与 Streamlit 的不同之处在于它能够可视化模型的中间步骤和思维过程,让您深入了解它如何获得特定的生成输出。这使其成为理解和调试语言模型决策处理的强大工具。 在本文中,我们将展示如何在本地安装 Chainlit,重点介绍其主要功能,并探索其与不同应用程序的无缝集成。了解 Chainlit 在 UI 和交互方面的优势。

2.1、主要特征

  1. 快速构建 LLM 应用程序:与现有代码库无缝集成或在几分钟内从头开始

  2. 可视化多步骤推理:一目了然地了解产生输出的中间步骤

  3. 迭代提示:深入了解 Prompt Playground 中的提示,了解哪里出了问题并进行迭代

  4. 与团队协作:邀请您的队友,创建带注释的数据集并一起运行实验

  5. 分享您的应用程序:发布您的 LLM 应用程序并与世界分享(即将推出)

2.2、集成能力

Chainlit 与所有 Python 程序和库兼容。话虽这么说,它附带了一组与流行的库和框架的集成。

LangChain:https://docs.chainlit.io/integrations/langchain

Llama Index:https://docs.chainlit.io/integrations/llama-index

Haystack:https://docs.chainlit.io/integrations/haystack

Langflow:https://docs.chainlit.io/integrations/langflow

三、Chainlit 安装

Chainlit 需要 python>=3.8 ,你可以通过 pip 安装 Chainlit,如下所示:

pip install chainlit

安装完成后,可以使用 chainlit 命令在您的系统上可用。

Usage: chainlit [OPTIONS] COMMAND [ARGS]...

Options:
  --version  Show the version and exit.
  --help     Show this message and exit.

Commands:
  create-secret
  hello
  init
  run

当我们执行 hello 命令,系统会默认打开浏览器展示一个 chainlit UI 聊天机器人并询问你的名字,如下所示:

chainlit hello

四、构建基础的聊天机器人

接下来我们开始使用 Chainlit 基于 ChatGPT API 来创建一个最基本的 AI 聊天机器人。代码甚至比 Streamlit 实现还要少。 首先,我们安装 Chainlit 和 OpenAI 依赖项。

pip install chainlit and openai

在代码中,导入两个模块:

import openai
import chainlit as cl

提供我们的 OpenAI API 密钥:

openai.api_key = "{Your_API_Key}"

不同处理阶段的事件处理程序在 Chainlit 中被定义为装饰器。这里我们定义 on_chat_start 回调来初始化未来提示的系统角色消息,以在新图表启动时在Chainlit的 user_session 对象中列出 message_history 。与Streamlit 中的 session_state 功能一样, user_session 可用于存储Web会话之间的缓存数据。

@cl.on_chat_start
def start_chat():
    cl.user_session.set(
        "message_history",
        [{"role": "system", "content": "You are a helpful assistant."}],
    )

如果您熟悉OpenAI ChatCompletion API,您应该知道 gpt-3.5-turbo 模型的聊天完成提示定义如下结构:

[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": message},
    {"role": "assistant", "content": message},
    {"role": "user", "content": message},
    {"role": "assistant", "content": message},
    ...
    "role": "user", "content": message}
]

提示正文中的用户助理对话对为语言模型提供了历史上下文以供其参考。对于用户输入的每条新消息,都需要定义一个装饰器 on_message 。 首先,将新的用户输入推送到 message_history 中。

def main(message: str):
    message_history = cl.user_session.get("message_history")
    message_history.append({"role": "user", "content": message})

然后使用消息正文调用 openai.ChatCompletion.create() 方法以远程生成 GPT-3.5 模型的响应。这与其他聊天机器人开发的过程完全相同。

completion = openai.ChatCompletion.create(
        model=model_name, messages=message_history
    )

通过Chainlit的 Message() 方法创建msg对象,并填充响应内容。

msg = cl.Message(content="")
msg.stream_token(completion.choices[0].message.content)

将响应添加到 message_history 作为辅助数据。

message_history.append({"role": "assistant", "content": msg.content})

将响应发送到用户的屏幕。

msg.send()

整个代码实现很简单如下:

import openai
import chainlit as cl

openai.api_key = "{Your_API_Key}"

model_name = "gpt-3.5-turbo-0613"


@cl.on_chat_start
def start_chat():
    cl.user_session.set(
        "message_history",
        [{"role": "system", "content": "You are a helpful assistant."}],
    )


@cl.on_message
async def main(message: str):
    message_history = cl.user_session.get("message_history")
    message_history.append({"role": "user", "content": message})

    msg = cl.Message(content="")

    completion = openai.ChatCompletion.create(
        model=model_name, messages=message_history
    )

    await msg.stream_token(completion.choices[0].message.content)

    message_history.append({"role": "assistant", "content": msg.content})
    await msg.send()

要在您的计算机上运行该应用程序,您应该在终端中输入的唯一命令如下(假设代码文件是“app.py”):

chainlit run app.py 

如果一切顺利,你的浏览器将自动显示一个显示您的聊天机器人的新选项卡,你也可以通过默认地址 localhost:8000 手动打开它。

五、构建SQL脚本生成器

让我们继续来构建一个简单的应用程序,帮助用户使用自然语言创建 SQL 查询。

5.1、安装依赖

pip install chainlit openai

5.2、导入模块

import chainlit as cl
import openai
import os

openai.api_key = "YOUR_OPEN_AI_API_KEY"

5.3、定义提示和 LLM 设置

template = """SQL tables (and columns):
* Customers(customer_id, signup_date)
* Streaming(customer_id, video_id, watch_date, watch_minutes)

A well-written SQL query that {input}:
```"""


settings = {"model": "gpt-3.5-turbo","temperature": 0,"max_tokens": 500,"top_p": 1,"frequency_penalty": 0,"presence_penalty": 0,"stop": ["```"],}

5.4、监听并回复

我们使用 @on_message 装饰器来装饰 main 函数,以告诉 Chainlit 在用户每次发送消息时运行 main 函数。然后,我们使用 Message 类将答案发送回 UI。

@cl.on_message
async def main(message: str):
    # 为提示游乐场创建提示对象
    prompt = Prompt(
        provider=ChatOpenAI.id,
        messages=[
            PromptMessage(
                role="user",
                template=template,
                formatted=template.format(input=message)
            )
        ],
        settings=settings,
        inputs={"input": message},
    )

    # 准备消息进行流式传输
    msg = cl.Message(
        content="",
        language="sql",
    )

    # 调用OpenAI
    async for stream_resp in await openai.ChatCompletion.acreate(
        messages=[m.to_openai() for m in prompt.messages], stream=True, **settings
    ):
        token = stream_resp.choices[0]["delta"].get("content", "")
        await msg.stream_token(token)

    # 随着完成情况更新提示对象
    prompt.completion = msg.content
    msg.prompt = prompt

    # 发送并关闭消息流
    await msg.send()

5.5、运行

chainlit run app.py -w

六、构建高级文档聊天机器人

前面我面基于 OpenAI API 完成了一个基础的 GPT 聊天机器人和SQL脚本生成器,接下来我们将创建一个高级的聊天机器人,以支持文档问答。它的用法与使用 Streamlit 小部件创建的聊天机器人非常相似,用于上传 pdf 文件并查询该文件,以提高文档学习的效率。 与 Streamlit 相比,通过使用带有嵌入式 LangChain 组件的 Chainlit,可以使用更少的代码行,但实现更丰富的聊天机器人功能,包括 2 个主要功能: a) 显示 LangChain 链中思维过程的中间步骤

b) 标有可点击 ID 的“源”内容反映了原始文档中引用的上下文。

6.1、开发

LangChain 已集成到 Chainlit 库中,我们不再需要独立管理语言模型的生成过程。由于该应用的目标是通过现有的链 RetrievalQAWithSourcesChain 实现的。

1)、将代码下载到本地。

git clone https://github.com/Crossme0809/chainlit-langchain-chatbot.git
cd chainlit-langchain-chatbot

2)、将 example.env 重命名为 .env,并使用 cp example.env .env 并输入 OpenAI API 密钥,如下所示。从此 URL 获取 OpenAI API 密钥。如果您还没有的话,您需要在 OpenAI 网站中创建一个帐户。

OPENAI_API_KEY=your_openai_api_key

3)、创建一个 virtualenv 并激活它

python3 -m venv .venv && source .venv/bin/activate

4)、如果你有 python 3.11,那么上面的命令就可以了。但是,如果你的 python 版本低于 3.11。使用 conda 更容易。首先确保你已经安装了 conda。然后运行以下命令。

conda create -n .venv python=3.11 -y && source activate .venv

5)、在终端中运行以下命令来安装必要的 python 包:

pip install -r requirements.txt

chromadb 用于存储和检索 OpenAI 嵌入函数生成的矢量化数据。 pypdf 用于将 pdf 文件转换为将被矢量化的文本文件。 6)、导入所有必要的模块并定义环境变量

# 导入必要模块,定义env变量

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQAWithSourcesChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
import os
import io
import chainlit as cl
import PyPDF2
from io import BytesIO

from dotenv import load_dotenv

# 从. env文件加载环境变量
load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

7)、上传并转换pdf文件

files = None

# 等待用户上传PDF文件
while files is None:
    files = await cl.AskFileMessage(
        content="请上传PDF文档!",
        accept=["application/pdf"],
        max_size_mb=20,
        timeout=180,
    ).send()

file = files[0]

msg = cl.Message(content=f"Processing `{file.name}`...")
await msg.send()

# Read the PDF file
pdf_stream = BytesIO(file.content)
pdf = PyPDF2.PdfReader(pdf_stream)
pdf_text = ""
for page in pdf.pages:
    pdf_text += page.extract_text()

AskFileMessage 小部件用于接收用户上传并将文件保存到 ./doc/ 文件夹。尽管 LangChain 中的 document_loader 支持包括pdf在内的各种文件类型,但很难将自定义元数据从文本文件以外的文件附加到矢量存储。定制的元数据将用于源检索。

8)、设置链条

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

# 将文本分成块
texts = text_splitter.split_text(pdf_text)

# 为每个块创建元数据
metadatas = [{"source": f"{i}-pl"} for i in range(len(texts))]

# 创建 Chroma 向量数据库存储
embeddings = OpenAIEmbeddings()
docsearch = await cl.make_async(Chroma.from_texts)(
    texts, embeddings, metadatas=metadatas
)

# 创建一个使用Chroma向量存储的链
chain = RetrievalQAWithSourcesChain.from_chain_type(
    ChatOpenAI(temperature=0),
    chain_type="stuff",
    retriever=docsearch.as_retriever(),
)

# 在用户会话中保存元数据和文本
cl.user_session.set("metadatas", metadatas)
cl.user_session.set("texts", texts)

# 让用户知道系统已准备就绪
msg.content = f"Processing `{file.name}` done. You can now ask questions!"
await msg.update()

cl.user_session.set("chain", chain)

要创建链 RetrievalQAWithSourcesChain ,我们应该将文本文件分成几个块,并相应地附加元数据以识别每个相关块。然后,从块转换的矢量数据应存储在 Chroma 存储中。矢量化由 OpenAIEmbeddings() API 完成。在 langchain_factory 的最后一步中,我们使用定义 gpt-3.5-turbo 的语言模型以及矢量数据来创建链。

9)、用分块文本设置 user_session 供以后使用

cl.user_session.set("texts", texts)

10)、检索答案及其来源

在 langchain_post 装饰器中,处理函数将接收 LangChain 生成的响应。特别是在 RetrievalQAWithSourcesChain 中,响应将包括 AI 生成答案和您在 metadatas 中定义的来源标签。

@cl.on_message
async def main(message: str):
    chain = cl.user_session.get("chain")  # type: RetrievalQAWithSourcesChain
    cb = cl.AsyncLangchainCallbackHandler(
        stream_final_answer=True, answer_prefix_tokens=["FINAL", "ANSWER"]
    )
    cb.answer_reached = True
    res = await chain.acall(message, callbacks=[cb])

    answer = res["answer"]
    sources = res["sources"].strip()
    source_elements = []

    # 从用户会话中获取元数据和文本
    metadatas = cl.user_session.get("metadatas")
    all_sources = [m["source"] for m in metadatas]
    texts = cl.user_session.get("texts")

    if sources:
        found_sources = []

        # 将来源添加到消息中
        for source in sources.split(","):
            source_name = source.strip().replace(".", "")
            # 获取源的索引
            try:
                index = all_sources.index(source_name)
            except ValueError:
                continue
            text = texts[index]
            found_sources.append(source_name)
            # 创建消息中引用的文本元素
            source_elements.append(cl.Text(content=text, name=source_name))

        if found_sources:
            answer += f"\nSources: {', '.join(found_sources)}"
        else:
            answer += "\nNo sources found"

    if cb.has_streamed_final_answer:
        cb.final_stream.elements = source_elements
        await cb.final_stream.update()
    else:
        await cl.Message(content=answer, elements=source_elements).send()

在这里,我们从格式为“-pl”的源字符串中提取索引,并根据每个索引收集相应的文本块。原始文本块由 5) 发送。最后一步是使用 Chainlit Message 元素中提供的文本链接填写 Chainlit Message 的内容以及答案和来源,然后将其发送到 Web UI。

完整代码分享如下:

# 导入必要模块,定义env变量

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQAWithSourcesChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
import os
import io
import chainlit as cl
import PyPDF2
from io import BytesIO


from dotenv import load_dotenv

# 从. env文件加载环境变量
load_dotenv()

OPENAI_API_KEY= os.getenv("OPENAI_API_KEY")


# text_splitter和系统模板

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

system_template = """Use the following pieces of context to answer the users question.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
ALWAYS return a "SOURCES" part in your answer.
The "SOURCES" part should be a reference to the source of the document from which you got your answer.

Example of your response should be:

```
The answer is foo
SOURCES: xyz
```

Begin!
----------------
{summaries}"""


messages = [
    SystemMessagePromptTemplate.from_template(system_template),
    HumanMessagePromptTemplate.from_template("{question}"),
]
prompt = ChatPromptTemplate.from_messages(messages)
chain_type_kwargs = {"prompt": prompt}


@cl.on_chat_start
async def on_chat_start():

    # 发送带有本地文件路径的图像
    elements = [
    cl.Image(name="image1", display="inline", path="./robot.jpeg")
    ]
    await cl.Message(content="你好,欢迎使用文档聊天机器人 AskDocumentQuery!", elements=elements).send()
    files = None

    # 等待用户上传PDF文件
    while files is None:
        files = await cl.AskFileMessage(
            content="请上传PDF文档!",
            accept=["application/pdf"],
            max_size_mb=20,
            timeout=180,
        ).send()

    file = files[0]

    msg = cl.Message(content=f"Processing `{file.name}`...")
    await msg.send()

    # Read the PDF file
    pdf_stream = BytesIO(file.content)
    pdf = PyPDF2.PdfReader(pdf_stream)
    pdf_text = ""
    for page in pdf.pages:
        pdf_text += page.extract_text()

    # 将文本分成块
    texts = text_splitter.split_text(pdf_text)

    # 为每个块创建元数据
    metadatas = [{"source": f"{i}-pl"} for i in range(len(texts))]

    # 创建 Chroma 向量数据库存储
    embeddings = OpenAIEmbeddings()
    docsearch = await cl.make_async(Chroma.from_texts)(
        texts, embeddings, metadatas=metadatas
    )

    # 创建一个使用Chroma向量存储的链
    chain = RetrievalQAWithSourcesChain.from_chain_type(
        ChatOpenAI(temperature=0),
        chain_type="stuff",
        retriever=docsearch.as_retriever(),
    )
    

    # 在用户会话中保存元数据和文本
    cl.user_session.set("metadatas", metadatas)
    cl.user_session.set("texts", texts)

    # 让用户知道系统已准备就绪
    msg.content = f"Processing `{file.name}` done. You can now ask questions!"
    await msg.update()

    cl.user_session.set("chain", chain)


@cl.on_message
async def main(message:str):

    chain = cl.user_session.get("chain")  # type: RetrievalQAWithSourcesChain
    cb = cl.AsyncLangchainCallbackHandler(
        stream_final_answer=True, answer_prefix_tokens=["FINAL", "ANSWER"]
    )
    cb.answer_reached = True
    res = await chain.acall(message, callbacks=[cb])

    answer = res["answer"]
    sources = res["sources"].strip()
    source_elements = []
    
    # 从用户会话中获取元数据和文本
    metadatas = cl.user_session.get("metadatas")
    all_sources = [m["source"] for m in metadatas]
    texts = cl.user_session.get("texts")

    if sources:
        found_sources = []

        # 将来源添加到消息中
        for source in sources.split(","):
            source_name = source.strip().replace(".", "")
            # 获取源的索引
            try:
                index = all_sources.index(source_name)
            except ValueError:
                continue
            text = texts[index]
            found_sources.append(source_name)
            # 创建消息中引用的文本元素
            source_elements.append(cl.Text(content=text, name=source_name))

        if found_sources:
            answer += f"\nSources: {', '.join(found_sources)}"
        else:
            answer += "\nNo sources found"

    if cb.has_streamed_final_answer:
        cb.final_stream.elements = source_elements
        await cb.final_stream.update()
    else:
        await cl.Message(content=answer, elements=source_elements).send()

在终端中运行以下命令来启动聊天 UI:

chainlit run pdf_qa.py -w
chainlit run txt_qa.py -w
chainlit run pdf_txt_qa.py -w
chainlit run csv_qa.py -w

您的浏览器将自动显示一个显示您的聊天机器人的新选项卡,您也可以通过默认地址 localhost:8000 手动打开它。

6.2、部署

与 Streamlit 不同,目前 Chainlit 无法自由部署在您的服务器上并远程发布给用户。到目前为止,通过 chainlit run 运行只会在端口 8000 上创建本地 Web 服务。好消息是,APP 部署已在他们即将推出的列表中,因此很快就能看到这一基本功能。

七、总结

本文主要介绍了大语言模型(LLM)的快速发展以及相关的应用框架,如Streamlit和Gradio。这些框架提供了简单易用的API和丰富的可视化组件,使开发人员能够快速构建交互式应用程序,并展示和验证模型效果。通过这些框架,机器学习工程师和数据科学家可以更方便地将模型能力转化为交互式Web应用,提高开发效率并展示他们的工作成果。

另外探索了各种人工智能语言应用,从"私人"聊天机器人到多模态和语音聊天机器人,以及用于文档学习的聊天机器人。这些项目都是使用Streamlit或Gradio开发的,这两个框架都是强大而轻量级的库,即使对于没有Web框架或编码经验的Python开发工程师来说,也可以快速创建Web应用程序。

总之,通过 Chainlit,开发人员可以利用类似 GPT 的聊天小部件和 LangChain 方法的强大功能,为用户和模型开发人员提供更自然的 AI 聊天机器人体验。

八、References

  • Chainlit

  • https://github.com/Chainlit/chainlit

  • Chainlit docs

  • https://docs.chainlit.io/overview

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。

使用Chainlit 一分钟搭建完成deepseek官网对话页面 Chainlit 是一个用于构建和部署对话式人工智能应用的开源框架。它旨在帮助开发者快速创建、测试和部署基于自然语言处理(NLP)的对话系统。Chainlit 提供了一套工具和接口,使得开发者可以轻松地集成各种 NLP 模型、对话管理组件以及后端服务,从而构建出功能丰富的对话应用。 阅读详情

相关推荐

LLM应用开发架构全解析:从LangChain组件到生产部署实战指南

大语言模型应用开发正从实验性探索转向工程化实践,其核心在于构建可扩展、可维护的系统架构。理解LLM应用的基本原理,需要从模型调用、提示工程、上下文管理等基础概念入手,这些技术共同支撑起智能应用的认知与交互能力。在工程实践中,检索增强生成技术通过结合外部知识库有效解决了模型知识局限与实时性不足的问题,而智能代理框架则赋予应用自主决策与工具调用的行动能力。这些技术的价值在于将大语言模型从对话接口升级为能够处理复杂任务、集成企业数据的生产级系统。典型的应用场景包括智能客服、知识库问答、自动化工作流等。本文以Lan

weixin_30770783的博客 322

chainlit系列03-- chainlit+langchain 实现基于文档的智能知识问答

本文实现用langchain+LLM+chainlit实现文档的本地检索和LLM根据内容回答,实现了基于文档的智能文档系统

leeahuamsg的专栏 3012

大模型聊天UI构建神器——Chainlit库

想象一下,你想自己做一个像 ChatGPT 那样的聊天机器人应用,或者一个能帮你分析文档、回答问题的智能助手。你需要一个漂亮的网页界面让用户输入问题、看到回答,还需要后台程序来处理用户的输入、调用强大的人工智能模型(比如 OpenAI 的 GPT 模型)并返回结果。它是一个开源的 Python 库(就像一堆别人写好的、可以直接拿来用的代码模块)。它的核心目标就是让开发者能用最少的代码、最快的时间,构建出带有类似 ChatGPT 那种聊天界面的 AI 应用。访问用户上传的文件列表,然后读取文件内容进行处理。

qq_54655817的博客 1229

【chainlit】使用chainlit部署chatgpt

官方文档githublangchain 方式pythondocker 启动 chainlit。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

Chainlit web UI的三种用户访问验证详解

Chainlit应用程序默认为公开。要启用身份验证并将您的应用程序设为私有,您需要:定义一个环境变量。这是一个用于签署身份验证令牌的秘密字符串。您可以随时更改它,但它会注销所有用户。您可以使用 轻松生成一个。使用登录名/密码验证用户。使用您自己的OAuth应用程序(如Google等)对用户进行身份验证。根据自定义标头对用户进行身份验证。每个回调接受不同的输入并可选地返回一个cl.User对象。如果回调返回None,则认为身份验证失败。确保每个用户都有一个唯一的标识符,以防止他们共享其数据。

洛阳泰山的博客 2975

免费的真是太香了!Chainlit接入抖音 Coze AI知识库接口快速实现自定义用户聊天界面

由于Coze只提供了一个分享用的网页应用,网页访问地址没法自定义,虽然可以接入等开源应用。但是如果我们想直接给客户应用,还需要客户去设置配置,里面还有很多我们不想展示给客户的东西怎么办?于是,我使用Chainlit实现了一个无缝快速接入Coze实现自定义用户使用界面的应用,代码清晰简单。还可以自定义logo、欢迎语、网站图标、语言输入、语音设别、文件上传等。Coze国内版可以免费使用 豆包模型、通义千问 qwen-max , 智谱 GLM-4128K。

洛阳泰山的博客 3089

3小时零代码!用Chainlit快速打造高逼格AI对话应用,新手也能轻松上手

Chainlit不仅降低了AI应用开发门槛,更通过灵活的扩展性打开了商业化想象力。无论是个人开发者还是企业团队,抓住这波技术红利,完全有可能在AI赛道中实现“小成本引爆大流量”。文中的代码片段和案例均已验证,立即动手实践,抢占下一个10万+用户市场!

TuFuir的博客 2358

Chainlit一个快速构建成式AI应用的Python框架,无缝集成与多平台部署

Chainlit 是一个开源 Python 包,用于构建和部署生成式 AI 应用的开源框架。它提供了一种简单的方法来创建交互式的用户界面,这些界面可以与 LLM(大型语言模型)驱动的应用程序进行通信。Chainlit 旨在帮助开发者快速构建基于文本的 AI 应用,如聊天机器人、问答系统等,并且支持实时消息传递、文件上传等功能。

洛阳泰山的博客 2879

Chainlit系列02- 开发入门聊天应用

本节介绍了chainlit实现简单对话的功能,了解chainlit的使用方法

leeahuamsg的专栏 1655

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

默认情况下,Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。一旦启用,数据持久性将为您的应用程序引入新功能。如何启动数据持久化,下面将为你讲解。

洛阳泰山的博客 2810

三菱PLC软件GX-Works2使用和循环左移指令实现流水灯程序

(2)方式2:双击打开全局软元件注释,软元件名称手动输入,如M辅助继电器输入M0、D寄存器输入D0,然后找到对应的寄存器输入自定义的功能名字即可。链接:https://pan.baidu.com/s/14ZaBIq4mBirIqfd9Ja3AiA。链接:https://pan.baidu.com/s/1nuQz1OgS8bmagPE8T-PBkQ。链接:https://pan.baidu.com/s/1oKGi_bdLN5HI4HYxSXEdlA。(1)方式1:将定义好变量功能的CSV文件导入即可。

panjinliang066333的博客 1万+

快速构建大语言模型的好帮手————Chainlit

创建app.py作为入口文件后,用以下命令启动(-w# 基础启动 chainlit run app.py # 热重载启动(开发推荐) chainlit run app.py -w # 自定义端口(避免端口冲突) chainlit run app.py --port 8080 -w开发效率高:无需前端技术,Python一行代码启动服务,配置文件实现界面定制;LLM场景适配:原生支持对话流、思维链可视化、文件上传,贴合LLM应用需求;生态集成强。

weixin_71363825的博客 1345

从量子兔AlphaPi硬件拆解到ESP32-C3库开发实战

本文详细拆解了量子兔AlphaPi开发板的硬件构成,重点分析了其核心ESP32-C3芯片及外围传感器。通过逆向工程揭示了GPIO引脚定义与通信协议,并实战演示了如何从零开发MicroPython库,驱动按键、加速度计及LED点阵,最终整合成一个互动平衡球游戏项目,展现了开源硬件在教育与二次开发中的潜力。

weixin_29164497的博客 458

使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1

它在数学、代码和推理任务中与 OpenAI-o1 表现相当,并且通过精心设计的训练方法,提升了整体效果。在chainlit的cookbook中提供了一个接入DeepSeek-R1的简单demo,在https://github.com/Chainlit/cookbook/tree/main/deepseek-r1。现在硅基流动也有DeepSeek-R1并且邀请注册可得14元不过期额度,邀请链接:https://cloud.siliconflow.cn/i/Ia3zOSCU。回答的效果确实很不错。

mingupup的博客 538

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度剖析了telnet连接失败,特别是端口23不可达的常见原因与系统性解决方案。文章从客户端本地配置、服务器端服务与防火墙、中间网络路径三个层面,提供了详细的排查步骤与命令,并强调了Telnet协议的安全风险,建议使用SSH等更安全的替代方案进行远程管理与端口测试。

weixin_29306011的博客 897

SEW MDX61B 变频器调试说明

可手动自由更改时间和地址,时间一般不更改,IP地址使用网络适配器地址(Network adapter),点击进入即可。进入网络适配器(Network adapter)后,选择适配器建议地址,点击OK,更改IP地址后点击OK。点击加载配置文件(Load a configuration),加载已保存的应用模块配置文件, 或者点击“next”,开始重新配置AMA0801模块。满足安全回路后,控制模式选为寻参模式(Reference mode),选中开始(start),即可将机械零点设置为电气零点。

xdpcxq的专栏 4300

使用 Chainlit, Langchain 及 Elasticsearch 轻松实现对 PDF 文件的查询

​ 在我之前的文章 “Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)” 里,我详述如何使用 Streamlit,Langchain, Elasticsearch 及 OpenAI 来针对 PDF 进行聊天。在今天的文章中,我将使用 Chainlit 来展示如使用 Langchain 及 Elasticsearch 针对 PDF 文件进行查询。

Elastic 中国社区官方博客 2715

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 987

4个高效步骤:使用Chainlit低代码可视化开发LLM应用

零基础也能快速构建专业级AI交互界面 Chainlit作为一款专为Python开发者设计的低代码工具,让LLM应用开发变得前所未有的简单。无需前端知识,仅通过Python代码即可构建功能完整的可视化AI应用。本文将通过"准备-构建-优化-拓展"四个阶段,带你从零开始掌握Chainlit的核心使用方法,快速实现AI应用的开发与部署。 ## 一、准备阶段:环境搭建与基础配置 ### 1.1 安装

gitblog_01004的博客 294

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上)

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上):慢时钟域到快时钟域!

悟已往之不谏 知来者之可追 1544

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 998

【亲测免费】 链式对话AI(Chainlit)开源项目入门指南

链式对话AI(简称Chainlit),是一个用于构建可扩展对话型AI应用的异步Python框架。在克隆或下载Chainlit项目之后,其基本目录结构通常包括以下关键部分: - `./src`: 包含源代码的主要文件夹。 - `__init__.py`: 初始化python包的基本文件。 - `chainlit.py`: 主要功能实现的文件,包含了创建和控制Chainlit应用的核...

gitblog_00510的博客 1225

基于ESP32 蓝牙游戏手柄设计

介绍使用 ESP32 并通过 BLE 通信的 设计手持游戏手柄,包含原理图与代码

DT程序员的博客 2164

基于LangChain的优秀项目资源库

本文主要内容是一个LangChain资源库,里面罗列了大大小小很多个基于LangChain框架的优秀项目,包括低代码、服务、代理、模板等工具类,还有像知识管理、聊天机器人等开源项目,还包括像视频、文章等AI学习资源,建议大家点赞收藏。

qq_56591814的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

3步上手Chainlit:零基础构建可视化LLM应用全攻略

还在为AI应用开发的技术门槛发愁?Chainlit作为一款专为Python开发者设计的低代码工具,让你无需前端知识,仅用几行代码就能创建功能完整的LLM应用。本文将带你从零开始,掌握Chainlit的核心特性和实战技巧。 ## 🚀 极速入门:环境配置与首次体验 Chainlit的安装过程极其简单,只需在终端执行两条命令即可完成环境搭建: ```sh pip install chainlit

gitblog_00197的博客 1109

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Chainlit系列1-环境搭建

chainlit 是一个用于制作聊天机器人界面的python库,可以用来方便的生成聊天界面,并基于此快速开发AIGC应用

leeahuamsg的专栏 1605

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 只需100GB内存,让Falcon 180B在你的电脑上起飞
下一篇: OnPrem.LLM:一个轻量级 Python 库,用于使用私有数据运行本地大型语言模型
技术狂潮AI
博客等级 码龄3年 1282粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值