refactor(lightrag): 优化Python类型提示以及代码稳健型
This commit is contained in:
parent
d5e1ab8c05
commit
9233ba64fb
@ -120,21 +120,23 @@ class LightRagBasedKB:
|
|||||||
|
|
||||||
def _get_llm_func(self, llm_info: dict):
|
def _get_llm_func(self, llm_info: dict):
|
||||||
"""获取 LLM 函数"""
|
"""获取 LLM 函数"""
|
||||||
llm_info = llm_info | {
|
# llm_info = llm_info | {
|
||||||
"model_name": "qwen3-1.7b",
|
# "model_name": "qwen3-1.7b",
|
||||||
"provider": "dashscope"
|
# "provider": "custom"
|
||||||
}
|
# }
|
||||||
provider_info = config.model_names[llm_info.get("provider")]
|
# provider_info = config.model_names[llm_info.get("provider")]
|
||||||
api_key = os.getenv(provider_info.get("env")[0] or "OPENAI_API_KEY") or "no_api_key"
|
# api_key = os.getenv(provider_info.get("env")[0] or "OPENAI_API_KEY") or "no_api_key"
|
||||||
base_url = get_docker_safe_url(provider_info.get("base_url", "http://localhost:8081/v1"))
|
# base_url = get_docker_safe_url(provider_info.get("base_url", "http://localhost:8081/v1"))
|
||||||
|
from src.models import get_custom_model
|
||||||
|
llm_info = get_custom_model("qwen3:32b-RFnC")
|
||||||
async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):
|
async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):
|
||||||
return await openai_complete_if_cache(
|
return await openai_complete_if_cache(
|
||||||
llm_info.get("model_name"),
|
llm_info.get("name", "qwen3-1.7b"),
|
||||||
prompt,
|
prompt,
|
||||||
system_prompt=system_prompt,
|
system_prompt=system_prompt,
|
||||||
history_messages=history_messages,
|
history_messages=history_messages,
|
||||||
api_key=api_key,
|
api_key=llm_info.get("api_key"),
|
||||||
base_url=base_url,
|
base_url=get_docker_safe_url(llm_info.get("api_base")),
|
||||||
extra_body={"enable_thinking": False},
|
extra_body={"enable_thinking": False},
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
@ -155,42 +157,43 @@ class LightRagBasedKB:
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _process_file_to_markdown(self, file_path: str, params=None) -> str:
|
async def _process_file_to_markdown(self, file_path: str, params: dict | None = None) -> str:
|
||||||
"""将不同类型的文件转换为 markdown 格式"""
|
"""将不同类型的文件转换为 markdown 格式"""
|
||||||
file_path = Path(file_path)
|
file_path_obj = Path(file_path)
|
||||||
file_ext = file_path.suffix.lower()
|
file_ext = file_path_obj.suffix.lower()
|
||||||
|
|
||||||
if file_ext == '.pdf':
|
if file_ext == '.pdf':
|
||||||
# 使用 OCR 处理 PDF
|
# 使用 OCR 处理 PDF
|
||||||
from src.core.indexing import parse_pdf_async
|
from src.core.indexing import parse_pdf_async
|
||||||
text = await parse_pdf_async(str(file_path), params=params)
|
text = await parse_pdf_async(str(file_path_obj), params=params)
|
||||||
return f"Using OCR to process {file_path.name}\n\n{text}"
|
return f"Using OCR to process {file_path_obj.name}\n\n{text}"
|
||||||
|
|
||||||
elif file_ext in ['.txt', '.md']:
|
elif file_ext in ['.txt', '.md']:
|
||||||
# 直接读取文本文件
|
# 直接读取文本文件
|
||||||
with open(file_path, 'r', encoding='utf-8') as f:
|
with open(file_path_obj, 'r', encoding='utf-8') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
return f"# {file_path.name}\n\n{content}"
|
return f"# {file_path_obj.name}\n\n{content}"
|
||||||
|
|
||||||
elif file_ext in ['.doc', '.docx']:
|
elif file_ext in ['.doc', '.docx']:
|
||||||
# 处理 Word 文档
|
# 处理 Word 文档
|
||||||
from docx import Document
|
|
||||||
doc = Document(file_path)
|
from docx import Document # type: ignore
|
||||||
|
doc = Document(file_path_obj)
|
||||||
text = '\n'.join([para.text for para in doc.paragraphs])
|
text = '\n'.join([para.text for para in doc.paragraphs])
|
||||||
return f"# {file_path.name}\n\n{text}"
|
return f"# {file_path_obj.name}\n\n{text}"
|
||||||
|
|
||||||
elif file_ext in ['.jpg', '.jpeg', '.png', '.bmp']:
|
elif file_ext in ['.jpg', '.jpeg', '.png', '.bmp']:
|
||||||
# 使用 OCR 处理图片
|
# 使用 OCR 处理图片
|
||||||
text = ocr.process_image(str(file_path))
|
text = ocr.process_image(str(file_path_obj))
|
||||||
return f"# {file_path.name}\n\n{text}"
|
return f"# {file_path_obj.name}\n\n{text}"
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 尝试作为文本文件读取
|
# 尝试作为文本文件读取
|
||||||
import textract
|
import textract # type: ignore
|
||||||
text = textract.process(file_path)
|
text = textract.process(file_path_obj)
|
||||||
return f"# {file_path.name}\n\n{text}"
|
return f"# {file_path_obj.name}\n\n{text}"
|
||||||
|
|
||||||
async def _process_url_to_markdown(self, url: str, params=None) -> str:
|
async def _process_url_to_markdown(self, url: str, params: dict | None = None) -> str:
|
||||||
"""将 URL 转换为 markdown 格式"""
|
"""将 URL 转换为 markdown 格式"""
|
||||||
import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
@ -231,7 +234,7 @@ class LightRagBasedKB:
|
|||||||
|
|
||||||
return {"databases": databases}
|
return {"databases": databases}
|
||||||
|
|
||||||
def create_database(self, database_name, description, embed_info: dict = None, **kwargs):
|
def create_database(self, database_name, description, embed_info: dict | None = None, **kwargs):
|
||||||
"""创建数据库 - data_router.py 使用"""
|
"""创建数据库 - data_router.py 使用"""
|
||||||
db_id = f"kb_{hashstr(database_name, with_salt=True)}"
|
db_id = f"kb_{hashstr(database_name, with_salt=True)}"
|
||||||
|
|
||||||
@ -285,7 +288,7 @@ class LightRagBasedKB:
|
|||||||
|
|
||||||
return {"message": "删除成功"}
|
return {"message": "删除成功"}
|
||||||
|
|
||||||
async def add_content(self, db_id, items, params=None):
|
async def add_content(self, db_id, items, params: dict | None = None):
|
||||||
"""通用的内容添加方法 - 支持文件和URL"""
|
"""通用的内容添加方法 - 支持文件和URL"""
|
||||||
if db_id not in self.databases_meta:
|
if db_id not in self.databases_meta:
|
||||||
raise ValueError(f"Database {db_id} not found")
|
raise ValueError(f"Database {db_id} not found")
|
||||||
@ -294,7 +297,7 @@ class LightRagBasedKB:
|
|||||||
if not rag:
|
if not rag:
|
||||||
raise ValueError(f"Failed to get LightRAG instance for {db_id}")
|
raise ValueError(f"Failed to get LightRAG instance for {db_id}")
|
||||||
|
|
||||||
content_type = params.get('content_type', 'file')
|
content_type = params.get('content_type', 'file') if params else 'file'
|
||||||
|
|
||||||
processed_items_info = []
|
processed_items_info = []
|
||||||
|
|
||||||
@ -412,6 +415,7 @@ class LightRagBasedKB:
|
|||||||
if rag:
|
if rag:
|
||||||
try:
|
try:
|
||||||
# 获取文档的所有 chunks
|
# 获取文档的所有 chunks
|
||||||
|
assert hasattr(rag.text_chunks, 'get_all'), "text_chunks does not have get_all method"
|
||||||
all_chunks = await rag.text_chunks.get_all()
|
all_chunks = await rag.text_chunks.get_all()
|
||||||
|
|
||||||
# 筛选属于该文档的 chunks
|
# 筛选属于该文档的 chunks
|
||||||
|
|||||||
@ -54,9 +54,7 @@ def select_model(model_provider=None, model_name=None):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if model_provider == "custom":
|
if model_provider == "custom":
|
||||||
model_info = next((x for x in config.custom_models if x["custom_id"] == model_name), None)
|
model_info = get_custom_model(model_name)
|
||||||
if model_info is None:
|
|
||||||
raise ValueError(f"Model {model_name} not found in custom models")
|
|
||||||
|
|
||||||
from src.models.chat_model import CustomModel
|
from src.models.chat_model import CustomModel
|
||||||
return CustomModel(model_info)
|
return CustomModel(model_info)
|
||||||
@ -71,3 +69,12 @@ def select_model(model_provider=None, model_name=None):
|
|||||||
return model
|
return model
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Model provider {model_provider} load failed, {e} \n {traceback.format_exc()}")
|
raise ValueError(f"Model provider {model_provider} load failed, {e} \n {traceback.format_exc()}")
|
||||||
|
|
||||||
|
|
||||||
|
def get_custom_model(model_id):
|
||||||
|
"""return model_info"""
|
||||||
|
assert config.custom_models is not None, "custom_models is not set"
|
||||||
|
modle_info = next((x for x in config.custom_models if x["custom_id"] == model_id), None)
|
||||||
|
if modle_info is None:
|
||||||
|
raise ValueError(f"Model {model_id} not found in custom models")
|
||||||
|
return modle_info
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user