为了账号安全,请及时绑定邮箱和手机立即绑定

使用运行在本地计算机上的 Ollama Llama2 和 LlamaIndex 构建 RAG 应用程序

无需GPU的隐私保护LLM

背景

在我的上一篇文章中,我探讨了如何通过使用 Ollama 和 Langchain 来运行本地大型语言模型 (LLM),开发一个 检索增强生成 (RAG) 应用程序。这次,我将展示如何使用不同的工具 [LlamaIndex](https://www.llamaindex.ai/) 来构建相同的 RAG 应用程序。与本文相关的所有源代码已发布在 GitLab 上。请克隆该仓库以跟随文章内容。

LlamaIndex

LlamaIndex 是一个全面的框架,旨在构建生产级别的检索增强生成(RAG)应用。它提供了一个用户友好且灵活的界面,允许开发人员将大语言模型(LLM)与外部数据源连接起来,例如私有数据库PDF和PowerPoint等格式的文档,以及包括Notion和Slack在内的应用程序,还有PostgreSQL和MongoDB等数据库。它包含各种数据源和格式的连接器,以及用于结构化数据的方法,以确保与LLM的无缝兼容性,从而将企业数据有效转化为生产就绪的LLM应用。该框架提供了一套工具,用于高效的数据摄取、索引和查询,使其成为RAG应用的全方位解决方案。因此,LlamaIndex 可以将您的企业数据转化为生产就绪的RAG应用。

与另一个用于构建RAG应用的框架 LangChain 相比,LlamaIndex 在 RAG 系统中的搜索和检索应用方面有着专注的投入。虽然 LangChain 是一个通用平台,用于在各种项目中利用 LLM,LlamaIndex 则专注于构建 RAG 系统中的搜索和检索应用。它提供了一个简单的接口来查询 LLM 并检索相关文档。LlamaIndex 的效率也高于 LangChain,因此对于需要处理大量数据的应用来说,它是一个更好的选择。

基于我个人的经验,使用 LlamaIndex 构建的 RAG 应用程序相比使用 LangChain 开发的程序往往能生成更准确的响应。

Ollama

[Ollama](https://github.com/ollama/ollama) 是一个轻量且灵活的框架,旨在将大型语言模型(LLM)部署到个人电脑上。它通过一个与 OpenAI 兼容的直观 API 简化了 LLM 的开发、执行和管理,并提供了一系列预配置的模型,可以立即用于各种应用程序。其设计的核心是将模型权重、配置和数据打包成一个统一的包,封装在一个 [Modelfile](https://github.com/ollama/ollama/blob/main/docs/modelfile.md) 中。

该框架提供了一套精心挑选的预量化、优化的模型,例如 Llama 2MistralGemma,这些模型已经准备好部署。这些模型专门设计用于在标准消费级硬件上运行,包括 CPU 和 GPU,并且兼容多个操作系统,包括 macOS、Linux 和 Windows。这种做法消除了用户自行进行复杂模型优化任务的必要性。

鉴于大型语言模型(LLMs)通常由于其庞大的规模需要强大的GPU,Ollama 支持的模型采用了 神经网络量化 技术。这种技术大大降低了硬件需求,使得 LLMs 可以在没有互联网连接的普通计算设备上高效运行。因此,Ollama 使得 LLM 技术更加易于获取,个人和组织都可以在消费级硬件上利用这些先进的模型。

基于RAG的应用

此 RAG 应用程序利用了一个自定义构建的数据集,该数据集从一组文档中动态获取。它通过 API(例如 REST API)使用户能够与数据集进行交互(例如查询或搜索数据)。为了说明目的,选择了一个专注于 [red-team](https://www.sentor.se/whitepaper/whitepaper-red-team-testing/?utm_term=redteam&utm_campaign=Sentor.se+-+Sweden&utm_source=adwords&utm_medium=ppc&hsa_acc=2370497819&hsa_cam=37259740&hsa_grp=109035233673&hsa_ad=547816127696&hsa_src=g&hsa_tgt=kwd-25470231934&hsa_kw=redteam&hsa_mt=p&hsa_net=adwords&hsa_ver=3&gad_source=1&gclid=CjwKCAjwnv-vBhBdEiwABCYQA3hsEjP5u3tmhHLJF8vunkAZ0KVJzxMmfAaniQgxJPNFXM5ADMB-XhoCzFYQAvD_BwE) 相关文档集的网络安全场景。从这些文档中提取的数据被分割并存储在 [Chroma](https://python.langchain.com/docs/integrations/vectorstores/chroma) 向量数据库中作为向量嵌入,从而允许用户通过 API 平滑地与红队文档进行交互。

为了这个RAG应用的LLM组件,我选择了通过Ollama运行的Llama2 7B模型。Ollama上的Llama2是Meta的Llama-2 LLM的量化版本,旨在高效地在包括CPU在内的消费级硬件上运行。在这个配置中,与Ollama集成的Llama2 LLM根据特定于红队的文档内容为用户提供响应。通过LlamaIndex实现的RAG应用与LLM的无缝融合,增强了应用提供相关和准确信息的能力。

以下是一些 RAG 应用的主要功能。下图详细展示了包含这些组件的全面功能架构。

1. 抓取文档数据

LlamaIndex 提供了不同类型的文档加载器来从不同的来源加载数据作为文档。SimpleDirectoryReader 是一个这样的文档加载器,可以用来从目录中加载数据。这一步使用 LlamaIndex 的 SimpleDirectoryReader 从给定的目录 docs 中抓取文档。这些数据将用于创建向量嵌入并回答用户的问题。

2. 拆分文档

当处理长篇文本时,将文本分成较小的段落是非常重要的。虽然这项任务看起来很简单,但实际上可能包含相当的复杂性。目标是确保语义相关的文本片段保持在一起。LlamaIndex 节点解析器可以有效地完成这项任务。它将文本分割成较小的、语义上有意义的单元(通常是句子)。这些较小的段落随后被组合成更大的块,直到达到某个特定函数确定的大小。一旦达到这个大小,该块将被指定为一个独立的文本片段,然后过程会重新开始,有一定的重叠。LlamaIndex 在后台使用 TokenTextSplitter 将抓取的文档分割成可管理的块。

3. 创建向量嵌入

一旦数据被收集并分割,下一步是将这些文本信息转换为向量嵌入。这些嵌入是从分割后的数据中创建的。文本嵌入对于LLM操作的运行至关重要。虽然从技术上讲,可以使用自然语言与语言模型进行交互,但存储和检索这样的数据效率非常低。为了提高效率,需要将文本数据转换为向量形式。有一些专门的机器学习模型专门用于从文本创建嵌入。在这种情况下,我使用了开源的HuggingFaceEmbedding模型BAAI/bge-small-en-v1.5来生成向量嵌入。文本因此被转换为多维向量,这些向量本质上是高维的数值表示,捕捉了语义意义和上下文细微差别。一旦嵌入,这些数据可以被分组、排序、搜索等。我们可以通过计算两个句子之间的距离来确定它们的相关程度。重要的是,这些操作超越了依赖关键词的传统数据库搜索,而是捕捉了句子之间的语义接近度。

4. 将向量嵌入存储在 Chroma 中

生成的向量嵌入然后存储在 Chroma 向量数据库中。Chroma(通常称为 ChromaDB)是一个开源的嵌入式数据库,它使得构建 LLM 应用程序变得容易,可以存储和检索嵌入及其元数据,以及文档和查询。Chroma 高效地处理这些嵌入,允许快速检索和比较基于文本的数据。传统数据库对于精确查询工作得很好,但在理解人类语言的细微差别方面却显得不足。引入向量数据库,这是处理语义搜索的一个游戏规则改变者。与依赖于精确单词或短语的传统文本匹配不同,像 Postgres 与 pgvector 这样的向量数据库从语义上处理信息。这个数据库是系统能够将用户查询与从抓取内容中提取的最相关信息匹配的核心,从而实现快速和准确的响应。

5. 用户提问

系统通过一个API让用户提交问题。在这个用例中,用户可以询问任何与红队网络安全用例相关的问题。此API作为用户与聊天机器人之间交互的主要接口。API接受一个参数user_id,用于标识不同的用户会话。这个user_id仅用于演示目的。在实际场景中,可以通过HTTP请求中的Authorization头(例如JWT Bearer token)来管理。API设计得直观且易于访问,使用户能够轻松输入查询并获得回复。

6. 创建问题的向量嵌入

当用户通过API提交一个问题时,系统会将这个问题转换为一个向量嵌入。这个嵌入的生成由 [BaseQueryEngin](https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/) 自动处理。这有助于在向量数据库中进行与问题相关的语义搜索。

7. 语义搜索向量数据库

一旦问题的向量嵌入创建完成,系统会使用语义搜索来扫描向量数据库,识别与用户查询最相关的内容。通过将问题的向量嵌入与存储数据的向量嵌入进行比较,系统可以准确地找到在上下文中相似或相关的信息。在这个场景中,LlamaIndex的BaseQueryEngin会根据输入查询自动处理语义搜索。语义搜索的结果将被识别为LLM的context

8. 生成提示词

接下来,BaseQueryEngin 生成一个包含用户问题和语义搜索结果(上下文)的 [自定义提示](https://python.langchain.com/docs/modules/model_io/prompts/)。语言模型的提示是一组由用户提供的指令或输入,用于引导模型的响应。这有助于模型理解上下文并生成相关且连贯的语言输出,例如回答问题、完成句子或参与对话。

9. 向 LLM 发送提示

生成提示后,通过 LlamaIndex 库将其发送到大语言模型(在我们的情况下是 Llama2 7B[Ollama](https://docs.llamaindex.ai/en/stable/examples/llm/ollama/)(LlamaIndex 官方支持使用 Ollamallama_index.llms)。大语言模型根据提供的上下文找到问题的答案。BaseQueryEngine 负责将查询发送到大语言模型(在后台,它使用 Ollama REST API 提交问题)。

10. 生成LLM回答

利用 Meta 的 Llama-2 的高级功能,LLM 在提供的内容上下文中处理问题,然后生成响应并发送回去。

11. 将答案回传给用户

最后,从LLM接收到的答案通过HTTP API转发给用户。用户可以通过提供相同的user_id在后续请求中继续提问不同的问题。系统会识别用户的聊天历史,并将其与新的语义搜索结果一起发送给LLM。这个过程确保了流畅且具有上下文意识的对话,每次交互都丰富了用户体验。

实现

以下是该聊天机器人的完整实现细节。聊天机器人的完整源代码可在 GitLab 上访问和查阅。

1. 配置

config.py 文件中,我定义了聊天机器人中使用的各种配置。这些配置通过环境变量读取,遵循 12-factor 应用程序 的原则。

    import os  

    # 定义初始索引  
    INIT_INDEX = os.getenv('INIT_INDEX', 'false').lower() == 'true'  

    # 向量索引持久化目录  
    INDEX_PERSIST_DIRECTORY = os.getenv('INDEX_PERSIST_DIRECTORY', "./data/chromadb")  

    # HTTP API 端口  
    HTTP_PORT = os.getenv('HTTP_PORT', 7654)  

    # MongoDB 配置主机、用户名、密码  
    MONGO_HOST = os.getenv('MONGO_HOST', 'localhost')  
    MONGO_PORT = os.getenv('MONGO_PORT', 27017)  
    MONGO_USER = os.getenv('MONGO_USER', 'testuser')  
    MONGO_PASS = os.getenv('MONGO_PASS', 'testpass')
2. HTTP API

HTTP API 的实现是在 api.py 文件中进行的。该 API 包含一个 HTTP POST 端点 api/question,它接受一个包含 questionuser_id 的 JSON 对象。user_id 用于演示目的。在实际应用中,这可以通过 HTTP 请求中的 Authorization header(例如 JWT Bearer token)来管理。当用户发送一个问题请求时,该请求会被转发到 ChatBot 模型中的 chat 函数。

    from flask import Flask  
    from flask import jsonify  
    from flask import request  
    from flask_cors import CORS  
    import logging  
    import sys  
    from model import *  
    from config import *  

    app = Flask(__name__)  
    CORS(app)  

    logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')  

    @app.route('/api/question', methods=['POST'])  
    def post_question():  
        json = request.get_json(silent=True)  
        question = json['question']  
        user_id = json['user_id']  
        logging.info("用户 `%s` 发送的问题 `%s`", user_id, question)  

        resp = chat(question, user_id)  
        data = {'answer':resp}  

        return jsonify(data), 200  

    if __name__ == '__main__':  
        init_llm()  
        index = init_index(Settings.embed_model)  
        init_query_engine(index)  

        app.run(host='0.0.0.0', port=HTTP_PORT, debug=True)
3. 模型

以下是模型的实现。它包括一个函数 init_index,该函数从给定的网页 URL 中抓取数据并创建向量存储索引。init_llm 函数使用 Ollama 的 Llama2 LLM 和 HuggingFace 的 BAAI/bge-small-en-v1.5 嵌入初始化 LlamaIndex 的 Settingsinit_query_engine 函数使用之前创建的向量存储索引和自定义提示来初始化 LlamaIndex 查询引擎。chat 函数负责向 LLM 发送问题。

    import chromadb  
    import logging  
    import sys  

    from llama_index.llms.ollama import Ollama  
    from llama_index.embeddings.huggingface import HuggingFaceEmbedding  
    from llama_index.core import (Settings, VectorStoreIndex, SimpleDirectoryReader, PromptTemplate)  
    from llama_index.core import StorageContext  
    from llama_index.vector_stores.chroma import ChromaVectorStore  

    import logging  
    import sys  

    logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')  

    global query_engine  
    query_engine = None  

    def init_llm():  
        llm = Ollama(model="llama2", request_timeout=300.0)  
        embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")  

        Settings.llm = llm  
        Settings.embed_model = embed_model  

    def init_index(embed_model):  
        reader = SimpleDirectoryReader(input_dir="./docs", recursive=True)  
        documents = reader.load_data()  

        logging.info("正在使用 `%d` 个文档创建索引", len(documents))  

        # EphemeralClient 不会在磁盘上存储任何数据,并创建 Chroma 的内存实例  
        chroma_client = chromadb.EphemeralClient()  
        chroma_collection = chroma_client.create_collection("iollama")  

        vector_store = ChromaVectorStore(chroma_collection=chroma_collection)  
        storage_context = StorageContext.from_defaults(vector_store=vector_store)  

        index = VectorStoreIndex.from_documents(documents, storage_context=storage_context, embed_model=embed_model)  

        return index  

    def init_query_engine(index):  
        global query_engine  

        # 自定义提示模板  
        template = (  
            "想象一下你是一位高级网络安全法律专家,可以访问所有当前和相关的法律文件、案例研究和专家分析。你的目标是为该领域的提问提供有洞察力、准确且简洁的答案。\n\n"  
            "以下是与查询相关的一些背景信息:\n"  
            "-----------------------------------------\n"  
            "{context_str}\n"  
            "-----------------------------------------\n"  
            "根据上述信息,请详细引用适用的法律、先例或原则来回答以下问题:\n\n"  
            "问题:{query_str}\n\n"  
            "请简洁地回答,以 '根据网络安全法律' 开头,并确保你的回答对没有法律背景的人来说是易于理解的。"  
        )  
        qa_template = PromptTemplate(template)  

        # 使用自定义模板构建查询引擎  
        # text_qa_template 指定自定义模板  
        # similarity_top_k 配置检索器返回最相似的前 3 个文档,  
        # 默认的 similarity_top_k 值为 2  
        query_engine = index.as_query_engine(text_qa_template=qa_template, similarity_top_k=3)  

        return query_engine  

    def chat(input_question, user):  
        global query_engine  

        response = query_engine.query(input_question)  
        logging.info("从 llm 获取到响应 - %s", response)  

        return response.response
运行应用

以下为主要的操作ChatBot应用程序和与其交互的步骤。可以通过HTTP API提交问题,并相应地接收回复。

1. 安装依赖

在本应用中,我使用了多个需要通过 Python 的 pip 包管理器安装的 Python 包。requirements.txt 文件列出了所有必需的包。

    huggingface-hub  
    sentence-transformers  

    Flask==2.0.1  
    Werkzeug==2.2.2  
    flask-cors  

    langchain==0.0.352  
    tiktoken  
    unstructured  
    unstructured[local-pdf]  
    unstructured[local-inference]  

    llama-index  
    llama-index-llms-ollama  
    llama-index-embeddings-huggingface  
    torch  

    # 手动安装下面的模块以解决 `requirements.txt` 中的依赖安装问题  
    # pip install llama-index-vector-stores-chroma

我已经使用了 Python 虚拟环境来设置这些依赖项。这些包可以通过执行命令 pip install -r requirements.txt 安装。

    # 在 `ollama` 源代码目录中创建虚拟环境  
    ❯❯ cd iollama   
    ❯❯ python -m venv .venv  

    # 启用虚拟环境  
    ❯❯ source .venv/bin/activate  

    # 安装依赖项  
    ❯❯ pip install -r requirements.txt  

    # 手动安装以下模块以解决 `requirements.txt` 安装依赖项时的问题  
    ❯❯ pip install llama-index-vector-stores-chroma
2. 运行 Ollama Llama2

Ollama 提供了多种部署选项,使其能够在 macOS、Linux 或 Windows 系统上作为独立二进制文件运行,也可以在 Docker 容器中运行。这种灵活性确保用户可以轻松地在他们喜欢的平台上设置和与 LLM 交互。Ollama 支持命令行和 REST API 交互,可以无缝集成到各种工作流程和应用程序中。例如,通过 Ollama 运行 Llama2 模型,展示了其高效托管和管理 LLM 的能力。以下是在 MacOS 上部署 Ollama 的示例,展示了我在该平台上运行 Llama2 模型的经验。

    # 从这里下载适用于 MacOS 的 Ollama 并进行安装  
    # 安装完成后,ollama 二进制文件将位于 `/usr/local/bin` 目录中  
    ❯❯ ls /usr/local/bin/  
    ollama  

    # Ollama 的镜像、清单数据存放在 `~/.ollama` 目录中  
    ❯❯ ls ~/.ollama  
    history        id_ed25519     id_ed25519.pub logs           models  

    # 运行 llama2 模型  
    # 这将下载 LLM 镜像并运行它  
    # 下载的镜像清单将存储在 `~/.ollama/models` 目录中  
    # 如果 LLM 镜像已存在,则将启动该镜像  
    root@150bc5106246:/# ollama run llama2  
    拉取清单  
    拉取 8934d96d3f08... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 3.8 GB  
    拉取 8c17c2ebb0ea... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.0 KB  
    拉取 7c23fb36d801... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.8 KB  
    拉取 2e0493f67d0c... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   59 B  
    拉取 fa304d675061... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   91 B  
    拉取 42ba7f8a01dd... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  557 B  
    验证 sha256 校验和  
    写入清单  
    删除任何未使用的层  
    成功  
    >>>   

    # 退出 LLM 控制台  
    >>> /bye  
    root@c96f4fc1be6f:/#  

    # 列出正在运行的 LLM  
    root@150bc5106246:/# ollama list  
    名称          ID           大小   修改时间  
    llama2:latest 78e26419b446 3.8 GB 10 小时前  

    # 重新连接到 LLM 控制台  
    root@c96f4fc1be6f:/# ollama run llama2  
    >>>  

    # 通过 LLM 控制台提问  
    root@c96f4fc1be6f:/# ollama run llama2  
    >>> 什么是 Docker  
    Docker 是一个开源平台,可让您创建、部署和运行容器中的应用程序。容器轻量且便携,允许您在不同的环境中移动应用程序而不必担心兼容性问题。Docker 提供了一种一致且可靠的方式来部署应用程序,使管理和扩展基础设施变得更加容易。  

    ---  

    # Ollama 通过 REST API(`api/generate`)将 LLM 运行在端口 `11434` 上  
    # 我们可以通过 REST API(例如使用 `curl`)提问  
    # 通过 REST API 提问并获取流式输出  
    # `"stream": true` 将流式输出 LLM 的结果(例如逐字输出)  
    ❯❯ curl http://localhost:11434/api/generate -d '{  
      "model": "llama2",  
      "prompt": "什么是 Docker?",  
      "stream": true  
    }'  
    {"model":"llama2","created_at":"2024-03-17T10:41:53.358162047Z","response":"\n","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:53.494021698Z","response":"D","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:53.630381369Z","response":"ocker","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:53.766590368Z","response":" 是","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:53.902649027Z","response":" 一个","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.039338585Z","response":" 开源","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.175494123Z","response":" 平台","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.311130558Z","response":" ,","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.447809241Z","response":" 可以","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.585971524Z","response":" 让您","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.723769251Z","response":" 创建","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.862244297Z","response":" ,","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:54.999796889Z","response":" 部署","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:55.136406278Z","response":" ,","done":false}  
    {"model":"llama2","created_at":"2024-03-17T10:41:55.273430683Z","response":" 并","done":false}  

    # 通过 REST API 提问并获取非流式输出  
    # 这将等待 LLM 完整响应后输出  
    ❯❯ curl http://localhost:11434/api/generate -d '{  
      "model": "phi",  
      "prompt": "为什么是 Docker?",  
      "stream": false  
    }'  
    {"model":"phi","created_at":"2024-03-16T23:42:34.140800795Z","response":" Docker 是一个容器化平台,允许您将应用程序代码、依赖项和运行时环境打包到一个可执行容器中。这使得您可以在安装了 Docker 的任何机器上运行应用程序,只要容器具有必要的依赖项和配置设置。容器与其他容器相比,隔离性更强,有助于提高性能和安全性。此外,Docker 提供了自动化常见任务(如构建和部署容器)的工具,使其成为开发人员和 IT 专业人员的热门选择。\n","done":true,"context":[11964,25,317,8537,1022,257,11040,2836,290,281,11666,4430,8796,13,383,8796,3607,7613,7429,284,262,2836,338,2683,13,198,12982,25,4162,318,36253,30,198,48902,25,25716,318,257,9290,1634,3859,326,3578,345,284,5301,534,3586,2438,11,20086,11,290,19124,2858,656,257,2060,28883,9290,13,770,1838,340,2562,284,1057,534,5479,319,597,4572,351,25716,6589,11,355,890,355,262,9290,468,262,3306,20086,290,8398,6460,13,2345,50221,389,635,517,11557,422,1123,584,621,4569,26162,286,5479,11,543,460,1037,2987,2854,290,2324,13,12032,11,25716,3769,4899,329,3557,803,2219,8861,884,355,2615,290,29682,16472,11,1642,340,257,2968,3572,1871,6505,290,7283,11153,13,198],"total_duration":6343449574,"load_duration":21148773,"prompt_eval_duration":65335000,"eval_count":107,"eval_duration":6256397000}%
3. 运行 RAG 应用程序

RAG 应用可以通过 api.py 如下启动。在运行之前,需要通过环境变量设置一些配置。执行 api.py 后,将启动 HTTP API,允许用户提交问题。

    # 在 `ollama` 源目录中启用虚拟环境   
    ❯❯ cd iollama  
    ❯❯ source .venv/bin/activate  

    # 运行应用程序  
    2024-03-24 18:04:45,917 - INFO - 使用 `46` 个文档创建索引  
    2024-03-24 18:04:45,922 - INFO - 匿名遥测已启用。有关更多信息,请参阅 https://docs.trychroma.com/telemetry  

* 服务 Flask 应用 'api'(懒加载)  

* 环境:生产  
       警告:这是一个开发服务器。请勿在生产部署中使用它。  
       请使用生产 WSGI 服务器。  

* 调试模式:开启  
    2024-03-24 18:04:47,151 - INFO - 警告:这是一个开发服务器。请勿在生产部署中使用它。请使用生产 WSGI 服务器。  

* 在所有地址上运行(0.0.0.0)  

* 在 http://127.0.0.1:7654 上运行  

* 在 http://192.168.0.110:7654 上运行  
    2024-03-24 18:04:47,151 - INFO - 按下 CTRL+C 退出  
    2024-03-24 18:04:47,151 - INFO -  * 通过 stat 重启  
    2024-03-24 18:04:52,083 - INFO - 使用 `46` 个文档创建索引  
    2024-03-24 18:04:52,088 - INFO - 匿名遥测已启用。有关更多信息,请参阅 https://docs.trychroma.com/telemetry  
    2024-03-24 18:04:53,338 - WARNING -  * 调试器已激活!  
    huggingface/tokenizers: 当前进程已分叉,之前已使用了并行处理。为避免死锁,禁用并行处理...  
    要禁用此警告,您可以:  
     - 尽可能避免在分叉前使用 `tokenizers`  
     - 显式设置环境变量 TOKENIZERS_PARALLELISM=(true | false)  
    2024-03-24 18:04:53,353 - INFO -  * 调试器 PIN:102-298-684
4. 提问

一旦RAG应用程序运行起来,我可以通过HTTP API提交与红队用例相关的问题。

    # 提交问题  
    ❯❯ curl -i -XPOST "http://localhost:7654/api/question" \  
    --header "Content-Type: application/json" \  
    --data '  
    {  
      "question": "什么是红队",  
      "user_id": "kakka"  
    }  
    '  

    # llm的响应  
    HTTP/1.1 200 OK  
    {  
      "answer": "根据网络安全法,红队是网络安全测试中使用的一种攻击技术,用于模拟对组织安全防御的真实世界攻击。红队的目标是识别组织安全响应中的漏洞,提高其整体网络安全韧性。\n\n在英国,有各种法律和法规管理网络安全,包括《通用数据保护条例》(GDPR)和《2019年网络安全法》。这些法律要求组织采取适当的措施来保护其系统和数据免受网络威胁。\n\n例如,《通用数据保护条例》(GDPR)要求组织采取适当的措施来确保个人数据的安全。组织还必须定期进行风险评估,以识别潜在漏洞并采取适当的措施来减轻它们。\n\n同样,《2019年网络安全法》为提高英国的网络安全提供了一个框架。该法要求组织采取适当的措施来保护其系统和数据免受网络威胁,包括实施事件响应计划和定期进行安全测试和评估。\n\n除了法律要求外,还有特定行业的法规和指南管理某些领域的网络安全,例如金融、医疗保健和能源。例如,《支付卡行业数据安全标准》(PCI DSS)为处理信用卡交易的组织提供了具体要求,而《健康保险可移植性和责任法案》(HIPAA)则为保护敏感的医疗信息设定了安全标准。\n\n总之,红队测试是一种重要的网络安全测试技术,可以帮助组织识别其防御中的漏洞并提高其整体网络安全韧性。英国管理网络安全的法律和法规为实施适当的措施以保护系统和数据免受网络威胁提供了框架。"  
    }  

    ---  

    ❯❯ curl -i -XPOST "http://localhost:7654/api/question" \  
    --header "Content-Type: application/json" \  
    --data '  
    {  
      "question": "红队与蓝队的区别",  
      "user_id": "kakka"  
    }  
    '  
    HTTP/1.1 200 OK  

    {  
      "answer": "根据网络安全法,红队和蓝队是组织网络安全策略的重要组成部分。红队专注于模拟真实威胁和攻击,以识别防御系统的漏洞,而蓝队则专注于分析这些攻击并开发方法来减轻和预防这些攻击。紫队旨在促进进攻和防御元素之间的有效互动,分析结果并提出措施以优化双方的战略和战术。\n\n了解这些团队的角色在今天的数字环境中至关重要,因为网络安全威胁变得越来越复杂和频繁。红队的模拟攻击帮助组织识别其防御中的弱点,使他们能够采取主动措施来解决这些漏洞。同样,蓝队对这些攻击的分析帮助组织开发有效的对策,以防止未来的攻击。\n\n紫队协调这些努力,确保双方团队能够有效地合作,共享知识和专业知识,以增强整体网络安全策略。通过紧密合作,组织可以将他们的网络安全方法从静态措施转变为动态、不断更新的系统。这使他们能够更有效地抵御和预测威胁,保护其资产并确保其工作流程的韧性。\n\n相关的法律和先例包括:\n\n1. 2015年《网络安全信息共享法》(CISA):该法律鼓励政府机构、私营公司和其他利益相关者之间共享网络威胁信息,以增强网络安全防御。\n2. 欧盟《通用数据保护条例》(GDPR):该条例为在欧盟运营的组织设定了全面的数据保护规则,包括与数据隐私和安全相关的规定。\n3. 美国国家标准与技术研究院(NIST)网络安全框架:该框架为关键基础设施部门(如能源、交通和医疗保健)管理网络安全风险提供了一套指南。\n4. 法院案例:许多法院案例建立了红队和蓝队演练的法律依据。例如,2018年的美国诉约翰·多伊等人案(D.D.C. No. 17-cr-0014)强调了定期进行安全评估以防止网络攻击和保护敏感信息的重要性。\n5. 行业标准:组织可以参考特定行业的标准,如支付卡处理公司的支付卡行业数据安全标准(PCI DSS)或医疗保健提供者的健康保险可移植性和责任法案(HIPAA),以确保符合监管要求。\n\n总之,红队与蓝队的区别是网络安全法的重要方面,因为它强调了采取主动防御措施和有效合作以保护数字资产和持续保护的重要性。"  
    }
接下来做什么

在接下来的一篇文章中,我计划深入探讨使用自定义数据集对大型语言模型(LLM)进行微调或训练的过程,特别是关注Meta的Llama-2 LLM。敬请期待 :)

参考
  1. https://medium.com/rahasak/build-rag-application-using-a-llm-running-on-local-computer-with-ollama-and-langchain-e6513853fda0

  2. https://medium.com/rahasak/build-rag-application-using-a-llm-running-on-local-computer-with-gpt4all-and-langchain-13b4b8851db8

  3. https://medium.com/@zilliz_learn/persistent-vector-storage-for-llamaindex-ef96133fc128

  4. https://stephencollins.tech/posts/web-content-indexing-with-llamaindex

  5. https://medium.com/llamaindex-blog/how-to-train-a-custom-gpt-on-your-data-with-embedai-llamaindex-8a701d141070

  6. https://pub.towardsai.net/a-complete-guide-to-rag-and-llamaindex-2e1776655bfa

  7. https://betterprogramming.pub/getting-started-with-llamaindex-part-2-a66618df3cd

  8. https://nanonets.com/blog/llamaindex/

  9. https://docs.llamaindex.ai/en/stable/examples/vector_stores/ChromaIndexDemo/
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消