ollama轻松部署本地GraphRAG(避雷篇)

news2024/9/21 10:47:31

本篇文章主要介绍如何使用ollama本地部署微软的Graph RAG,,Graph RAG成为RAG一种新范式,对于全局总结性问题表现突出,当开始的技术路线是Qwen2+vllm+fastchat本地部署Grapg RAG,但是embedding 的openai服务怎么都跑不起来,只好更换技术路线,由ollama一站式解决。但是中间也出现非常多的问题,比如Columns must be same length as key。跟着本篇文章使用ollama+mistral-nemo+mxbai-embed-large实现本地的GraphRAG的部署再也不用担心tokens花费不起啦

文章目录

  • 一、前沿知识
    • 1. GraphRAG
    • 2. mistral-nemo
    • 3.mxbai-embed-large
  • 二、环境配置
  • 三、ollama下载需要的模型
  • 四、建立GraphRAG.index
  • 五、提问测试

一、前沿知识

1. GraphRAG

在这里插入图片描述
Graph RAG是一种基于知识图谱的检索增强技术。通过构建图模型的知识表达,将实体和关系之间的联系用图的形式展示出来,然后利用大语言模型(LLM)进行检索增强。这种方法将知识图谱视为一个超大规模的词汇表,实体和关系则对应于单词,从而在检索时能够将实体和关系作为单元进行联合建模。
本项目目的即为在本地实现GraphRAG部署

2. mistral-nemo

Today, we are excited to release Mistral NeMo, a 12B model built in collaboration with NVIDIA. Mistral NeMo offers a large context window of up to 128k tokens. Its reasoning, world knowledge, and coding accuracy are state-of-the-art in its size category. As it relies on standard architecture, Mistral NeMo is easy to use and a drop-in replacement in any system using Mistral 7B.链接

We have released pre-trained base and instruction-tuned checkpoints checkpoints under the Apache 2.0 license to promote adoption for researchers and enterprises. Mistral NeMo was trained with quantisation awareness, enabling FP8 inference without any performance loss.

The following table compares the accuracy of the Mistral NeMo base model with two recent open-source pre-trained models, Gemma 2 9B, and Llama 3 8B.

在这里插入图片描述
本文使用mistral-nemo作为chat的LLM

3.mxbai-embed-large

Here, we provide several ways to produce sentence embeddings. Please note that you have to provide the prompt Represent this sentence for searching relevant passages: for query if you want to use it for retrieval. Besides that you don’t need any prompt. Our model also supports Matryoshka Representation Learning and binary quantization.
huggingface链接

本文使用mxbai-embed-large作为embedding的模型

模型选择方面最好和我的保持一致,这样不会出错!

额外的知识(之前的技术路线介绍,可跳过)
2. Qwen2-7B
Qwen2是Qwen大型语言模型的新系列。对于Qwen2,我们发布了一系列基础语言模型和指令调优语言模型,参数范围从5亿到720亿,包括一个混合专家模型。这个存储库包含了7B的Qwen2基础语言模型。

与最新的开源语言模型相比,包括之前发布的Qwen1.5,Qwen2在大多数开源模型中通常表现优越,并在一系列针对语言理解、语言生成、多语言能力、编码、数学、推理等基准测试中展示了与专有模型的竞争力。魔塔社区介绍
准备使用Qwen2-7B作为chatLLM

3. vLLM
vLLM 是一个快速且易于使用的库,用于 LLM 推理和服务。vLLM 利用 PagedAttention,这是我们的新注意力算法,可有效管理注意力键和值。配备 PagedAttention 的 vLLM 重新定义了 LLM 服务的新技术水平:它提供比 HuggingFace Transformer 高 24 倍的吞吐量,而无需更改任何模型架构。
准备使用vLLM开启openai服务

4. fastchat
FastChat 是以 UC Berkeley 主导的 Large Model Systems Organization 所开源的面向 LLM 的训练、推理与评估的开放平台,通过该平台可以快速部署多模型的 LLM 服务,并且通过 Web UI 以及兼容 OpenAI API 的 RESTful API 访问。
准备使用fastchat开启embedding服务

二、环境配置

博主没有自己的卡,只能在autodl中租服务器跑,组的是4090单显卡,内存24GB,系统盘是80G。pytorch框架选择2.3.0,python版本号选择3.12.
在这里插入图片描述
创建虚拟环境

需要创建两个个虚拟环境,分别对应ollama,和graphrag:

conda create -n ollama python==3.11
conda create -n graphrag python==3.11

进入ollama环境,安装ollama,最好先conda init一下,关闭终端再激活环境

conda activate ollama
pip install ollama

还需要额外安装一下ollama工具包,要不然无法使用,官网给的方法是:

curl -fsSL https://ollama.com/install.sh | sh

但是速度太慢,可以借鉴这篇博客进行安装:Ollama linux脚本快速安装教程(国内适用)
进入fastchat环境,安装fastchat:

conda activate fastchat
pip install fschat==0.2.35

进入graphrag环境,进行配置,可参考Ollama linux脚本快速安装教程(国内适用),讲脚本下载到本地修改后在安装,亲测速度会快很多。

新建一个终端,进入graphrag环境,安装graphrag

conda activate graphrag
pip install graphrag

然后创建一下工作目录

mkdir -p ./ragtest/input

创建知识库,这里我想测试一下中文的效果,再服务器上root/目录下创建rag.txt文件,粘贴如下信息:

Graph RAG是一种基于知识图谱的检索增强技术。通过构建图模型的知识表达,将实体和关系之间的联系用图的形式展示出来,然后利用大语言模型(LLM)进行检索增强。这种方法将知识图谱视为一个超大规模的词汇表,实体和关系则对应于单词,从而在检索时能够将实体和关系作为单元进行联合建模。
GraphRAG项目是微软团队的一项创新研究,旨在优化基于检索增强生成(RAG)的问答系统,尤其是针对整个文本语料库的全局性问题,如“数据集的主要主题是什么?”这种查询聚焦的总结任务。这种方法不仅适用于直接检索,还能应对大规模文本索引带来的挑战。

关键论文理论依据:《从局部到全局:一个基于图形的RAG方法用于查询聚焦的总结》

作者:Darren Edge, Ha Trinh, Newman Cheng, Joshua Bradley, Alex Chao, Apurva Mody, Steven Truitt, Jonathan Larson

所在机构:微软研究院、微软战略任务与技术部、微软首席技术官办公室

文中详细阐述了这一方案背后要解决的核心RAG准确率和传统图谱查询的问题:

传统的RAG方法在处理全局问题时表现不佳,例如询问整个文本数据集的主要主题。这类问题本质上是一种查询聚焦的总结任务(QFS),而现有的QFS方法无法扩展到典型RAG系统索引的大量文本中。因此,论文提出了一种结合两者优点的新方法,称为Graph RAG,以应对这一挑战。

使用检索增强生成 (RAG) 从外部知识源检索相关信息,使得大型语言模型 (LLM) 能够回答有 关私有和/或以前未见过的文档集合的问题。

然而,RAG 无法解决针对整个文本语料库的全局问题,例如“数据集中的主要主题是什么?”,因为这本质上是一个以查询为中心的摘要 (QFS) 任务,而不是明确的检索任务。

同时,之前的 QFS 方法 无法扩展到典型 RAG 系统索引的文本数量。

Graph RAG 的全局方法,结合了知识图谱生成,检索增强生成 (RAG) 和以查询为中心的摘要 (QFS),以支持人类
在整个文本语料库上进行语义建构。初步评估显示,与朴素 RAG 基线既包括答案的全面性,也包括答案的多样性,以及有利的与使用 mapreduce 源文本摘要的全局但无图方法进行比较。对于 在需要对同一数据集进行许多全局查询的情况下,基于实体的图形索引中的根级社区摘要提供了一种数据索引,它既优于 朴素 RAG,又以极低的token成本实现了与其他全局方法相媲美的性能。
何时使用 GraphRAG
它可以从检索前、检索后和即时压缩的角度解决上述 RAG 的一些局限性,考虑到知识图谱的检索和推理的背景。
图形检索专注于通过获取相关信息来增强上下文,而图形推理则适用于如何在 RAG 中遍历和搜索信息(例如分块和上下文输入)。
预检索可以利用知识图谱索引来获取相关文档。通过基于知识图谱中的节点和边对文档进行语义索引,它直接检索语义相关的文档。
该过程涉及考虑是否获取节点或子图。提取节点涉及将用户查询与分块节点进行比较以找到最相似的节点,并使用它们的连接路径作为查询语法。
然而,这种方法需要指定在路径中获取多少个节点,并且很大程度上依赖于用于创建知识图谱的信息提取模型,突出了模型性能的重要性。
此外,可变长度边 (VLE) 可用于获取相关信息,因此需要优化数据库以实现高效检索。数据库管理员和机器学习工程师参与的数据库设计和优化讨论对于提高性能至关重要。
子图涉及获取连接到相关节点的自我图,可能嵌入多个相关的自我图以将整体上下文与用户的查询进行比较。
由于所使用的嵌入技术不同,性能也存在差异,因此该方法需要进行各种图嵌入实验。
后检索涉及重新排序过程,该过程和谐地使用来自 RAG 和 GraphRAG 的值。通过利用来自 GraphRAG 的语义搜索值以及 RAG 的相似性搜索值,它可以生成上下文。GraphRAG 的值允许验证检索的语义基础,从而提高获取信息的准确性。
对 vectorDB 和 GraphDB 使用单个数据库允许在同一个数据库内进行语义(GraphRAG)和向量(RAG)索引,从而有助于验证检索准确性并改进不准确性。
提示压缩受益于提示工程期间的图形信息,例如决定将哪些块信息注入提示中。
图表可以根据查询上下文和文档之间的关系,在检索后仅返回相关信息。这样可以追踪不相关信息的来源,从而进行改进。
例如,如果产生了不适当的响应,则可以使用图形查询追溯到有问题的部分并立即纠正。
总体而言,GraphRAG 通过集成知识图谱技术来更好地检索信息、推理和生成上下文,从而提供了一种全面的方法来解决 RAG 的局限性,从而提高了生成的响应的准确性和相关性。

初始化工作目录

python -m graphrag.index --init --root ./ragtest

修改settings.yaml文件

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ollama
  type: openai_chat # or azure_openai_chat
  model: mistral-nemo
  model_supports_json: true # recommended if this is available for your model.
  #max_tokens: 10000
  #request_timeout: 210.0
  api_base: http://localhost:11434/v1/
  # api_version: 2024-02-15-preview
  # organization: <organization_id>
  # deployment_name: <azure_model_deployment_name>
  #tokens_per_minute: 150_000 # set a leaky bucket throttle
  #requests_per_minute: 10_000 # set a leaky bucket throttle
  # max_retries: 10
  # max_retry_wait: 10.0
  # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
  # concurrent_requests: 25 # the number of parallel inflight requests that may be made

parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: ollama
    type: openai_embedding # or azure_openai_embedding
    model: mxbai-embed-large
    api_base: http://localhost:11434/v1/
    # api_version: 2024-02-15-preview
    # organization: <organization_id>
    # deployment_name: <azure_model_deployment_name>
    # tokens_per_minute: 150_000 # set a leaky bucket throttle
    # requests_per_minute: 10_000 # set a leaky bucket throttle
    # max_retries: 10
    # max_retry_wait: 10.0
    # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
    # concurrent_requests: 25 # the number of parallel inflight requests that may be made
    # batch_size: 16 # the number of documents to send in a single request
    # batch_max_tokens: 8191 # the maximum number of tokens to send in a single request
    # target: required # or optional




chunks:
  size: 1200
  overlap: 100
  group_by_columns: [id] # by default, we don't allow chunks to cross documents
    
input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"

cache:
  type: file # or blob
  base_dir: "cache"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

storage:
  type: file # or blob
  base_dir: "output/${timestamp}/artifacts"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

reporting:
  type: file # or console, blob
  base_dir: "output/${timestamp}/reports"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

entity_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/entity_extraction.txt"
  entity_types: [organization,person,geo,event]
  max_gleanings: 1

summarize_descriptions:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/summarize_descriptions.txt"
  max_length: 500

claim_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  # enabled: true
  prompt: "prompts/claim_extraction.txt"
  description: "Any claims or facts that could be relevant to information discovery."
  max_gleanings: 1

community_reports:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/community_report.txt"
  max_length: 2000
  max_input_length: 8000

cluster_graph:
  max_cluster_size: 10

embed_graph:
  enabled: false # if true, will generate node2vec embeddings for nodes
  # num_walks: 10
  # walk_length: 40
  # window_size: 2
  # iterations: 3
  # random_seed: 597832

umap:
  enabled: false # if true, will generate UMAP embeddings for nodes

snapshots:
  graphml: false
  raw_entities: false
  top_level_nodes: false

local_search:
  # text_unit_prop: 0.5
  # community_prop: 0.1
  # conversation_history_max_turns: 5
  # top_k_mapped_entities: 10
  # top_k_relationships: 10
  # llm_temperature: 0 # temperature for sampling
  # llm_top_p: 1 # top-p sampling
  # llm_n: 1 # Number of completions to generate
  # max_tokens: 12000

global_search:
  # llm_temperature: 0 # temperature for sampling
  # llm_top_p: 1 # top-p sampling
  # llm_n: 1 # Number of completions to generate
  # max_tokens: 12000
  # data_max_tokens: 12000
  # map_max_tokens: 1000
  # reduce_max_tokens: 2000
  # concurrency: 32

之后需要修改原代码的几处地方,参考博客修改官方原始代码重要!

三、ollama下载需要的模型

ollama下载模型也很简单:
新建一个端口进入ollama虚拟环境,开启ollama serve:

ollama serve

再新建一个端口进入ollama虚拟环境,进行pull模型(总共需要三个端口):

ollama pull mistral-nemo
ollama pull mxbai-embed-large

pull的过程需要耐心等待,pull完可以输入ollama list查看模型服务,也可以通过ollama rm -modelname删除指定模型。
pull之后,serve的窗口不要关闭。

四、建立GraphRAG.index

基于上面的工作,可以一键建立graphRAG索引,过程比较慢,需要耐心等待20min。在graphrag环境中输入:

python -m graphrag.index --root ./ragtest

在这里插入图片描述
等待建立完成即可。
在这里插入图片描述
如果模型选择和博主保持一致的话应该不会出现问题,根据之前debug的经验,如果报错有几个地方需要注意:

  1. setting.yaml 模型名是否正确
  2. ollama serve是否正常
  3. 查看ragtest/output/(date)/reports/indexing-engine.log最后的报错看具体是什么问题。
  4. Columns must be same length as key

五、提问测试

有两种提问方法,分别是全局搜素和本地搜素,分别进行测试:

全局(global)搜索

python -m graphrag.query \
--root ./ragtest \
--method global \
"GraphRAG有什么优势?"

回答:

GraphRAG, a novel approach to information retrieval and generation, offers several advantages over traditional methods:

1. **Contextual Understanding**
   GraphRAG can generate more relevant and coherent responses by considering the context and relationships between data points [Data: Reports (1), (3)]. Unlike traditional retrieval methods that simply rank documents based on keyword matching, GraphRAG understands the semantic meaning of questions and the relationships between entities in its knowledge graph.

2. **Improved Language Model Performance**
   By providing structured data from a knowledge graph, GraphRAG can improve the performance of language models [Data: Reports (2)]. This allows the model to generate more factual and relevant responses, enhancing the overall quality of generated text.

3. **Handling Complex Queries**
   GraphRAG has the ability to handle complex queries and provide more accurate answers [Data: Report (4)]. It achieves this by understanding the semantic meaning of questions and leveraging the relationships between entities in its graph structure.

In summary, GraphRAG's strengths lie in its ability to understand context, improve language model performance, and handle complex queries effectively. These advantages make it a powerful tool for information retrieval and generation tasks.

本地搜索

python -m graphrag.query \
--root ./ragtest \
--method local \
"GraphRAG全称是什么?"

回答

Graph Retrieval-Augmented Generation,或简称为GraphRAG。它是一种技术,将知识图谱技术集成到检索增强生成(Retrieval-Augmented Generation,RAG)系统中,以改善信息检索、推理和上下文生成的准确性和相关性。

**GraphRAG的作用:**

GraphRAG通过集成知识图谱技术来更好地检索信息、推理和生成上下文,从而提供了一种全面的方法来解决RAG的局限性。它可以在检索后仅返回相关信息,追踪不相关信息的来源,并进行改进。例如,如果产生了不适当的响应,则可以使用图形查询追溯到有问题的部分并立即纠正。

**数据支持:**

- 实体表(Entities):GraphRAG(0),Retrieval-Augmented Generation(1),Knowledge Graph Techniques(2- 关系表(Relationships):GRAPHRAG与RETRIEVAL-AUGMENTED GENERATION的关系(0),GRAPHRAG与KNOWLEDGE GRAPH TECHNIQUES的关系(1- 源表(Sources):信息注入提示中的文本(0

在这里插入图片描述
至此使用ollama本地部署GraphRAG成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

完整搭建windows下mysql8.0源码编译调试环境!

背景&#xff1a; 前段时间一直在看mysql相关的博客&#xff0c;所以对源码起了浓厚的兴趣&#xff0c;所以尝试通过vmware和vscode在windosw环境中搭建一套编译调试的环境~ 看了一下网上的搭建教程基本杂乱无章&#xff0c;想要从零跟着搭建出一个完善的调试环境也不是易事&…

redis I/O复用机制

I/O复用模型 传统阻塞I/O模型 串行化处理&#xff0c;就是要等&#xff0c;假如进行到accept操作&#xff0c;cpu需要等待客户端发送的数据到tcp接收缓冲区才能进行read操作&#xff0c;而在此期间cpu不能执行任何操作。 I/O复用 用一个进程监听大量连接&#xff0c;当某个连…

国产大模型领域跳槽:收入潜力解析

夏尽秋来&#xff0c;2024年国产大模型看似喧闹已止&#xff0c;进入稳定竞争期。 作为一种新的IT解决方案&#xff0c;国产大模型一出生便伴随着激烈竞争。 外有GPT4&#xff0c;内有多家公司角逐“中国版ChatGPT”。 据我所知&#xff0c;就国内某家头部大模型创业公司的收…

0817(持久层框架:JDBC,MyBatis)

三层架构&#xff08;表现层&#xff0c;业务层&#xff0c;持久层&#xff09; java中框架的概述&#xff08;表现层、业务层、持久层的关系&#xff09;_控制层业务层持久层的关系-CSDN博客 框架&#xff1a;框架一般处在低层应用平台&#xff08;如J2EE&#xff09;和高层…

利用keepalived达成服务高可用

官方网站Keepalived for Linux 1.keepalived简介 vrrp 协议的软件实现&#xff0c;原生设计目的为了 高可用 ipvs 服务 功能&#xff1a; 基于 vrrp 协议完成地址流动 为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 ) 为 ipvs 集群的各 RS 做健康状态检测 …

【Linux网络】NAT技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 随着互联网的飞速发展&#xff0c;IP地址资源日益紧张&#xff0c;这促使了NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术的诞生与发展。NAT技术不仅解决了IPv4…

webshell免杀--免杀入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理webshell免杀的一些基础思路 入门级&#xff0c;不是很深入&#xff0c;主要是整理相关概念 免杀对象 1.各类杀毒软件 类似360&#xff0c;火绒等&#xff0c;查杀己方webshell的软件。 2.各类流量…

计算机网络系统速成

Http与Https Http与Https是两种重要的网络通信协议&#xff0c;它们在Web通信中扮演着关键角色。以下是对Http与Https的详细解析&#xff1a; 一、Http&#xff08;超文本传输协议&#xff09; 1. 定义与功能 定义&#xff1a;Http&#xff08;HyperText Transfer Protocol…

打卡学习Python爬虫第三天|电影天堂案例

一、明确需求 目标&#xff1a;爬取最新更新的电影的豆瓣链接 观察网页和页面源代码&#xff0c;每部电影都有一个超链接去到子页面&#xff0c;我们需要的内容在子页面&#xff0c;如果我们一个一个子页面的去爬取会比较麻烦&#xff0c;可以尝试先通过首页爬取子页面的超链…

指针初阶(指针类型转换的使用、指针数组)

一.指针基础 0.指针的大小 指针指向的是一块地址&#xff0c;所以指针存储的是地址&#xff0c;例如在32位系统中。定义了一个int32_t类型的变量。使用int32_t *定义一个指针&#xff0c;使其指向该变量。 设该变量存储在地址为00000000000000000000000000000001&#xff08;3…

远程调用-OpenFeign(一)

目录 1.RestTemplate存在问题 2.OpenFeign介绍 一、主要特点 二、应用场景 3.OpenFeign快速上手 3.1引入依赖 3.2添加注解 3.3编写OpenFeign的客户端 3.4远程调用 ​编辑3.5测试 4.OpenFeign参数传递 4.1传递单个参数 4.2传递多个参数 4.3传递对象 4.4传递JSO…

编程修炼之Hibernate--- springboot启动初始化ddl过程

文章目录 跟踪Springboot整合hibernate的启动代码&#xff1a; 开始初始化 entityManagerFactory 创建方言 dialect 继续排查

Koa商城项目-轮播图模块(后端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 后端逻辑分析 首先编写route->banner.router.js /*** author: zxb* date: 2024-08-06…

Socket编程TCP 基础

一.什么是Socket(套接字&#xff09; 定义&#xff1a;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#x…

【文献阅读】A Comprehensive Review of Multimodal Large Language Models

一、回顾 MLLMs 在语言、图像、视频和音频处理等多模态任务中表现出色。这些模型通过整合多模态信息来增强多模态任务的有效性。 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;如文本生成和机器翻译&#xff0c;MLLMs 利用图像、视频和音频提供上下文支持&am…

C#开发实验--卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例

前不久在公众号GIS研发看到了暑假公益C#开发教程&#xff0c;教大家ArcGIS Engine开发。 想到了自己本科阶段也学习了C#开发和AE开发&#xff0c;学习了使用C#添加空间等&#xff0c;进行卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例。 下面的…

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…