From 2ce030238415e80fb2fab7b09d2454d4d672b850 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Mon, 10 Mar 2025 10:46:24 +0800 Subject: [PATCH] 'commit' --- AI/Config.py | 20 +++++++++--------- AI/Text2Sql/Test/chroma.sqlite3 | Bin 0 -> 167936 bytes .../Util/{Text2SqlUtil.py => VannaUtil.py} | 13 +++++------- .../__pycache__/Text2SqlUtil.cpython-310.pyc | Bin 5360 -> 0 bytes .../__pycache__/VannaUtil.cpython-310.pyc | Bin 0 -> 5226 bytes AI/Text2Sql/YunXiao.py | 4 ++-- AI/__pycache__/Config.cpython-310.pyc | Bin 970 -> 1083 bytes 7 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 AI/Text2Sql/Test/chroma.sqlite3 rename AI/Text2Sql/Util/{Text2SqlUtil.py => VannaUtil.py} (91%) delete mode 100644 AI/Text2Sql/Util/__pycache__/Text2SqlUtil.cpython-310.pyc create mode 100644 AI/Text2Sql/Util/__pycache__/VannaUtil.cpython-310.pyc diff --git a/AI/Config.py b/AI/Config.py index 4979f5bd..8b590938 100644 --- a/AI/Config.py +++ b/AI/Config.py @@ -1,27 +1,27 @@ from pathlib import Path # 固定配置项 -# 阿里云中用来调用deepseek r1的密钥 MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" -MODEL_API_URL= 'https://dashscope.aliyuncs.com/compatible-mode/v1' +MODEL_API_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1' MODEL_NAME = "deepseek-v3" -QWEN_MODEL_NAME='qwen-plus' +MODEL_GENERATION_TEXT_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" # 阿里云文本生成服务 +QWEN_MODEL_NAME = 'qwen-plus' # 华为云 -HW_API_KEY='2R7vrjfIZO1chcfk4V3zDscx2Ms4I4kdoY7XSFnxa8Z2RNfAztg8qrXXKkwJGZWvMtS4qnN782WmaY4xZfMhyg' -HW_API_URL= url = "https://infer-modelarts-cn-southwest-2.modelarts-infer.com/v1/infers/952e4f88-ef93-4398-ae8d-af37f63f0d8e/v1/chat/completions" -HW_MODEL_NAME='DeepSeek-R1' +HW_API_KEY = '2R7vrjfIZO1chcfk4V3zDscx2Ms4I4kdoY7XSFnxa8Z2RNfAztg8qrXXKkwJGZWvMtS4qnN782WmaY4xZfMhyg' +HW_API_URL = url = "https://infer-modelarts-cn-southwest-2.modelarts-infer.com/v1/infers/952e4f88-ef93-4398-ae8d-af37f63f0d8e/v1/chat/completions" +HW_MODEL_NAME = 'DeepSeek-R1' # 阿里云的配置信息 -ALY_AK='LTAI5tE4tgpGcKWhbZg6C4bh' -ALY_SK='oizcTOZ8izbGUouboC00RcmGE8vBQ1' +ALY_AK = 'LTAI5tE4tgpGcKWhbZg6C4bh' +ALY_SK = 'oizcTOZ8izbGUouboC00RcmGE8vBQ1' # 正确路径拼接方式 mdWorkingPath = Path(__file__).parent / 'md-file' / 'readme' DEFAULT_TEMPLATE = mdWorkingPath / 'default.md' # 使用 / 运算符 -DEFAULT_OUTPUT_DIR = mdWorkingPath / 'output' # 使用 / 运算符 +DEFAULT_OUTPUT_DIR = mdWorkingPath / 'output' # 使用 / 运算符 # 请在Config.py中配置以下参数 NEO4J_URI = "neo4j://10.10.21.20:7687" -NEO4J_AUTH = ("neo4j", "DsideaL4r5t6y7u") \ No newline at end of file +NEO4J_AUTH = ("neo4j", "DsideaL4r5t6y7u") diff --git a/AI/Text2Sql/Test/chroma.sqlite3 b/AI/Text2Sql/Test/chroma.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..bea4a1549fd9cd31272176b777a55c14be7b4287 GIT binary patch literal 167936 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 List[Dict[str, Any]]: return [] - - def _clean_sql_output(self, raw_sql: str) -> str: """增强版清洗逻辑""" # 移除所有非SQL内容 - cleaned = re.sub(r'^.*?(?=SELECT)', '', raw_sql, flags=re.IGNORECASE|re.DOTALL) + cleaned = re.sub(r'^.*?(?=SELECT)', '', raw_sql, flags=re.IGNORECASE | re.DOTALL) # 提取第一个完整SQL语句 - match = re.search(r'(SELECT\s.+?;)', cleaned, re.IGNORECASE|re.DOTALL) + match = re.search(r'(SELECT\s.+?;)', cleaned, re.IGNORECASE | re.DOTALL) if match: # 标准化空格和换行 clean_sql = re.sub(r'\s+', ' ', match.group(1)).strip() diff --git a/AI/Text2Sql/Util/__pycache__/Text2SqlUtil.cpython-310.pyc b/AI/Text2Sql/Util/__pycache__/Text2SqlUtil.cpython-310.pyc deleted file mode 100644 index ea6349f8c14b542dbc5898c4ae9622e4289c4da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5360 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 Ljz!NL&55yhFp8O4>t6~ mSK% zn9AGCn8laEBh8S)E6otapUR)Y2c!jnG(V6QOc96@N)e0_P7w-b&=j6HshH7k;xT#s z#DYxyGDH31)S|M?iNY>+}`meQh}sL3Cg>e={!wioeDE@d`WQ2;V|7+9ED V7=e%ph?zM+EFfP9$O5u~Bmi7MSpfh5 delta 256 zcmdnZaf+QcpO=@50SE#-&ZVtNu5yhFp8O4>t6~&#(n99@4 zn8lmIEzOX^Bh3)Sm&%vI3#9phG#`)_Na2qXOc96@N)ZfZ&=i_Dt$1@JV>4rh@GbU& z#FC7h%%mbFpgmE%zWy$*KJktLp7GwUk;vT8AfG5Mh^(KZuWJ;4V7RMaJVM|Wmq$2E zADj);bc?yPDCgGXc;X=8!O2HnLG?EEG&#*$ie}lnOPWxm^m1MY#<2$ D$-g?&