From 00bbd902b84b233d455557c5c5738acc8c9d9b1f Mon Sep 17 00:00:00 2001 From: "Ziwei.He" <954980583@qq.com> Date: Sun, 29 Jun 2025 23:59:06 -0700 Subject: [PATCH] =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CoreRAG/MassageAcupointRAG.py | 14 +-- .../MassageAcupointRAG.cpython-38.pyc | Bin 0 -> 3301 bytes .../custom_rag_processor.cpython-38.pyc | Bin 0 -> 11529 bytes CoreRAG/custom_rag_processor.py | 15 ++-- .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 318 bytes .../lightrag/__pycache__/base.cpython-38.pyc | Bin 0 -> 21703 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 660 bytes .../__pycache__/lightrag.cpython-38.pyc | Bin 0 -> 49803 bytes .../__pycache__/namespace.cpython-38.pyc | Bin 0 -> 1268 bytes .../__pycache__/operate.cpython-38.pyc | Bin 0 -> 42354 bytes .../__pycache__/prompt.cpython-38.pyc | Bin 0 -> 23445 bytes .../lightrag/__pycache__/types.cpython-38.pyc | Bin 0 -> 1329 bytes .../lightrag/__pycache__/utils.cpython-38.pyc | Bin 0 -> 44764 bytes CoreRAG/lightrag/base.py | 82 +++++++++--------- CoreRAG/lightrag/kg/__init__.py | 4 +- .../kg/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2561 bytes .../__pycache__/json_kv_impl.cpython-38.pyc | Bin 0 -> 7428 bytes .../nano_vector_db_impl.cpython-38.pyc | Bin 0 -> 10339 bytes .../__pycache__/networkx_impl.cpython-38.pyc | Bin 0 -> 12102 bytes .../__pycache__/shared_storage.cpython-38.pyc | Bin 0 -> 13325 bytes CoreRAG/lightrag/kg/json_kv_impl.py | 24 ++--- CoreRAG/lightrag/kg/nano_vector_db_impl.py | 8 +- CoreRAG/lightrag/kg/networkx_impl.py | 26 +++--- CoreRAG/lightrag/lightrag.py | 13 ++- CoreRAG/lightrag/types.py | 16 ++-- CoreRAG/lightrag/utils.py | 6 +- end2end.py | 2 +- scripts/APF_global_demo.py | 6 +- .../APF_global_demo.cpython-38.pyc | Bin 0 -> 11164 bytes scripts/__pycache__/planner.cpython-38.pyc | Bin 0 -> 8551 bytes scripts/__pycache__/sorter.cpython-38.pyc | Bin 0 -> 4962 bytes scripts/planner.py | 3 + scripts/sorter.py | 7 +- 33 files changed, 116 insertions(+), 110 deletions(-) create mode 100644 CoreRAG/__pycache__/MassageAcupointRAG.cpython-38.pyc create mode 100644 CoreRAG/__pycache__/custom_rag_processor.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/__init__.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/base.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/constants.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/lightrag.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/namespace.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/operate.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/prompt.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/types.cpython-38.pyc create mode 100644 CoreRAG/lightrag/__pycache__/utils.cpython-38.pyc create mode 100644 CoreRAG/lightrag/kg/__pycache__/__init__.cpython-38.pyc create mode 100644 CoreRAG/lightrag/kg/__pycache__/json_kv_impl.cpython-38.pyc create mode 100644 CoreRAG/lightrag/kg/__pycache__/nano_vector_db_impl.cpython-38.pyc create mode 100644 CoreRAG/lightrag/kg/__pycache__/networkx_impl.cpython-38.pyc create mode 100644 CoreRAG/lightrag/kg/__pycache__/shared_storage.cpython-38.pyc create mode 100644 scripts/__pycache__/APF_global_demo.cpython-38.pyc create mode 100644 scripts/__pycache__/planner.cpython-38.pyc create mode 100644 scripts/__pycache__/sorter.cpython-38.pyc diff --git a/CoreRAG/MassageAcupointRAG.py b/CoreRAG/MassageAcupointRAG.py index 554995e..15d3be1 100644 --- a/CoreRAG/MassageAcupointRAG.py +++ b/CoreRAG/MassageAcupointRAG.py @@ -1,10 +1,10 @@ import asyncio import numpy as np import re -from lightrag import LightRAG -from lightrag.base import QueryParam -from custom_rag_processor import QwenEmbedding, DeepSeekCompletion - +from CoreRAG.lightrag.lightrag import LightRAG +from CoreRAG.lightrag.base import QueryParam +from CoreRAG.custom_rag_processor import QwenEmbedding, DeepSeekCompletion +from typing import List,Tuple class MassageAcupointRAG: def __init__(self, working_dir: str): self.working_dir = working_dir @@ -16,7 +16,7 @@ class MassageAcupointRAG: ) @staticmethod - async def async_embed(texts: list[str]) -> np.ndarray: + async def async_embed(texts: List[str]) -> np.ndarray: async with QwenEmbedding() as embedder: return await embedder.embed(texts) @@ -26,7 +26,7 @@ class MassageAcupointRAG: return await completer.complete(prompt, **kwargs) @staticmethod - def extract_acupoint_list(text: str) -> list[str]: + def extract_acupoint_list(text: str) -> List[str]: """ 从 LLM 返回文本中提取穴位名称列表(形如 ['肩井穴', ...]) """ @@ -39,7 +39,7 @@ class MassageAcupointRAG: async def initialize(self): await self.rag.initialize_storages() - async def query_acupoints(self, user_query: str) -> tuple[str, list[str]]: + async def query_acupoints(self, user_query: str) -> Tuple[str, List[str]]: """ 执行 RAG 查询并提取穴位列表 diff --git a/CoreRAG/__pycache__/MassageAcupointRAG.cpython-38.pyc b/CoreRAG/__pycache__/MassageAcupointRAG.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6bc7f7b8fa259c705cc748fdcf46ae30ca221f5 GIT binary patch literal 3301 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 literal 0 HcmV?d00001 diff --git a/CoreRAG/custom_rag_processor.py b/CoreRAG/custom_rag_processor.py index 563f970..7bd2353 100644 --- a/CoreRAG/custom_rag_processor.py +++ b/CoreRAG/custom_rag_processor.py @@ -4,10 +4,11 @@ import logging import logging.config import aiohttp import numpy as np -from lightrag import LightRAG, QueryParam -from lightrag.kg.shared_storage import initialize_pipeline_status -from lightrag.utils import logger, set_verbose_debug +from CoreRAG.lightrag import LightRAG, QueryParam +from CoreRAG.lightrag.kg.shared_storage import initialize_pipeline_status +from CoreRAG.lightrag.utils import logger, set_verbose_debug import tiktoken +from typing import List WORKING_DIR = "./dickens" # API配置 @@ -33,7 +34,7 @@ class QwenEmbedding: if self.session: await self.session.close() - async def embed(self, texts: list[str]) -> np.ndarray: + async def embed(self, texts: List[str]) -> np.ndarray: """自动分批请求嵌入""" if not self.session: raise RuntimeError("Session not initialized. Use async with.") @@ -114,7 +115,7 @@ class TextChunker: self.max_tokens = max_tokens self.overlap = overlap - def chunk_text(self, text: str) -> list[str]: + def chunk_text(self, text: str) -> List[str]: """将长文本按token分块""" tokens = self.tokenizer.encode(text) chunks = [] @@ -193,7 +194,7 @@ if not os.path.exists(WORKING_DIR): os.mkdir(WORKING_DIR) -async def Qwen_embed(texts: list[str]) -> np.ndarray: +async def Qwen_embed(texts: List[str]) -> np.ndarray: async with QwenEmbedding() as embedder: return await embedder.embed(texts) Qwen_embed.embedding_dim = 1024 @@ -303,7 +304,7 @@ class CustomRAGProcessor: await initialize_pipeline_status() return rag - async def qwen_embed_wrapper(self, texts: list[str]) -> np.ndarray: + async def qwen_embed_wrapper(self, texts: List[str]) -> np.ndarray: """Qwen嵌入函数包装器,带重试机制""" async with QwenEmbedding(self.qwen_api_key) as embedder: return await embedder.embed(texts) diff --git a/CoreRAG/lightrag/__pycache__/__init__.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53bc568cae37e82f8792326bcc2f5a57f26b6e9c GIT binary patch literal 318 zcmYjM!Ait15KXdet(65oVLkTJAYMckaZy}BSyq?5^I!C;jqENz0D;gtz-%*4ZZ0`Oj%Ug{QL%mBEvwKf3k2*8;J;1ii7r~~}W zX{}XB2e~UH-SyNbgT?wDx`wx{Y%6-JP3f2PaESuQR$73f+mGp7Y2ljkI(*j$!&4IB G2>$`h*j2Fr literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/base.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/base.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa0ef0c6652fd7ecedbbd4e3d83068d30fac6b78 GIT binary patch literal 21703 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 literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/lightrag.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/lightrag.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..491090d1d1e0240637e05b2258c25cf0273c2017 GIT binary patch literal 49803 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 F|3B=c5|97@ literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/namespace.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/namespace.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab42a04146758f024401b6fee000410b56fede6e GIT binary patch literal 1268 zcmZWpUr*aG5VxIB(oiZin6|M$fV7uR6P>hIhE|mT-MWC9g0@V^%3?z!(zLTv@kiZL zk;aGE!}iEm^6Q@V2`24jJEx@-%~ssI^Z9qb^PRglJ8L5t?%$yGn;`U4E0eAY{!>h_-d)>9A1)_VONZ8+ZU zj_WzJTB&Y3>h8W%1(Xq#<2Gx}n&YX(TjqvSuQY3LYP+`Usrg%bqaZ6=jmqx!2qv@9 z4D16093ECSa0G`+bI-d%;vN(wTmHN%w>oWJK95d#R6ddAMrDgub~kA^hDt}tQMuX? z9E{~SI%=gNI4bKakh(al-7{eVP!2vh2aAPGJ;`V#*{(8VDz1pibp=0+PF3+!02Ld9 zgwV$0p=JG5b>mnd^idz*Lms-q?vV2$7;o5%`=F{~J2;*|TmYNQP_cLd^7%XvSne-h zx9Uew4}eg9%t1T?xBrOf)Zjf~`3!^Lo?A(FEy0r+eZg;UvP>p0dhe05k{X0gB-knZ=>L4au-}%xc!0KAu34>U!ua3P-rm`a$CD8Io$i)LV zr{4~fCsEo`Mv$C|rE#RETGHXf3M^WXy50!eFf*H5n$|Dnu$T4(ycD4mR=M=73*961 jA5zu^St&CAiSlJ_nB`)v4PV;2zPhaR1yV4I#X0jIG%h{h literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/operate.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/operate.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2048793825754d17080061f9713ede0e7b174ce7 GIT binary patch literal 42354 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�i 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 BxzYdt literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/prompt.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/prompt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbe5fa8d0335c381636de7a47ec664d2e8c48dd2 GIT binary patch literal 23445 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 F{{_1m literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/__pycache__/utils.cpython-38.pyc b/CoreRAG/lightrag/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db7779ac67bc1a208db48e0cfb85cc593f1587e5 GIT binary patch literal 44764 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 De{{a1 literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/base.py b/CoreRAG/lightrag/base.py index c6035f7..a45c753 100644 --- a/CoreRAG/lightrag/base.py +++ b/CoreRAG/lightrag/base.py @@ -1,5 +1,5 @@ from __future__ import annotations - +from typing import List, Union, Callable, Dict, Tuple from abc import ABC, abstractmethod from enum import Enum import os @@ -70,13 +70,13 @@ class QueryParam: max_token_for_local_context: int = int(os.getenv("MAX_TOKEN_ENTITY_DESC", "4000")) """Maximum number of tokens allocated for entity descriptions in local retrieval.""" - hl_keywords: list[str] = field(default_factory=list) + hl_keywords: List[str] = field(default_factory=list) """List of high-level keywords to prioritize in retrieval.""" - ll_keywords: list[str] = field(default_factory=list) + ll_keywords: List[str] = field(default_factory=list) """List of low-level keywords to refine retrieval focus.""" - conversation_history: list[dict[str, str]] = field(default_factory=list) + conversation_history: List[Dict[str, str]] = field(default_factory=list) """Stores past conversation history to maintain context. Format: [{"role": "user/assistant", "content": "message"}]. """ @@ -84,16 +84,16 @@ class QueryParam: history_turns: int = 3 """Number of complete conversation turns (user-assistant pairs) to consider in the response context.""" - ids: list[str] | None = None + ids: Union[List[str], None] = None """List of ids to filter the results.""" - model_func: Callable[..., object] | None = None + model_func: Union[Callable[..., object], None] = None """Optional override for the LLM model function to use for this specific query. If provided, this will be used instead of the global model function. This allows using different models for different query modes. """ - user_prompt: str | None = None + user_prompt: Union[str,None] = None """User-provided prompt for the query. If proivded, this will be use instead of the default vaulue from prompt template. """ @@ -102,7 +102,7 @@ class QueryParam: @dataclass class StorageNameSpace(ABC): namespace: str - global_config: dict[str, Any] + global_config: Dict[str, Any] async def initialize(self): """Initialize the storage""" @@ -117,7 +117,7 @@ class StorageNameSpace(ABC): """Commit the storage operations after indexing""" @abstractmethod - async def drop(self) -> dict[str, str]: + async def drop(self) -> Dict[str, str]: """Drop all data from storage and clean up resources This abstract method defines the contract for dropping all data from a storage implementation. @@ -151,12 +151,12 @@ class BaseVectorStorage(StorageNameSpace, ABC): @abstractmethod async def query( - self, query: str, top_k: int, ids: list[str] | None = None - ) -> list[dict[str, Any]]: + self, query: str, top_k: int, ids: Union[List[str],None] = None + ) -> List[Dict[str, Any]]: """Query the vector storage and retrieve top_k results.""" @abstractmethod - async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + async def upsert(self, data: Dict[str, Dict[str, Any]]) -> None: """Insert or update vectors in the storage. Importance notes for in-memory storage: @@ -186,7 +186,7 @@ class BaseVectorStorage(StorageNameSpace, ABC): """ @abstractmethod - async def get_by_id(self, id: str) -> dict[str, Any] | None: + async def get_by_id(self, id: str) -> Union[Dict[str, Any],None]: """Get vector data by its ID Args: @@ -198,7 +198,7 @@ class BaseVectorStorage(StorageNameSpace, ABC): pass @abstractmethod - async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + async def get_by_ids(self, ids: List[str]) -> List[Dict[str, Any]]: """Get multiple vector data by their IDs Args: @@ -210,7 +210,7 @@ class BaseVectorStorage(StorageNameSpace, ABC): pass @abstractmethod - async def delete(self, ids: list[str]): + async def delete(self, ids: List[str]): """Delete vectors with specified IDs Importance notes for in-memory storage: @@ -228,11 +228,11 @@ class BaseKVStorage(StorageNameSpace, ABC): embedding_func: EmbeddingFunc @abstractmethod - async def get_by_id(self, id: str) -> dict[str, Any] | None: + async def get_by_id(self, id: str) -> Union[Dict[str, Any],None]: """Get value by id""" @abstractmethod - async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + async def get_by_ids(self, ids: List[str]) -> List[Dict[str, Any]]: """Get values by ids""" @abstractmethod @@ -249,7 +249,7 @@ class BaseKVStorage(StorageNameSpace, ABC): """ @abstractmethod - async def delete(self, ids: list[str]) -> None: + async def delete(self, ids: List[str]) -> None: """Delete specific records from storage by their IDs Importance notes for in-memory storage: @@ -263,7 +263,7 @@ class BaseKVStorage(StorageNameSpace, ABC): None """ - async def drop_cache_by_modes(self, modes: list[str] | None = None) -> bool: + async def drop_cache_by_modes(self, modes: Union[List[str],None] = None) -> bool: """Delete specific records from storage by cache mode Importance notes for in-memory storage: @@ -330,7 +330,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): """ @abstractmethod - async def get_node(self, node_id: str) -> dict[str, str] | None: + async def get_node(self, node_id: str) -> Union[Dict[str, str],None]: """Get node by its ID, returning only node properties. Args: @@ -343,7 +343,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): @abstractmethod async def get_edge( self, source_node_id: str, target_node_id: str - ) -> dict[str, str] | None: + ) -> Union[Dict[str, str],None]: """Get edge properties between two nodes. Args: @@ -355,7 +355,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): """ @abstractmethod - async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + async def get_node_edges(self, source_node_id: str) -> Union[List[Tuple[str, str]],None]: """Get all edges connected to a node. Args: @@ -366,7 +366,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): or None if the node doesn't exist """ - async def get_nodes_batch(self, node_ids: list[str]) -> dict[str, dict]: + async def get_nodes_batch(self, node_ids: List[str]) -> Dict[str, Dict]: """Get nodes as a batch using UNWIND Default implementation fetches nodes one by one. @@ -380,7 +380,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): result[node_id] = node return result - async def node_degrees_batch(self, node_ids: list[str]) -> dict[str, int]: + async def node_degrees_batch(self, node_ids: List[str]) -> Dict[str, int]: """Node degrees as a batch using UNWIND Default implementation fetches node degrees one by one. @@ -394,8 +394,8 @@ class BaseGraphStorage(StorageNameSpace, ABC): return result async def edge_degrees_batch( - self, edge_pairs: list[tuple[str, str]] - ) -> dict[tuple[str, str], int]: + self, edge_pairs: List[Tuple[str, str]] + ) -> Dict[Tuple[str, str], int]: """Edge degrees as a batch using UNWIND also uses node_degrees_batch Default implementation calculates edge degrees one by one. @@ -409,8 +409,8 @@ class BaseGraphStorage(StorageNameSpace, ABC): return result async def get_edges_batch( - self, pairs: list[dict[str, str]] - ) -> dict[tuple[str, str], dict]: + self, pairs: List[Dict[str, str]] + ) -> Dict[Tuple[str, str], Dict]: """Get edges as a batch using UNWIND Default implementation fetches edges one by one. @@ -427,8 +427,8 @@ class BaseGraphStorage(StorageNameSpace, ABC): return result async def get_nodes_edges_batch( - self, node_ids: list[str] - ) -> dict[str, list[tuple[str, str]]]: + self, node_ids: List[str] + ) -> Dict[str, List[Tuple[str, str]]]: """Get nodes edges as a batch using UNWIND Default implementation fetches node edges one by one. @@ -442,7 +442,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): return result @abstractmethod - async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + async def upsert_node(self, node_id: str, node_data: Dict[str, str]) -> None: """Insert a new node or update an existing node in the graph. Importance notes for in-memory storage: @@ -457,7 +457,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): @abstractmethod async def upsert_edge( - self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + self, source_node_id: str, target_node_id: str, edge_data: Dict[str, str] ) -> None: """Insert a new edge or update an existing edge in the graph. @@ -486,7 +486,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): """ @abstractmethod - async def remove_nodes(self, nodes: list[str]): + async def remove_nodes(self, nodes: List[str]): """Delete multiple nodes Importance notes: @@ -499,7 +499,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): """ @abstractmethod - async def remove_edges(self, edges: list[tuple[str, str]]): + async def remove_edges(self, edges: List[Tuple[str, str]]): """Delete multiple edges Importance notes: @@ -512,7 +512,7 @@ class BaseGraphStorage(StorageNameSpace, ABC): """ @abstractmethod - async def get_all_labels(self) -> list[str]: + async def get_all_labels(self) -> List[str]: """Get all labels in the graph. Returns: @@ -564,11 +564,11 @@ class DocProcessingStatus: """ISO format timestamp when document was created""" updated_at: str """ISO format timestamp when document was last updated""" - chunks_count: int | None = None + chunks_count: Union[int,None] = None """Number of chunks after splitting, used for processing""" - error: str | None = None + error: Union[str,None] = None """Error message if failed""" - metadata: dict[str, Any] = field(default_factory=dict) + metadata: Dict[str, Any] = field(default_factory=Dict) """Additional metadata""" @@ -577,16 +577,16 @@ class DocStatusStorage(BaseKVStorage, ABC): """Base class for document status storage""" @abstractmethod - async def get_status_counts(self) -> dict[str, int]: + async def get_status_counts(self) -> Dict[str, int]: """Get counts of documents in each status""" @abstractmethod async def get_docs_by_status( self, status: DocStatus - ) -> dict[str, DocProcessingStatus]: + ) -> Dict[str, DocProcessingStatus]: """Get all documents with a specific status""" - async def drop_cache_by_modes(self, modes: list[str] | None = None) -> bool: + async def drop_cache_by_modes(self, modes: Union[List[str],None] = None) -> bool: """Drop cache is not supported for Doc Status storage""" return False diff --git a/CoreRAG/lightrag/kg/__init__.py b/CoreRAG/lightrag/kg/__init__.py index bbddb28..1cc4973 100644 --- a/CoreRAG/lightrag/kg/__init__.py +++ b/CoreRAG/lightrag/kg/__init__.py @@ -1,3 +1,5 @@ +from typing import List +from typing import Dict STORAGE_IMPLEMENTATIONS = { "KV_STORAGE": { "implementations": [ @@ -45,7 +47,7 @@ STORAGE_IMPLEMENTATIONS = { } # Storage implementation environment variable without default value -STORAGE_ENV_REQUIREMENTS: dict[str, list[str]] = { +STORAGE_ENV_REQUIREMENTS: Dict[str, List[str]] = { # KV Storage Implementations "JsonKVStorage": [], "MongoKVStorage": [], diff --git a/CoreRAG/lightrag/kg/__pycache__/__init__.cpython-38.pyc b/CoreRAG/lightrag/kg/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56d7bde7c3e6bd2c5181eab1b0db1d2fdf79a362 GIT binary patch literal 2561 zcmaJ?ZFAd15SC>5C5~V6-Xx_(O-oz1C8iK4gbv`ws!7{8uH_iUUo?*QBCD|__arC8 z6TSfdqA3F(`AZu3#HaoM-a0U_cam%;nL!#qzTMkh?LN16x06mM1$>OiZu^fJLHLyk ziG4(vS%> zS(t)pn1NZCgLxwk3q#urun0?NyKIQu_u`4%h!}z)z#FK!1ef7W17%R)3as$aRk#Lk zp~rBJTMs3;Zir_zH%?|7GLcA>h$Ols>`6-kiNVeL0_5Np+=e^wHmpKEc;A7$@GidZ zaa@D<;RE!KqjwbU!G|Xi_z2d&lN$-RrwO@_UoqBlq9;Ew9hdzV&6ew>A33)5xURW2 zZ5qVOR0){QNS>^eMnY!GwhVhDPZ-42caL-vyjZ{I5bEY6FKc#t9nvM1+jLFaavD>V zJnx&7fZio;+XlzWmWg|4)BP{QucpexUV9WunM$cdo4s}@Px`TS%Ld|w0s+i+w%oMr zI%#3@#RsAJ{Fd1{=sV}s8*OTLn`hP8O37D+?sE^DrgPr=DbS|np7oyNjGWa*pZ5tp z^5z(|MZ2XT6MZL)KT|24)6MfR=hQQdU$9#aBiZ3mazKssC+&Y zGj(+XXNK}jaeD)WLTyJ2b&ZLtTHMt1o$6*IUD?)ZrK*aOrdAu%L$OlOv@f=+#W7W} zP%AtrXli4ktZuJ8;{KUnh|cB0mf8s9p?4Nj)Q3Tf4;s^_6#S#}r&L4N<*5WH#5-l>*JV$^_enr4Pm45k_286wbG2JGaZ^9&XkEHYSP zu#Dg>1{~{Zxvp2$r#qWfbxSSRw88Z1zOicgE&P?v+I=v^RL^j^_5A~1bAcOSd+G0=T0Si_G+c+Oj$E0BB6GhYDCA!muv?z71kh4Dod2AoK~Mx188P@L;4Y?iMC zXLv|`IT!I#j(_;*?op47B&*paUW^jAPpy`O{^1kB0lO16@aI$!js;iPkJANL1o2pS zA-t5n6~7T()GrBNOUL4|1bC97MHww3$KneCWM;?igC8V+_D9sdj4?lm<7t^_-oxvp zPN=zeq?mh3kfL(>a8pc2Y1!Q#o^-n%q8yrTTXA}%W$u{-hCZyUWKzMWKn-V|kC-%G z_PP?ZtHP|6o1;B`M>(~}72>v5bLV0(vPLn^WXUG|1gf~yWGsbxv(qOkr8ZqxHvg|m z(;BPOrb-uE#8zZ7mdpb&!V(|m%j>6jMLb!1^w<=HgmMzpax67KB998Sd&ur7mMd($`h+acz z47<>@_UxYonnUI5PxEcNOY#HrkeK;HCy$4&UZ_0Od!43bVg30Hn-Wy!JEqZg@dnNB z8+lzfEz{NY)!vbJ>43Ko?sI;>@=Z0m99{f|lR*%Y2{9uj#FQwBm;a@=QInhSV%Q7# z5z3mMvaYAs8LS|95yz!oR@X5PJGg0e-Ae?uYdi$6VGM3D$He`v4gC)J1p8ZXzDJOR zl$eqw{4~CQOYzvBa*B`tktSll%b8%tpZ`lr#(tBt!F*JHE&m+5%OqJ!NRpTkrAROr g5B_8PAB#g9QSxnmS-#1&e#~(U^FTX%U&Su|2diA-asU7T literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/kg/__pycache__/json_kv_impl.cpython-38.pyc b/CoreRAG/lightrag/kg/__pycache__/json_kv_impl.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5a39cfd2faf62a8a35ec4a4dd298ee453b161d3 GIT binary patch literal 7428 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 NW5!JG>59&D_8%38DZBsx literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/kg/__pycache__/nano_vector_db_impl.cpython-38.pyc b/CoreRAG/lightrag/kg/__pycache__/nano_vector_db_impl.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46af5456444dae208529a4aa97350f4ae94ad0d8 GIT binary patch literal 10339 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 literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/kg/__pycache__/networkx_impl.cpython-38.pyc b/CoreRAG/lightrag/kg/__pycache__/networkx_impl.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4db10820a69675a4dd385da1a9ebdc28c7d7ea10 GIT binary patch literal 12102 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 literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/kg/__pycache__/shared_storage.cpython-38.pyc b/CoreRAG/lightrag/kg/__pycache__/shared_storage.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b6f4e5c25f2cc95a7291e79e3e844a1e76598c3 GIT binary patch literal 13325 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 RhpG=(@jEy>H9Ncie*tk%L&*RD literal 0 HcmV?d00001 diff --git a/CoreRAG/lightrag/kg/json_kv_impl.py b/CoreRAG/lightrag/kg/json_kv_impl.py index 2d44ce0..3fc9a0d 100644 --- a/CoreRAG/lightrag/kg/json_kv_impl.py +++ b/CoreRAG/lightrag/kg/json_kv_impl.py @@ -1,11 +1,11 @@ import os from dataclasses import dataclass -from typing import Any, final +from typing import Any, final,Dict,List,Union,Set -from lightrag.base import ( +from ..base import ( BaseKVStorage, ) -from lightrag.utils import ( +from ..utils import ( load_json, logger, write_json, @@ -85,7 +85,7 @@ class JsonKVStorage(BaseKVStorage): write_json(data_dict, self._file_name) await clear_all_update_flags(self.namespace) - async def get_all(self) -> dict[str, Any]: + async def get_all(self) -> Dict[str, Any]: """Get all data from storage Returns: @@ -94,11 +94,11 @@ class JsonKVStorage(BaseKVStorage): async with self._storage_lock: return dict(self._data) - async def get_by_id(self, id: str) -> dict[str, Any] | None: + async def get_by_id(self, id: str) -> Union[Dict[str, Any] , None]: async with self._storage_lock: return self._data.get(id) - async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + async def get_by_ids(self, ids: List[str]) -> List[Dict[str, Any]]: async with self._storage_lock: return [ ( @@ -109,11 +109,11 @@ class JsonKVStorage(BaseKVStorage): for id in ids ] - async def filter_keys(self, keys: set[str]) -> set[str]: + async def filter_keys(self, keys: Set[str]) -> Set[str]: async with self._storage_lock: - return set(keys) - set(self._data.keys()) + return Set(keys) - Set(self._data.keys()) - async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + async def upsert(self, data: Dict[str, Dict[str, Any]]) -> None: """ Importance notes for in-memory storage: 1. Changes will be persisted to disk during the next index_done_callback @@ -126,7 +126,7 @@ class JsonKVStorage(BaseKVStorage): self._data.update(data) await set_all_update_flags(self.namespace) - async def delete(self, ids: list[str]) -> None: + async def delete(self, ids: List[str]) -> None: """Delete specific records from storage by their IDs Importance notes for in-memory storage: @@ -149,7 +149,7 @@ class JsonKVStorage(BaseKVStorage): if any_deleted: await set_all_update_flags(self.namespace) - async def drop_cache_by_modes(self, modes: list[str] | None = None) -> bool: + async def drop_cache_by_modes(self, modes: Union[List[str] , None] = None) -> bool: """Delete specific records from storage by by cache mode Importance notes for in-memory storage: @@ -172,7 +172,7 @@ class JsonKVStorage(BaseKVStorage): except Exception: return False - async def drop(self) -> dict[str, str]: + async def drop(self) -> Dict[str, str]: """Drop all data from storage and clean up resources This action will persistent the data to disk immediately. diff --git a/CoreRAG/lightrag/kg/nano_vector_db_impl.py b/CoreRAG/lightrag/kg/nano_vector_db_impl.py index fa56a21..7ee4d49 100644 --- a/CoreRAG/lightrag/kg/nano_vector_db_impl.py +++ b/CoreRAG/lightrag/kg/nano_vector_db_impl.py @@ -5,15 +5,15 @@ from dataclasses import dataclass import numpy as np import time -from lightrag.utils import ( +from ..utils import ( logger, compute_mdhash_id, ) import pipmaster as pm -from lightrag.base import BaseVectorStorage +from ..base import BaseVectorStorage -if not pm.is_installed("nano-vectordb"): - pm.install("nano-vectordb") +# if not pm.is_installed("nano-vectordb"): +# pm.install("nano-vectordb") from nano_vectordb import NanoVectorDB from .shared_storage import ( diff --git a/CoreRAG/lightrag/kg/networkx_impl.py b/CoreRAG/lightrag/kg/networkx_impl.py index c92bbd3..e61f575 100644 --- a/CoreRAG/lightrag/kg/networkx_impl.py +++ b/CoreRAG/lightrag/kg/networkx_impl.py @@ -1,10 +1,10 @@ import os from dataclasses import dataclass -from typing import final +from typing import final,Dict,List,Union,Tuple -from lightrag.types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge -from lightrag.utils import logger -from lightrag.base import BaseGraphStorage +from ..types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge +from ..utils import logger +from ..base import BaseGraphStorage import pipmaster as pm @@ -98,7 +98,7 @@ class NetworkXStorage(BaseGraphStorage): graph = await self._get_graph() return graph.has_edge(source_node_id, target_node_id) - async def get_node(self, node_id: str) -> dict[str, str] | None: + async def get_node(self, node_id: str) -> Union[Dict[str, str],None]: graph = await self._get_graph() return graph.nodes.get(node_id) @@ -112,17 +112,17 @@ class NetworkXStorage(BaseGraphStorage): async def get_edge( self, source_node_id: str, target_node_id: str - ) -> dict[str, str] | None: + ) -> Union[Dict[str, str],None]: graph = await self._get_graph() return graph.edges.get((source_node_id, target_node_id)) - async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + async def get_node_edges(self, source_node_id: str) -> Union[List[Tuple[str, str]],None]: graph = await self._get_graph() if graph.has_node(source_node_id): return list(graph.edges(source_node_id)) return None - async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + async def upsert_node(self, node_id: str, node_data: Dict[str, str]) -> None: """ Importance notes: 1. Changes will be persisted to disk during the next index_done_callback @@ -133,7 +133,7 @@ class NetworkXStorage(BaseGraphStorage): graph.add_node(node_id, **node_data) async def upsert_edge( - self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + self, source_node_id: str, target_node_id: str, edge_data: Dict[str, str] ) -> None: """ Importance notes: @@ -158,7 +158,7 @@ class NetworkXStorage(BaseGraphStorage): else: logger.warning(f"Node {node_id} not found in the graph for deletion.") - async def remove_nodes(self, nodes: list[str]): + async def remove_nodes(self, nodes: List[str]): """Delete multiple nodes Importance notes: @@ -174,7 +174,7 @@ class NetworkXStorage(BaseGraphStorage): if graph.has_node(node): graph.remove_node(node) - async def remove_edges(self, edges: list[tuple[str, str]]): + async def remove_edges(self, edges: List[Tuple[str, str]]): """Delete multiple edges Importance notes: @@ -190,7 +190,7 @@ class NetworkXStorage(BaseGraphStorage): if graph.has_edge(source, target): graph.remove_edge(source, target) - async def get_all_labels(self) -> list[str]: + async def get_all_labels(self) -> List[str]: """ Get all node labels in the graph Returns: @@ -389,7 +389,7 @@ class NetworkXStorage(BaseGraphStorage): return True - async def drop(self) -> dict[str, str]: + async def drop(self) -> Dict[str, str]: """Drop all graph data from storage and clean up resources This method will: diff --git a/CoreRAG/lightrag/lightrag.py b/CoreRAG/lightrag/lightrag.py index 0bf7de8..846f343 100644 --- a/CoreRAG/lightrag/lightrag.py +++ b/CoreRAG/lightrag/lightrag.py @@ -1,5 +1,4 @@ from __future__ import annotations - import traceback import asyncio import configparser @@ -21,18 +20,18 @@ from typing import ( List, Dict, ) -from lightrag.constants import ( +from .constants import ( DEFAULT_MAX_TOKEN_SUMMARY, DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, ) -from lightrag.utils import get_env_value +from .utils import get_env_value -from lightrag.kg import ( +from .kg import ( STORAGES, verify_storage_implementation, ) -from lightrag.kg.shared_storage import ( +from .kg.shared_storage import ( get_namespace_data, get_pipeline_status_lock, ) @@ -199,7 +198,7 @@ class LightRAG: ) """Maximum number of concurrent embedding function calls.""" - embedding_cache_config: dict[str, Any] = field( + embedding_cache_config: Dict[str, Any] = field( default_factory=lambda: { "enabled": False, "similarity_threshold": 0.95, @@ -283,7 +282,7 @@ class LightRAG: _storages_status: StoragesStatus = field(default=StoragesStatus.NOT_CREATED) def __post_init__(self): - from lightrag.kg.shared_storage import ( + from .kg.shared_storage import ( initialize_share_data, ) diff --git a/CoreRAG/lightrag/types.py b/CoreRAG/lightrag/types.py index a18f2d3..13ca1a3 100644 --- a/CoreRAG/lightrag/types.py +++ b/CoreRAG/lightrag/types.py @@ -1,18 +1,18 @@ from __future__ import annotations from pydantic import BaseModel -from typing import Any, Optional +from typing import Any, Optional,List,Dict class GPTKeywordExtractionFormat(BaseModel): - high_level_keywords: list[str] - low_level_keywords: list[str] + high_level_keywords: List[str] + low_level_keywords: List[str] class KnowledgeGraphNode(BaseModel): id: str - labels: list[str] - properties: dict[str, Any] # anything else goes here + labels: List[str] + properties: Dict[str, Any] # anything else goes here class KnowledgeGraphEdge(BaseModel): @@ -20,10 +20,10 @@ class KnowledgeGraphEdge(BaseModel): type: Optional[str] source: str # id of source node target: str # id of target node - properties: dict[str, Any] # anything else goes here + properties: Dict[str, Any] # anything else goes here class KnowledgeGraph(BaseModel): - nodes: list[KnowledgeGraphNode] = [] - edges: list[KnowledgeGraphEdge] = [] + nodes: List[KnowledgeGraphNode] = [] + edges: List[KnowledgeGraphEdge] = [] is_truncated: bool = False diff --git a/CoreRAG/lightrag/utils.py b/CoreRAG/lightrag/utils.py index 2e75b9b..2db217e 100644 --- a/CoreRAG/lightrag/utils.py +++ b/CoreRAG/lightrag/utils.py @@ -14,9 +14,9 @@ from functools import wraps from hashlib import md5 from typing import Any, Protocol, Callable, TYPE_CHECKING, List import numpy as np -from lightrag.prompt import PROMPTS +from .prompt import PROMPTS from dotenv import load_dotenv -from lightrag.constants import ( +from .constants import ( DEFAULT_LOG_MAX_BYTES, DEFAULT_LOG_BACKUP_COUNT, DEFAULT_LOG_FILENAME, @@ -1696,7 +1696,7 @@ def check_storage_env_vars(storage_name: str) -> None: Raises: ValueError: If required environment variables are missing """ - from lightrag.kg import STORAGE_ENV_REQUIREMENTS + from .kg import STORAGE_ENV_REQUIREMENTS required_vars = STORAGE_ENV_REQUIREMENTS.get(storage_name, []) missing_vars = [var for var in required_vars if var not in os.environ] diff --git a/end2end.py b/end2end.py index 470ecea..78a90c2 100644 --- a/end2end.py +++ b/end2end.py @@ -20,7 +20,7 @@ class autoGenerator(): async def query(self): self.rag_client = MassageAcupointRAG( - working_dir="C:/Users/ZIWEI/Documents/work/向量化/CoreRAG/Massage_10216" + working_dir="CoreRAG/Massage_10216" ) await self.rag_client.initialize() diff --git a/scripts/APF_global_demo.py b/scripts/APF_global_demo.py index d35dfa4..d444f60 100644 --- a/scripts/APF_global_demo.py +++ b/scripts/APF_global_demo.py @@ -1,6 +1,6 @@ import numpy as np import matplotlib.pyplot as plt - +from typing import List # ======================= 参数配置 ======================= # GRID_SIZE = (40, 130) # 行x列 TOTAL_STEPS = 50 @@ -166,14 +166,14 @@ class Agent: # ======================= 可视化模块 ======================= # class Visualizer: - def __init__(self, grid_size, full_path_ref: list[tuple]): + def __init__(self, grid_size, full_path_ref: List[tuple]): self.grid_size = grid_size self.full_path_ref = full_path_ref plt.ion() self.fig, self.ax = plt.subplots(figsize=(4, 10)) # 调整大小 self.im = self.ax.imshow(np.zeros(grid_size).T, origin='lower', cmap='viridis') self.colorbar = plt.colorbar(self.im, ax=self.ax, label='Height') - self._artists: list = [] + self._artists: List = [] # 保持横纵比一致,避免变形 self.ax.set_aspect('equal') diff --git a/scripts/__pycache__/APF_global_demo.cpython-38.pyc b/scripts/__pycache__/APF_global_demo.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..817b2a2579d2df790933a4745378694ec13373c9 GIT binary patch literal 11164 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 VzPx*NcUSku?(1S###SWM{{hIBlRE$a literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/planner.cpython-38.pyc b/scripts/__pycache__/planner.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed8a62ad817d487815e1149a8d1af554243ce05 GIT binary patch literal 8551 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 literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/sorter.cpython-38.pyc b/scripts/__pycache__/sorter.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc936bdbb378fe7128afa5d3460749fe3145824d GIT binary patch literal 4962 zcmbst{c{t?b@%QhorP>{^J(&B2u%hOvxtx`%@oF$l=m9>%<7TW2?z$%7ZR3iT z@G%j53rhlCWh>y$RxfTBxnuJ36F{_k@xtW7*cS`4f1bNHIe+Qm{Cl(Wmw#THxKg|N zakrtE6>o1@&mG$e2=_A zen?!!CA!RFsFkb?bA_o4I1}@jOILeKGag4eWti)i&!kMm$l@zWp zg7Wl_K9MO}gSl+4ktvsoIm^)treiR}F?xpWqUBLO8Y?@4JNAK|Rny88SGn0FDMzrsXMuK_y=_ znAaJyZ#VeY+D;eQIlW|XN6!O$T1UaKZ6j;yc8-|><+U`nc*(bneAzt8d69dm=+1P^ zQ*1Lo$lHNU-U)-J4CeBtriPlDC43E_|FNrgs8}$2M{{S*T<=-C_l?8H^~2virkC=D zWr5my?F`SA9J|-|p`Ow?Pu2CDm2-4m1p@Y37zk~rt7)93;4ev4NfqPh%HT}6KP`Ff z+_X!UZR&%(SkUwNf*0qeQ|4AiLOQ_*?SSSI?zS5yj8-IvOrvYi8427?a%6PBapKBH z2nJsjT+dNl1w+kMz)h6?@@6=Ba_5fy1KUpZoU*rWIeDtQ$K1Jd$EouEL1XX0Pj+wL zTY*4GXDDn8Kgb8VzK!1vFt}u(vqD`uO=bv(``;pzoRNepQjFx7?SO_rHmPT)r&vb8 z6q@x1)Q;EEmo+W(?GitT^z1kc3XzCPMz@C=GT(N%k#Y2fOZ4>Riy0$tAM9xy2BS*c z)DnX^iy8TR5Z26-Z4*4W#32yUF}@0@^Yt)jiIU+!*jrknU^tl})7DaDD|e=B>d2)1 zAeWu`Lrfs|w#cSbp($xCRq1Hge`I-y3Gq}ne1$511PY#@!(c|poNZZBkpv_G)Q365 z&k=rhU@IWkwX!z0lC`rA)|qV&cCUinKVz%e8n%|LW9wNL+rS=UkFzJ(lk6$h%{H=4 z>}j@{eTzNAo@HBDnr&s<*mkyq^{`&HlkH-=*>l-$a3tzTT_ifPJ=f$5bda*W?D_Fj zMRsM#Nm5k;my#zad!Z`vuYqHQ?E@Y>wx1mU$5YVpDvGsUth@*-U$egGiX*X?u2Dhv zAbWW{b&*^kaK|CoqXwsA0&_Tmi90dZ$G*Z|9aq_rNvV-*u_{Pp#vxoI@F&p zbYrIw8lZ^KO&bP6M-aZyO++Ac)5>*U=zwA%baQ_obQ2K>-6RkQ9WWROJ#{-Rdo7I| z>9s-{ES@!4kkGn7Jxh{M0uY#OF(=yNFktF|FEk@Z$iP+zZ>TBQ$hgXkT!{$?>WUjf z$d#a_iOoPgIg@fF*#F8!KbWx*QzxWhd0LqPI*74L21;Es zk25O5(*VA(lcHvt>>i6VQ(FTV@&k^T&56&9*XenLK znvR|+7CEzzz?v;ORXV!u5t@jeTUHH%scxVsEVbSb>?%BRki8Mo3~(?J3bKgVpsA2q z>aEg!9->z@Sr_&@4rdxFYG2+S-^_^8WQ1cc-sFJqX@Cury!H+Ep%CbL;y!GJA(KJ+ zL|X(i=*w1+LFojUmHT~}@r<|;!fq$dm)_~AeR-pBni&Vb4U2z=FByII5rzp*K<_R? zY%j6R5*9IVmtzqb#d^XZL3v|SiH1g zw{UrT2Wpi^- literal 0 HcmV?d00001 diff --git a/scripts/planner.py b/scripts/planner.py index 2a29127..217d0df 100644 --- a/scripts/planner.py +++ b/scripts/planner.py @@ -1,8 +1,11 @@ try:from scripts.APF_global_demo import GaussianSchedule,GaussianPathSchedule,TimedGaussianSchedule,FieldScheduler,Agent,Visualizer except:from APF_global_demo import GaussianSchedule,GaussianPathSchedule,TimedGaussianSchedule,FieldScheduler,Agent,Visualizer + import numpy as np + try:from scripts.sorter import sorter except:from sorter import sorter + import matplotlib.pyplot as plt import json import time diff --git a/scripts/sorter.py b/scripts/sorter.py index cd34eca..a35b12e 100644 --- a/scripts/sorter.py +++ b/scripts/sorter.py @@ -1,6 +1,7 @@ import re import json import numpy as np +from typing import List class sorter: ''' 重点穴位按摩排列器 ''' @@ -18,7 +19,7 @@ class sorter: self.massage_side = massage_side # 默认为双边'both' else: raise ValueError("未指定按摩在左侧、右侧或两侧") - def _extract_acupoints(self,respnse_from_llm:str)->list[str]: + def _extract_acupoints(self,respnse_from_llm:str)->List[str]: pattern = r"[0-9]+\.\s*([\u4e00-\u9fa5]{2,5}穴)" matches = re.findall(pattern, respnse_from_llm) # 去重 & 排除空值 @@ -26,7 +27,7 @@ class sorter: print(unique_names) return unique_names - def sort_acupoints(self,respnse_from_llm:list[str])->list[str]: + def sort_acupoints(self,respnse_from_llm:List[str])->List[str]: if self.body_part == 'back': allowed_names = [] if self.body_part == 'shoulder': @@ -38,7 +39,7 @@ class sorter: "志室右","肓门右","胃仓右","意舍右","阳纲右","胞肓右","气海右俞","大肠右俞","小肠右俞", "中膂右俞","肾俞右","关元右俞","膀胱右俞","白环右俞","秩边右","京门右"] - def __filter_acupoints(acupoints:list[str],allowed_names: list[str])->list[str]: + def __filter_acupoints(acupoints:List[str],allowed_names: List[str])->List[str]: acupoints_cleaned = [] matched_keys = [] for acupoint in acupoints: