在我的上一篇文章中,我探讨了如何通过使用 Ollama 和 Langchain 来运行本地大型语言模型 (LLM),开发一个 检索增强生成 (RAG) 应用程序。这次,我将展示如何使用不同的工具 [LlamaIndex](https://www.llamaindex.ai/)
来构建相同的 RAG 应用程序。与本文相关的所有源代码已发布在 GitLab 上。请克隆该仓库以跟随文章内容。
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 2
、Mistral
和 Gemma
,这些模型已经准备好部署。这些模型专门设计用于在标准消费级硬件上运行,包括 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 应用的主要功能。下图详细展示了包含这些组件的全面功能架构。
LlamaIndex 提供了不同类型的文档加载器来从不同的来源加载数据作为文档。SimpleDirectoryReader
是一个这样的文档加载器,可以用来从目录中加载数据。这一步使用 LlamaIndex 的 SimpleDirectoryReader
从给定的目录 docs
中抓取文档。这些数据将用于创建向量嵌入并回答用户的问题。
当处理长篇文本时,将文本分成较小的段落是非常重要的。虽然这项任务看起来很简单,但实际上可能包含相当的复杂性。目标是确保语义相关的文本片段保持在一起。LlamaIndex 节点解析器可以有效地完成这项任务。它将文本分割成较小的、语义上有意义的单元(通常是句子)。这些较小的段落随后被组合成更大的块,直到达到某个特定函数确定的大小。一旦达到这个大小,该块将被指定为一个独立的文本片段,然后过程会重新开始,有一定的重叠。LlamaIndex 在后台使用 TokenTextSplitter
将抓取的文档分割成可管理的块。
一旦数据被收集并分割,下一步是将这些文本信息转换为向量嵌入。这些嵌入是从分割后的数据中创建的。文本嵌入对于LLM操作的运行至关重要。虽然从技术上讲,可以使用自然语言与语言模型进行交互,但存储和检索这样的数据效率非常低。为了提高效率,需要将文本数据转换为向量形式。有一些专门的机器学习模型专门用于从文本创建嵌入。在这种情况下,我使用了开源的HuggingFaceEmbedding
模型BAAI/bge-small-en-v1.5
来生成向量嵌入。文本因此被转换为多维向量,这些向量本质上是高维的数值表示,捕捉了语义意义和上下文细微差别。一旦嵌入,这些数据可以被分组、排序、搜索等。我们可以通过计算两个句子之间的距离来确定它们的相关程度。重要的是,这些操作超越了依赖关键词的传统数据库搜索,而是捕捉了句子之间的语义接近度。
生成的向量嵌入然后存储在 Chroma
向量数据库中。Chroma(通常称为 ChromaDB)是一个开源的嵌入式数据库,它使得构建 LLM 应用程序变得容易,可以存储和检索嵌入及其元数据,以及文档和查询。Chroma 高效地处理这些嵌入,允许快速检索和比较基于文本的数据。传统数据库对于精确查询工作得很好,但在理解人类语言的细微差别方面却显得不足。引入向量数据库,这是处理语义搜索的一个游戏规则改变者。与依赖于精确单词或短语的传统文本匹配不同,像 Postgres 与 pgvector 这样的向量数据库从语义上处理信息。这个数据库是系统能够将用户查询与从抓取内容中提取的最相关信息匹配的核心,从而实现快速和准确的响应。
系统通过一个API让用户提交问题。在这个用例中,用户可以询问任何与红队网络安全用例
相关的问题。此API作为用户与聊天机器人之间交互的主要接口。API接受一个参数user_id
,用于标识不同的用户会话。这个user_id
仅用于演示目的。在实际场景中,可以通过HTTP请求中的Authorization头(例如JWT Bearer token)来管理。API设计得直观且易于访问,使用户能够轻松输入查询并获得回复。
当用户通过API提交一个问题时,系统会将这个问题转换为一个向量嵌入。这个嵌入的生成由 [BaseQueryEngin](https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/)
自动处理。这有助于在向量数据库中进行与问题相关的语义搜索。
一旦问题的向量嵌入创建完成,系统会使用语义搜索来扫描向量数据库,识别与用户查询最相关的内容。通过将问题的向量嵌入与存储数据的向量嵌入进行比较,系统可以准确地找到在上下文中相似或相关的信息。在这个场景中,LlamaIndex的BaseQueryEngin
会根据输入查询自动处理语义搜索。语义搜索的结果将被识别为LLM的context
。
接下来,BaseQueryEngin
生成一个包含用户问题和语义搜索结果(上下文)的 [自定义提示](https://python.langchain.com/docs/modules/model_io/prompts/)
。语言模型的提示是一组由用户提供的指令或输入,用于引导模型的响应。这有助于模型理解上下文并生成相关且连贯的语言输出,例如回答问题、完成句子或参与对话。
生成提示后,通过 LlamaIndex 库将其发送到大语言模型(在我们的情况下是 Llama2 7B
) [Ollama](https://docs.llamaindex.ai/en/stable/examples/llm/ollama/)
(LlamaIndex 官方支持使用 Ollama
的 llama_index.llms
)。大语言模型根据提供的上下文找到问题的答案。BaseQueryEngine
负责将查询发送到大语言模型(在后台,它使用 Ollama REST API 提交问题)。
利用 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
,它接受一个包含 question
和 user_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 的 Settings
。init_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。敬请期待 :)
参考-
https://medium.com/rahasak/build-rag-application-using-a-llm-running-on-local-computer-with-ollama-and-langchain-e6513853fda0
-
https://medium.com/rahasak/build-rag-application-using-a-llm-running-on-local-computer-with-gpt4all-and-langchain-13b4b8851db8
-
https://medium.com/@zilliz_learn/persistent-vector-storage-for-llamaindex-ef96133fc128
-
https://stephencollins.tech/posts/web-content-indexing-with-llamaindex
-
https://medium.com/llamaindex-blog/how-to-train-a-custom-gpt-on-your-data-with-embedai-llamaindex-8a701d141070
-
https://pub.towardsai.net/a-complete-guide-to-rag-and-llamaindex-2e1776655bfa
-
https://betterprogramming.pub/getting-started-with-llamaindex-part-2-a66618df3cd
- https://docs.llamaindex.ai/en/stable/examples/vector_stores/ChromaIndexDemo/
共同学习,写下你的评论
评论加载中...
作者其他优质文章