text2sql工具使用-Langchain-chatchat-0.3.1版本部署流程以及对接Oracle数 ...

打印 上一主题 下一主题

主题 782|帖子 782|积分 2361



一.我们须要从git hub大将langchain-chatchat-0.3.1这个项目给拉取下来,接着部署项目,我们试着根据官方提供的README将整个项目跑通。

1.本次基于autodl服务器实现部署,先租对应的服务器

(1).注册好autodl账户之后,开始租服务器,这里以glm4-9b-chat这个模子为例,地区我租的西北B区的,GPU我选择的是RTX4090(一张),根本镜像选择的是Pytorch-2.3.0-python-3.12(ubuntu22.04)- cuda版本12.1。


二. 部署langchain-chatchat-0.3.1项目

1.先从github大将新版本的项目拉取下来,指令如下

  1. git clone https://github.com/chatchat-space/Langchain-Chatchat.git
复制代码
2.须要新建两个差别的虚拟环境,一个为了运行模子,一个为了运行项目代码,第一个虚拟环境为了存储模子所须要的环境

  1. conda create -n llm_tl python==3.11
复制代码
3.对于一个全新的机子来说新建完虚拟环境无法做到直接激活,重新加载你的shell设置
输入以下指令,


  1. source ~/.bashrc
复制代码
  1. conda init
复制代码
4.开始激活新建好的环境

  1. conda activate llm_tl
复制代码
5.起首举行模子推理框架的运行,并加载所需使用的模子

如果你盼望可以或许推理所有支持的模子,可以用以下命令安装所有须要的依赖:

  1. pip install "langchain-chatchat[xinference]" -U
复制代码
  1. pip install "xinference[all]"  -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
6.PyTorch(transformers) 引擎支持险些有所的最新模子,这是 Pytorch 模子默认使用的引擎:

  1. pip install "xinference[transformers]"  -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
7.安装 xinference 和 vLLM:

  1. pip install "xinference[vllm]"
复制代码
8.Xinference 通过 llama-cpp-python 支持 gguf 和 ggml 格式的模子。建议根据当前使用的硬件手动安装依赖,从而得到最佳的加速效果。初始步骤:

  1. pip install xinference  -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
9.安装英伟达显卡:

  1. CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python  -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
10.SGLang 具有基于 RadixAttention 的高性能推理运行时。它通过在多个调用之间自动重用KV缓存,明显加速了复杂 LLM 步伐的实验。它还支持其他常见推理技术,如连续批处理和张量并行处理。

  1. pip install 'xinference[sglang]'  -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
11.本地运行Xinference,让我们以一个经典的大语言模子 glm4-9b-chat 来展示如安在本地用 Xinference 运行大模子,我这里自定义了一个存储日记文件和大模子,embidding模子的路径,如果不自定义一个路径将会下载到默认的一个路径下,这样很容易将我们的系统盘给撑爆,以魔塔社区下载模子为例。

  1. XINFERENCE_HOME=/root/autodl-tmp/xinference XINFERENCE_MODEL_SRC=modelscope xinference-local --host 0.0.0.0 --port 9997
复制代码
12.我们启动模子有两种方式一种是通过指令来下载模子,或者我们运行起9997端口号下的地点手动下载模子,

指令下载方式

  1. xinference launch --model-engine vllm --model-name glm4-chat --size-in-billions 9 --model-format pytorch --quantization none
复制代码
手动下载方式


13.以使用 --model-uid 或者 -u 参数指定模子的 UID,如果没有指定,Xinference 会随机天生一个 ID,下面的命令就是手动指定了 ID 为glm4-chat :

  1. xinference list
复制代码

14. 大模子下载好之后,我们开始下载embidding模子,这里也是两种下载方式,官方地点如下bge-large-zh-v1.5 — Xinference这里我选择的是bge-large-zh-v1.5

  
  1. XINFERENCE_HOME=/root/autodl-tmp/xinference XINFERENCE_MODEL_SRC=modelscope xinference-local --host 0.0.0.0 --port 9997
复制代码
  
  1. xinference launch --model-name bge-large-zh-v1.5 --model-type embedding
复制代码

三.部署项目

硬件方面,因 0.3.1 版本已修改为支持差别模子部署框架接入,因此可在 CPU、GPU、NPU、MPS 等差别硬件条件下使用。
1.创建一个虚拟环境

  1. conda create -n chatchat_0.3.1 python==3.11
复制代码
  1. conda activate chatchat_0.3.1
复制代码
2.安装Langchain-Chatchat

(1)从 0.3.0 版本起,Langchain-Chatchat 提供以 Python 库情势的安装方式,具体安装请实验:

  
  1. pip install langchain-chatchat -U
复制代码
(2)从 0.3.1 版本起,Langchain-Chatchat 使用本地 yaml 文件的方式举行设置,用户可以直接查看并修改其中的内容,服务器会自动更新无需重启,若不设置该环境变量,则自动使用当前目录。

  
  1. # on linux or macos
  2. export CHATCHAT_ROOT=/path/to/chatchat_data
复制代码
(3)实验初始化

  
  1. chatchat init
复制代码
该命令会实验以下操作:


  • 创建所有须要的数据目录
  • 复制 samples 知识库内容
  • 天生默认 yaml 设置文件
3. 修改设置文件

  1. # 默认选用的 LLM 名称
  2. DEFAULT_LLM_MODEL: qwen1.5-chat
  3. # 默认选用的 Embedding 名称
  4. DEFAULT_EMBEDDING_MODEL: bge-large-zh-v1.5
  5. # 将 `LLM_MODEL_CONFIG` 中 `llm_model, action_model` 的键改成对应的 LLM 模型
  6. # 在 `MODEL_PLATFORMS` 中修改对应模型平台信息
复制代码

设置知识库路径(basic_settings.yaml)(可选)
默认知识库位于 CHATCHAT_ROOT/data/knowledge_base,如果你想把知识库放在差别的位置,或者想连接现有的知识库,可以在这里修改对应目录即可。
4.初始化知识库

举行知识库初始化前,请确保已经启动模子推理框架及对应 embedding 模子。
  1. chatchat kb -r
复制代码
初始化知识库最常见的报错信息是
  1. Traceback (most recent call last):
  2.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/init_database.py", line 156, in main
  3.     folder2db(kb_names=args.kb_name, mode="recreate_vs", embed_model=args.embed_model)
  4.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/server/knowledge_base/migrate.py", line 130, in folder2db
  5.     kb.create_kb()
  6.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/server/knowledge_base/kb_service/base.py", line 80, in create_kb
  7.     self.do_create_kb()
  8.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/server/knowledge_base/kb_service/faiss_kb_service.py", line 51, in do_create_kb
  9.     self.load_vector_store()
  10.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/server/knowledge_base/kb_service/faiss_kb_service.py", line 28, in load_vector_store
  11.     return kb_faiss_pool.load_vector_store(kb_name=self.kb_name,
  12.   File "/Users/hkk/Amap/ai/Langchain-Chatchat/myenv/lib/python3.8/site-packages/chatchat/server/knowledge_base/kb_cache/faiss_cache.py", line 132, in load_vector_store
  13.     raise RuntimeError(f"向量库 {kb_name} 加载失败。")
  14. RuntimeError: 向量库 samples 加载失败。
复制代码
遇到类似加载向量库失败的报错,缺少一个faiss这个包,这个时候须要再安装一个faiss的包
  1. pip install faiss-cpu==1.7.4
复制代码
  1. pip install rank_bm25 -i https://mirrors.aliyun.com/pypi/simple
复制代码
5.出现以下日记即为成功:

  1. ----------------------------------------------------------------------------------------------------
  2. 知识库名称      :samples
  3. 知识库类型      :faiss
  4. 向量模型:      :bge-large-zh-v1.5
  5. 知识库路径      :/root/anaconda3/envs/chatchat/lib/python3.11/site-packages/chatchat/data/knowledge_base/samples
  6. 文件总数量      :47
  7. 入库文件数      :42
  8. 知识条目数      :740
  9. 用时            :0:02:29.701002
  10. ----------------------------------------------------------------------------------------------------
  11. 总计用时        :0:02:33.414425
复制代码
6.启动项目

  1. chatchat start -a
复制代码

四.在autodl服务器上安装oracle客户端

1. 下载Oracle 11g Instant Client
从Oracle官方网站下载实用于Linux的Oracle 11g Instant Client基本包和SQL*Plus包。比方:


  1. instantclient-basic-linux.x64-11.2.0.4.0.zip
  2. instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
复制代码
2. 解压安装包
进入你下载文件的目录,然后解压缩下载的zip文件:


  1. unzip instantclient-basic-linux.x64-11.2.0.4.0.zip -d /opt/oracle
  2. unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip -d /opt/oracle
复制代码
解压后会在 /opt/oracle 目录中天生一个 instantclient_11_2 目录。

3. 设置环境变量
打开 .bashrc 文件并编辑,以便每次启动终端时自动加载Oracle的环境变量:


  1. vi ~/.bashrc
复制代码
  1. 在文件末尾添加以下内容:
  2. export ORACLE_HOME=/opt/oracle/instantclient_11_2
  3. export LD_LIBRARY_PATH=$ORACLE_HOME:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
  4. export PATH=$ORACLE_HOME:$PATH
复制代码
生存并关闭文件,然后使这些更改生效:
  1. source ~/.bashrc
复制代码
4. 创建须要的符号链接
确保 libclntsh.so 和其他库文件可被精确辨认。如果只存在 libclntsh.so.11.1 文件,创建符号链接:


  1. ln -s /opt/oracle/instantclient_11_2/libclntsh.so.11.1 /opt/oracle/instantclient_11_2/libclntsh.so
复制代码
5. 安装 libaio 库
确保安装了 libaio 库,这是Oracle Instant Client的一个依赖项:


  1. sudo apt-get install libaio1 # Debian/Ubuntu
  2. sudo yum install libaio # Red Hat/CentOS
复制代码
6. 查抄和调整库文件权限
确保 instantclient_11_2 目录中的所有库文件都有精确的读取权限:


  1. chmod +r /opt/oracle/instantclient_11_2/*.so
复制代码
7. 验证SQL*Plus
运行以下命令以验证SQL*Plus是否成功安装并精确设置:


  1. sqlplus -v
复制代码
8. 测试 cx_Oracle 安装
编写并运行一个简单的Python脚本,验证 cx_Oracle 是否可以或许精确加载Oracle Instant Client库:


  1. import cx_Oracle
  2. print(cx_Oracle.clientversion())
复制代码
运行脚本:
python /path/to/your/script.py
如果输出 (11, 2, 0, 4, 0),说明安装成功。

9. 办理 DPI-1047 错误
如果遇到 DPI-1047 错误,确保 LD_LIBRARY_PATH 设置精确,并且包罗
重启应用进程或终端以确保环境变量生效。


  1. /opt/oracle/instantclient_11_2。你可以使用以下命令检查和修复路径:
  2. echo $LD_LIBRARY_PATH
  3. export LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
复制代码
10. 重启系统或服务(须要)
在修改环境变量后,重启系统或者服务,确保所有进程加载精确的环境变量。

11. 连接到Oracle数据库
最后,使用SQL*Plus连接到你的Oracle数据库,确保统统工作正常:
sqlplus username/password@//hostname:port/SID
通过以上步骤,Oracle 11g Instant Client 应该在你的Linux系统上成功安装并设置好。


五.修改chatchat源码

官方给定的代码天生的sql语句不太符合oracle数据库的sql语句,这个时候我们须要对天生的sql语句举行一个修改,是他变成支持oracle查询的sql语句,我们须要改两个代码文件地点

1.text2sql.py
miniconda3/envs/chat_0.3.1/lib/python3.11/site-packages/chatchat/server/agent/tools_factory/text2sql.py


  1. def query_database(query: str, config: dict):
  2.     model_name = config["model_name"]
  3.     top_k = config["top_k"]
  4.     return_intermediate_steps = config["return_intermediate_steps"]
  5.     sqlalchemy_connect_str = config["sqlalchemy_connect_str"]
  6.     db = SQLDatabase.from_uri(sqlalchemy_connect_str)
  7.     from chatchat.server.utils import get_ChatOpenAI
  8.     llm = get_ChatOpenAI(
  9.         model_name=model_name,
  10.         temperature=0.1,
  11.         streaming=True,
  12.         local_wrap=True,
  13.         verbose=True,
  14.     )
  15.     table_names = config["table_names"]
  16.     result = None
  17.     if len(table_names) > 0:
  18.         db_chain = SQLDatabaseChain.from_llm(
  19.             llm,
  20.             db,
  21.             verbose=True,
  22.             top_k=top_k,
  23.             return_intermediate_steps=return_intermediate_steps,
  24.         )
  25.         result = db_chain.invoke({"query": query, "table_names_to_use": table_names})
  26.         # 检查 result['intermediate_steps'] 是否为列表,并包含字典
  27.         if isinstance(result['intermediate_steps'], list):
  28.             last_step = result['intermediate_steps'][-1]
  29.             if isinstance(last_step, dict) and 'sql_cmd' in last_step:
  30.                 # 提取生成的 SQL 语句
  31.                 sql_cmd = last_step['sql_cmd']
  32.             elif isinstance(last_step, str):
  33.                 # 如果是字符串,尝试解析并提取SQL语句
  34.                 print(f"警告:最后一步是字符串,尝试解析: {last_step}")
  35.                 sql_cmd = last_step.split("SQLQuery:")[-1].strip()
  36.                 # 移除可能出现的反引号和其他多余字符
  37.                 sql_cmd = sql_cmd.replace('```sql', '').replace('```', '').strip()
  38.                 # 移除可能多余的 "Query:" 前缀
  39.                 sql_cmd = sql_cmd.replace('Query:', '').strip()
  40.             else:
  41.                 raise TypeError(
  42.                     f"Unexpected format in last intermediate step. Expected a dictionary with 'sql_cmd' key or a parsable string, got: {last_step}")
  43.         else:
  44.             raise TypeError(
  45.                 f"Unexpected format in intermediate_steps. Expected a list, got: {type(result['intermediate_steps'])}")
  46.         # 打印原始 SQL 语句
  47.         print("原始 SQL 语句:", sql_cmd)
  48.         # 修正 Oracle 不支持的 FETCH NEXT 语法
  49.         if re.search(r'FETCH (FIRST|NEXT) \d+ ROWS ONLY', sql_cmd, re.IGNORECASE):
  50.             match = re.search(r'FETCH (FIRST|NEXT) (\d+) ROWS ONLY', sql_cmd, re.IGNORECASE)
  51.             if match:
  52.                 limit = match.group(2)
  53.                 # 将 SQL 查询封装到一个子查询中,然后用 ROWNUM 限制行数
  54.                 sql_cmd = re.sub(r'SELECT', f'SELECT * FROM (SELECT', sql_cmd, flags=re.IGNORECASE)
  55.                 sql_cmd = re.sub(r'FETCH (FIRST|NEXT) \d+ ROWS ONLY', f') WHERE ROWNUM <= {limit}', sql_cmd,
  56.                                  flags=re.IGNORECASE)
  57.                 print("已修正 SQL 语法:", sql_cmd)
  58.         else:
  59.             print("无需修正的 SQL 语法:", sql_cmd)
  60.         # 移除表名和列名中的双引号
  61.         sql_cmd = re.sub(r'"(\w+)"', r'\1', sql_cmd)
  62.         # 移除可能多余的分号以避免 ORA-00911 错误
  63.         sql_cmd = sql_cmd.rstrip(';')
  64.         try:
  65.             # 执行调整后的 SQL 查询
  66.             final_result = db.run(sql_cmd)
  67.             print("执行的最终 SQL 语句:", sql_cmd)
  68.         except Exception as e:
  69.             print(f"执行 SQL 查询时出错: {e}")
  70.             raise e
  71.         context = f"""查询结果: {final_result}\n\n"""
  72.         return context
复制代码
2.base.py
miniconda3/envs/chat_0.3.1/lib/python3.11/site-packages/langchain_experimental/sql/base.py



3.修改之后我们就可以正常使用数据库查询的工具举行查询


 


六.当我们关掉服务器之后,再次开机的时候,这时候我们须要在启动项目前先将xinference上的大模子和embidding模子启动起来,再次启动项目,否则项目启动起来会报错。

  1. XINFERENCE_HOME=/root/autodl-tmp/xinference XINFERENCE_MODEL_SRC=modelscope xinference-local --host 0.0.0.0 --port 9997
复制代码
1.实验完之后我们须要在Xinference上手动将大模子和embidding模子给启动起来。




2.启动之后我们就会有这样的结果


3.启动项目指令如下:

  1. export CHATCHAT_ROOT=/root/autodl-tmp/Langchain-Chatchat/to/chatchat_data
复制代码
  1. chatchat init
复制代码
  1. export CHATCHAT_ROOT=/root/autodl-tmp/Langchain-Chatchat/to/chatchat_data
复制代码
  1. chatchat start -a
复制代码









免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表