集成和关键组件的图形摘要

R检索增强生成 (RAG) 是一种功能强大的工具,它使大型语言模型 (LLM) 能够访问现实世界的数据,从而做出更明智的响应。这是通过将模型与矢量数据库集成以进行实时学习和适应来实现的。此功能使 RAG 成为聊天机器人和虚拟助手等应用程序的首选,这些应用程序对实时准确且合理的响应需求很高。这种技术的高级变体称为图形检索增强生成 (GraphRAG),它将基于图形的知识检索的优势与 LLM 相结合,进一步增强了自然语言处理的能力。与依赖矢量相似性搜索的传统 RAG 方法不同,GraphRAG 从原始文本构建结构化知识图谱,捕获实体、关系和关键声明。这可以增强 LLM 理解和综合复杂数据集及其关系的能力,从而产生更准确且基于上下文的响应。

摘自麻省理工学院 Markus Beuhler 的一篇论文(链接在此处)

AutoGen 是 Microsoft 推出的一款工具,它通过自动化和优化曾经非常复杂且需要大量人工的工作流程,简化了基于多代理 LLM 的复杂应用程序的开发。将 AutoGen 想象成一个可以与多个 GPT 交互的平台,而不仅仅是一个。每个 GPT 都充当单独的“代理”,在综合操作中发挥着独特的作用。将 GraphRAG 的检索优势与 AutoGen AI 代理的对话和面向任务的功能相结合,可以打造出强大的 AI 助手,能够高效处理详细查询、生成和执行代码、创建多页科学报告以及进行数据分析。此外,离线本地 LLM(例如 Ollama 或 LM Studio 的 LLM)可确保经济高效且安全的数据处理。本地 LLM 消除了与在线 LLM 相关的高成本和隐私风险,将敏感数据保留在组织内部并降低运营费用。

本文将指导您使用 GraphRAG 检索系统构建多智能体 AI 应用程序,该系统完全在本地机器上运行,并且免费使用。以下是此应用程序的关键组件:

  1. GraphRAG 的知识搜索方法通过函数调用与 AutoGen 代理集成。

  2. GraphRAG(本地和全局搜索)配置为支持来自 Ollama 的本地模型进行推理和嵌入。

  3. AutoGen 已扩展,以支持通过 Lite-LLM 代理服务器从 Ollama 使用非 OpenAI LLM 进行函数调用。

  4. Chainlit UI 用于处理连续对话、多线程和用户输入设置。

G鉴于我的材料科学和计算建模背景,我想通过从 ABAQUS(一种 FEA 工程软件)的文档以及一些碳纤维和聚合物的技术数据表构建知识图谱来测试此应用程序。考虑到此数据集的复杂性,使用本地 LLM 的整体准确性可能会更好。未来的文章将探索使用不同模型进行嵌入和推理的基准研究的经验。尽管如此,我还是渴望从该领域的科学期刊和数据中构建更复杂的知识图谱,测试高级工程代码生成任务,并利用对话助手集思广益,探讨我专业范围内的科学主题。应用程序如下所示。

带有示例查询的主应用程序 UI。最后两个有相同的查询,但第一个是全局搜索,而第二个是本地搜索。
小部件设置在本地和全局搜索之间切换,设置社区级别和代长度。

开发是在 Linux 环境中使用 Windows Subsystem for Linux (WSL) 和 Visual Studio Code 在 Windows 11 PC 上完成的,该 PC 配备 i9 第 13 代处理器、64 GB RAM 和 24 GB Nvidia RTX 4090。为了在开发和测试此应用程序时获得最佳体验,建议使用 Linux 发行版或 WSL。我尚未在原生 Windows 环境中对此进行测试。有关安装 WSL 和设置 Python 和 Conda 环境的指南,请参阅本文(此处)。本文末尾提供了其他参考资料和相关信息。

这是源代码存储库的链接。现在,让我们开始吧!

安装模型依赖项并克隆存储库。

安装来自 Ollama 的语言模型以进行推理和嵌入

创建 conda 环境并安装这些依赖项

# 创建并激活 conda 环境
conda create -n RAG_agents python=3.12
conda activate RAG_agents

# Ollama 的 Lite-LLM 代理服务器
pip install 'litellm[proxy]'

# 安装 Ollama
pip install ollama

# Microsoft AutoGen
pip install pyautogen 'pyautogen[retrievechat]'

# Microsoft GraphRAG
pip install graphrag

# 文本令牌编码器-解码器
微软的 GraphRAG   AutoGen   Ollama   Chainlit = 本地和免费的多代理 RAG 超级机器人pip install tiktoken

# Chainlit Python 应用程序
pip install chainlit

# 克隆我的 Git-hub 存储库
git clone https://github.com/karthik-codex/autogen_graphRAG.git

# (奖励)将 PDF 文件转换为 GraphRAG 的 Markdown
pip install marker-pdf

# (奖励)仅当您安装了 Marker-pdf 时,因为它默认会删除 GPU CUDA 支持
conda install pytorch torchvision torchaudio pytorch-cuda=12.1-c pytorch-c nvidia

您将在我的 GitHub 存储库中找到以下文件。

/requirements.txt/utils/settings.yaml/utils/chainlit_agents.py/utils/embedding.pyutils/openai_embeddings_llm.py/appUI.py/utils/pdf_to_markdown.py

创建 GraphRAG 知识库。

在存储库的根文件夹中初始化 GraphRAG

配置 GraphRAG 设置以支持来自 Ollama 的本地模型

settings.yaml${GRAPHRAG_API_KEY}
encoding_model: cl100k_base 
skip_workflows: []
llm:
api_key: $ {GRAPHRAG_API_KEY}
类型: openai_chat # 或 azure_openai_chat
模型: mistral
model_supports_json: true
api_base: http://localhost:11434/v1
。。。嵌入:async_mode:threaded # 或 asyncio llm:api_key:${GRAPHRAG_API_KEY}类型:openai_embedding # 或 azure_openai_embedding模型:nomic_embed_text api_base:http://localhost:11434 / api 。。。输入:#将输入文件模式更改为.md 或 .txt类型:文件#或 blob文件类型:文本#或 csv base_dir:“输入”文件编码:utf-8文件模式:“。*\\.md$”

















/utils/pdf_to_markdown.py
openai_embeddings_llm.py embedding.py/home/karthik/miniconda3/envs/RAG_agents/lib/python3.12/site-packages/graphrag/llm/openai/openai_embeddings_llm.py/home/karthik/miniconda3/envs/RAG_agents/lib/python3.12/site-packages/graphrag/query/llm/oai/embedding.py
sudo find / -name openai_embeddings_llm.py

创建嵌入和知识图。

最后,我们创建嵌入并使用全局或本地搜索方法测试知识图谱。完成嵌入过程后,您可以在 GraphRAG 工作目录的“output”文件夹中找到输出工件(.parquet 文件)和报告(.json 和 .logs),在本例中,该文件夹是根文件夹。

启动 Lite-LLM 服务器并从终端运行应用程序

下面是在运行应用程序之前初始化服务器的命令。我选择了 Llama3:8b 来测试这个应用程序。如果硬件允许,您可以使用更大的模型。有关 Lite-LLM 的更多信息,请访问此链接。现在,您可以从另一个终端运行该应用程序。确保您处于正确的 conda 环境中。

# 从终端启动服务器
litellm --model ollama_chat/llama3

# 从另一个终端运行应用程序
chainlit run appUI.py

细分:appUI.py 的核心组件

导入 Python 库

您会注意到从chainlit_agents导入了两个类。这些 AutoGen 代理的包装器类使 Chainlit 能够跟踪其对话并处理终止或其他用户输入。您可以在此处阅读更多相关信息。

配置 AutoGen 代理

AutoGen 代理通过 Lite-LLM 代理服务器利用来自 Ollama 的模型。这是必要的,因为 AutoGen 不支持通过非 OpenAI 推理模型进行函数调用。代理服务器允许使用 Ollama 模型进行函数调用和代码执行。

# 来自 Lite-LLM 服务器的 LLama3 LLM,用于代理 #
llm_config_autogen = {
“seed” : 40 , # 更改不同试验的种子
“temperature” : 0 ,
“config_list” : [{ “model” : “litellm” ,
“base_url” : “http://0.0.0.0:4000/” ,
“api_key” : 'ollama' },
],
“timeout” : 60000 ,
}

在聊天开始时实例化代理并输入用户设置

我创建了三个 Chainlit 小部件(开关、选择和滑块)作为用户设置,以选择 GraphRAG 搜索类型、社区级别和内容生成类型。打开时,开关小部件使用 GraphRAG 本地搜索方法进行查询。内容生成的选择选项包括“优先列表”、“单个段落”、“多个段落”和“多页报告”。滑块小部件使用选项 0、1 和 2 选择社区生成级别。您可以在此处阅读有关 GraphRAG 社区的更多信息。

我选择不使用 Chainlit 包装器类作为检索器助手代理。这样我就可以禁用对检索器输出的跟踪,并直接捕获来自 GraphRAG 函数的响应。原因是当响应通过检索器时,文本会丢失其格式,包括空格和段落缩进。在生成带有主标题和副标题的多页报告时,此问题尤其明显。我可以通过绕过 Chainlit 包装器并直接从 GraphRAG 函数检索输出来保留原始格式。您将在下面看到我是如何实现这一点的。

更新输入设置中的更改

此功能可检测对设置中的选择、开关和滑块小部件所做的任何更改,以便在后续查询中反映这些更改。

@cl.on_settings_update 
async def setup_agent ( settings ):
response_type = settings[ 'Gen_type' ]
community = settings[ 'Community' ]
local_search = settings[ 'Search_type' ]
cl.user_session.set ( ' Gen_type' , response_type)
cl.user_session.set ( 'Community' , community) cl.user_session.set ( ' Search_type' , local_search)打印( ' on_settings_update' , settings)

使用来自代理和用户的传入消息更新 UI。

这是应用程序的核心部分,它创建了一个有两个代理的群聊,定义了一个函数“state_transition”来管理对话序列,并提供异步RAG查询功能。

INPUT_DIR ,ROOT_DIR,RESPONSE_TYPE,COMMUNTIYLOCAL_SEARCHROOT_DIR,’.’
await cl.Message(content=result.response).send()async def query_graphRAG

对于此应用程序,我们只需要两个代理。您可以添加/修改代理并配置“state_transition”函数来协调对话中的说话者选择,以实现更复杂的工作流程。

最后的想法

这是我第一次涉足 AI 代理、LLM 和 RAG,过去几周我直接开始创建此实现,绕过了许多基础知识。虽然此实现并不完美,但它是开发更复杂应用程序的绝佳模板。它为集成多个功能和编码代理奠定了坚实的基础,并使您能够构建复杂的工作流程、自定义代理交互并根据需要增强功能。

阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。