{ "cells": [ { "cell_type": "markdown", "id": "ab3d27f2-84c5-4bae-9d40-ffcf63ba4d44", "metadata": {}, "source": [ "# 使用 LangChain 实现 RAG\n", "\n", "> 引导文章:[20. RAG 入门实践:从文档拆分到向量数据库与问答构建](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/20.%20RAG%20入门实践:从文档拆分到向量数据库与问答构建.md)\n", "\n", "一份值得关注的基准测试榜单:[MTEB (Massive Text Embedding Benchmark) Leaderboard](https://huggingface.co/spaces/mteb/leaderboard)。\n", "\n", "在线链接:[Kaggle](https://www.kaggle.com/code/aidemos/17-langchain-rag) | [Colab](https://colab.research.google.com/drive/1260befv1nLiEzV7SvzPPb0n-u3IXlp6E?usp=sharing)" ] }, { "cell_type": "markdown", "id": "c4fe40c9-e1c5-4a9d-b06e-0876b1176e41", "metadata": {}, "source": [ "## 安装库\n", "\n", "```bash\n", "# 处理图片,tesseract 进行 OCR(以下为可选下载,sudo相关命令请跳转命令行执行)\n", "sudo apt-get update\n", "sudo apt-get install python3-pil tesseract-ocr libtesseract-dev tesseract-ocr-eng tesseract-ocr-script-latn\n", "pip install \"unstructured[image]\" tesseract tesseract-ocr\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "id": "78ae14e2-26bb-4ec7-b85e-91e02b5e596a", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: langchain in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.3.0)\n", "Requirement already satisfied: langchain-community in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (0.4.1)\n", "Requirement already satisfied: langchain-text-splitters in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.1.2)\n", "Requirement already satisfied: langchain-huggingface in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.2.2)\n", "Requirement already satisfied: unstructured in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (0.22.28)\n", "Requirement already satisfied: langchain-core<2.0.0,>=1.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain) (1.4.0)\n", "Requirement already satisfied: langgraph<1.3.0,>=1.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain) (1.2.0)\n", "Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain) (2.12.3)\n", "Requirement already satisfied: jsonpatch<2.0.0,>=1.33.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (1.33)\n", "Requirement already satisfied: langchain-protocol>=0.0.14 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (0.0.15)\n", "Requirement already satisfied: langsmith<1.0.0,>=0.3.45 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (0.8.4)\n", "Requirement already satisfied: packaging>=23.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (26.1)\n", "Requirement already satisfied: pyyaml<7.0.0,>=5.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (6.0.3)\n", "Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (9.1.4)\n", "Requirement already satisfied: typing-extensions<5.0.0,>=4.7.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (4.15.0)\n", "Requirement already satisfied: uuid-utils<1.0,>=0.12.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-core<2.0.0,>=1.4.0->langchain) (0.15.0)\n", "Requirement already satisfied: jsonpointer>=1.9 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jsonpatch<2.0.0,>=1.33.0->langchain-core<2.0.0,>=1.4.0->langchain) (3.1.1)\n", "Requirement already satisfied: langgraph-checkpoint<5.0.0,>=4.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph<1.3.0,>=1.2.0->langchain) (4.1.0)\n", "Requirement already satisfied: langgraph-prebuilt<1.2.0,>=1.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph<1.3.0,>=1.2.0->langchain) (1.1.0)\n", "Requirement already satisfied: langgraph-sdk<0.4.0,>=0.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph<1.3.0,>=1.2.0->langchain) (0.3.14)\n", "Requirement already satisfied: xxhash>=3.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph<1.3.0,>=1.2.0->langchain) (3.6.0)\n", "Requirement already satisfied: ormsgpack>=1.12.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph-checkpoint<5.0.0,>=4.1.0->langgraph<1.3.0,>=1.2.0->langchain) (1.12.2)\n", "Requirement already satisfied: httpx>=0.25.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (0.28.1)\n", "Requirement already satisfied: orjson>=3.11.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (3.11.8)\n", "Requirement already satisfied: requests-toolbelt>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.4.0->langchain) (1.0.0)\n", "Requirement already satisfied: requests>=2.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.4.0->langchain) (2.33.1)\n", "Requirement already satisfied: zstandard>=0.23.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.4.0->langchain) (0.25.0)\n", "Requirement already satisfied: anyio in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx>=0.25.2->langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (4.13.0)\n", "Requirement already satisfied: certifi in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx>=0.25.2->langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (2026.2.25)\n", "Requirement already satisfied: httpcore==1.* in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx>=0.25.2->langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (1.0.9)\n", "Requirement already satisfied: idna in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpx>=0.25.2->langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (3.11)\n", "Requirement already satisfied: h11>=0.16 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from httpcore==1.*->httpx>=0.25.2->langgraph-sdk<0.4.0,>=0.3.0->langgraph<1.3.0,>=1.2.0->langchain) (0.16.0)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.41.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (2.41.4)\n", "Requirement already satisfied: typing-inspection>=0.4.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.4.2)\n", "Requirement already satisfied: langchain-classic<2.0.0,>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (1.0.7)\n", "Requirement already satisfied: SQLAlchemy<3.0.0,>=1.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (2.0.49)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (3.13.5)\n", "Requirement already satisfied: dataclasses-json<0.7.0,>=0.6.7 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (0.6.7)\n", "Requirement already satisfied: pydantic-settings<3.0.0,>=2.10.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (2.13.1)\n", "Requirement already satisfied: httpx-sse<1.0.0,>=0.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (0.4.3)\n", "Requirement already satisfied: numpy>=1.26.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-community) (2.4.4)\n", "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (2.6.1)\n", "Requirement already satisfied: aiosignal>=1.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.4.0)\n", "Requirement already satisfied: attrs>=17.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (26.1.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.8.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (6.7.1)\n", "Requirement already satisfied: propcache>=0.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (0.4.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.23.0)\n", "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from dataclasses-json<0.7.0,>=0.6.7->langchain-community) (3.26.2)\n", "Requirement already satisfied: typing-inspect<1,>=0.4.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from dataclasses-json<0.7.0,>=0.6.7->langchain-community) (0.9.0)\n", "Requirement already satisfied: python-dotenv>=0.21.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pydantic-settings<3.0.0,>=2.10.1->langchain-community) (1.2.2)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.4.0->langchain) (3.4.7)\n", "Requirement already satisfied: urllib3<3,>=1.26 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests>=2.0.0->langsmith<1.0.0,>=0.3.45->langchain-core<2.0.0,>=1.4.0->langchain) (2.6.3)\n", "Requirement already satisfied: greenlet>=1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from SQLAlchemy<3.0.0,>=1.4.0->langchain-community) (3.5.0)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7.0,>=0.6.7->langchain-community) (1.1.0)\n", "Requirement already satisfied: huggingface-hub<2.0.0,>=0.33.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-huggingface) (0.36.2)\n", "Requirement already satisfied: tokenizers<1.0.0,>=0.19.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from langchain-huggingface) (0.22.2)\n", "Requirement already satisfied: filelock in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<2.0.0,>=0.33.4->langchain-huggingface) (3.29.0)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<2.0.0,>=0.33.4->langchain-huggingface) (2025.3.0)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<2.0.0,>=0.33.4->langchain-huggingface) (1.4.3)\n", "Requirement already satisfied: tqdm>=4.42.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<2.0.0,>=0.33.4->langchain-huggingface) (4.67.3)\n", "Requirement already satisfied: beautifulsoup4<5.0.0,>=4.14.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (4.14.3)\n", "Requirement already satisfied: emoji<3.0.0,>=2.15.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (2.15.0)\n", "Requirement already satisfied: filetype<2.0.0,>=1.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (1.2.0)\n", "Requirement already satisfied: html5lib<2.0.0,>=1.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (1.1)\n", "Requirement already satisfied: installer<1.0.0,>=0.7.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (0.7.0)\n", "Requirement already satisfied: langdetect<2.0.0,>=1.0.9 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (1.0.9)\n", "Requirement already satisfied: lxml<7.0.0,>=5.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (6.1.0)\n", "Requirement already satisfied: numba<1.0.0,>=0.60.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (0.65.0)\n", "Requirement already satisfied: psutil<8.0.0,>=7.2.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (7.2.2)\n", "Requirement already satisfied: python-iso639<2027.0.0,>=2026.1.31 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (2026.4.20)\n", "Requirement already satisfied: python-magic<1.0.0,>=0.4.27 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (0.4.27)\n", "Requirement already satisfied: python-oxmsg<1.0.0,>=0.0.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (0.0.2)\n", "Requirement already satisfied: rapidfuzz<4.0.0,>=3.14.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (3.14.5)\n", "Requirement already satisfied: regex<2027.0.0,>=2024.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (2026.4.4)\n", "Requirement already satisfied: spacy<4.0.0,>=3.7.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (3.8.14)\n", "Requirement already satisfied: unstructured-client<1.0.0,>=0.25.9 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (0.42.12)\n", "Requirement already satisfied: wrapt<3.0.0,>=2.1.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured) (2.1.2)\n", "Requirement already satisfied: soupsieve>=1.6.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from beautifulsoup4<5.0.0,>=4.14.3->unstructured) (2.8.3)\n", "Requirement already satisfied: six>=1.9 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from html5lib<2.0.0,>=1.1->unstructured) (1.17.0)\n", "Requirement already satisfied: webencodings in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from html5lib<2.0.0,>=1.1->unstructured) (0.5.1)\n", "Requirement already satisfied: llvmlite<0.48,>=0.47.0dev0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from numba<1.0.0,>=0.60.0->unstructured) (0.47.0)\n", "Requirement already satisfied: click in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from python-oxmsg<1.0.0,>=0.0.2->unstructured) (8.3.2)\n", "Requirement already satisfied: olefile in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from python-oxmsg<1.0.0,>=0.0.2->unstructured) (0.47)\n", "Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.11 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (3.0.12)\n", "Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (1.0.5)\n", "Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (1.0.15)\n", "Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (2.0.13)\n", "Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (3.0.13)\n", "Requirement already satisfied: thinc<8.4.0,>=8.3.12 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (8.3.13)\n", "Requirement already satisfied: wasabi<1.2.0,>=0.9.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (1.1.3)\n", "Requirement already satisfied: srsly<3.0.0,>=2.5.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (2.5.3)\n", "Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (2.0.10)\n", "Requirement already satisfied: weasel<2.0.0,>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (1.0.0)\n", "Requirement already satisfied: confection<2.0.0,>=1.3.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (1.3.3)\n", "Requirement already satisfied: typer<1.0.0,>=0.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (0.24.1)\n", "Requirement already satisfied: jinja2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (3.1.6)\n", "Requirement already satisfied: setuptools in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from spacy<4.0.0,>=3.7.0->unstructured) (82.0.1)\n", "Requirement already satisfied: blis<1.4.0,>=1.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from thinc<8.4.0,>=8.3.12->spacy<4.0.0,>=3.7.0->unstructured) (1.3.3)\n", "Requirement already satisfied: shellingham>=1.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (1.5.4)\n", "Requirement already satisfied: rich>=12.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (15.0.0)\n", "Requirement already satisfied: annotated-doc>=0.0.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (0.0.4)\n", "Requirement already satisfied: aiofiles>=24.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured-client<1.0.0,>=0.25.9->unstructured) (24.1.0)\n", "Requirement already satisfied: cryptography>=3.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured-client<1.0.0,>=0.25.9->unstructured) (46.0.7)\n", "Requirement already satisfied: pypdf>=6.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured-client<1.0.0,>=0.25.9->unstructured) (6.11.0)\n", "Requirement already satisfied: pypdfium2>=5.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from unstructured-client<1.0.0,>=0.25.9->unstructured) (5.8.0)\n", "Requirement already satisfied: cloudpathlib>=0.7.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from weasel<2.0.0,>=1.0.0->spacy<4.0.0,>=3.7.0->unstructured) (0.24.0)\n", "Requirement already satisfied: smart-open>=5.2.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from weasel<2.0.0,>=1.0.0->spacy<4.0.0,>=3.7.0->unstructured) (7.6.1)\n", "Requirement already satisfied: cffi>=2.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from cryptography>=3.1->unstructured-client<1.0.0,>=0.25.9->unstructured) (2.0.0)\n", "Requirement already satisfied: pycparser in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from cffi>=2.0.0->cryptography>=3.1->unstructured-client<1.0.0,>=0.25.9->unstructured) (3.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (4.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (2.20.0)\n", "Requirement already satisfied: mdurl~=0.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer<1.0.0,>=0.3.0->spacy<4.0.0,>=3.7.0->unstructured) (0.1.2)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jinja2->spacy<4.0.0,>=3.7.0->unstructured) (3.0.3)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: pandas in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (2.3.3)\n", "Requirement already satisfied: numpy>=1.26.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas) (2.4.4)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas) (2026.1.post1)\n", "Requirement already satisfied: tzdata>=2022.7 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from pandas) (2026.1)\n", "Requirement already satisfied: six>=1.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: transformers in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (4.56.2)\n", "Requirement already satisfied: sentence-transformers in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (5.5.0)\n", "Requirement already satisfied: accelerate in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.13.0)\n", "Requirement already satisfied: filelock in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (3.29.0)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.34.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (0.36.2)\n", "Requirement already satisfied: numpy>=1.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (2.4.4)\n", "Requirement already satisfied: packaging>=20.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (26.1)\n", "Requirement already satisfied: pyyaml>=5.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (6.0.3)\n", "Requirement already satisfied: regex!=2019.12.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (2026.4.4)\n", "Requirement already satisfied: requests in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (2.33.1)\n", "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (0.22.2)\n", "Requirement already satisfied: safetensors>=0.4.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (0.7.0)\n", "Requirement already satisfied: tqdm>=4.27 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers) (4.67.3)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (2025.3.0)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (1.4.3)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface-hub<1.0,>=0.34.0->transformers) (4.15.0)\n", "Requirement already satisfied: torch>=1.11.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sentence-transformers) (2.7.1)\n", "Requirement already satisfied: scikit-learn>=0.22.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sentence-transformers) (1.8.0)\n", "Requirement already satisfied: scipy>=1.0.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sentence-transformers) (1.17.1)\n", "Requirement already satisfied: psutil in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from accelerate) (7.2.2)\n", "Requirement already satisfied: joblib>=1.3.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from scikit-learn>=0.22.0->sentence-transformers) (1.5.3)\n", "Requirement already satisfied: threadpoolctl>=3.2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from scikit-learn>=0.22.0->sentence-transformers) (3.6.0)\n", "Requirement already satisfied: setuptools in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (82.0.1)\n", "Requirement already satisfied: sympy>=1.13.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (1.14.0)\n", "Requirement already satisfied: networkx in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (3.6.1)\n", "Requirement already satisfied: jinja2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (3.1.6)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.80)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.5.1.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (9.5.1.17)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (11.3.0.4)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (10.3.7.77)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (11.7.1.2)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.5.4.2)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (0.6.3)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.26.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (2.26.2)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.77)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (12.6.85)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (1.11.1.6)\n", "Requirement already satisfied: triton==3.3.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11.0->sentence-transformers) (3.3.1)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sympy>=1.13.3->torch>=1.11.0->sentence-transformers) (1.3.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jinja2->torch>=1.11.0->sentence-transformers) (3.0.3)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->transformers) (3.4.7)\n", "Requirement already satisfied: idna<4,>=2.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->transformers) (3.11)\n", "Requirement already satisfied: urllib3<3,>=1.26 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->transformers) (2.6.3)\n", "Requirement already satisfied: certifi>=2023.5.7 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->transformers) (2026.2.25)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: faiss-gpu-cu12 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.14.1.post1)\n", "Requirement already satisfied: numpy<3,>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from faiss-gpu-cu12) (2.4.4)\n", "Requirement already satisfied: packaging in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from faiss-gpu-cu12) (26.1)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12>=12.1.105 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from faiss-gpu-cu12) (12.6.77)\n", "Requirement already satisfied: nvidia-cublas-cu12>=12.1.3.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from faiss-gpu-cu12) (12.6.4.1)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: optimum in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (1.27.0)\n", "Requirement already satisfied: transformers>=4.29 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from optimum) (4.56.2)\n", "Requirement already satisfied: torch>=1.11 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from optimum) (2.7.1)\n", "Requirement already satisfied: packaging in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from optimum) (26.1)\n", "Requirement already satisfied: numpy in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from optimum) (2.4.4)\n", "Requirement already satisfied: huggingface_hub>=0.8.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from optimum) (0.36.2)\n", "Requirement already satisfied: filelock in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (3.29.0)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (2025.3.0)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.1.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (1.4.3)\n", "Requirement already satisfied: pyyaml>=5.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (6.0.3)\n", "Requirement already satisfied: requests in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (2.33.1)\n", "Requirement already satisfied: tqdm>=4.42.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (4.67.3)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from huggingface_hub>=0.8.0->optimum) (4.15.0)\n", "Requirement already satisfied: setuptools in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (82.0.1)\n", "Requirement already satisfied: sympy>=1.13.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (1.14.0)\n", "Requirement already satisfied: networkx in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (3.6.1)\n", "Requirement already satisfied: jinja2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (3.1.6)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.77)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.80)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.5.1.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (9.5.1.17)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (11.3.0.4)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (10.3.7.77)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (11.7.1.2)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.5.4.2)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (0.6.3)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.26.2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (2.26.2)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.77)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (12.6.85)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (1.11.1.6)\n", "Requirement already satisfied: triton==3.3.1 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from torch>=1.11->optimum) (3.3.1)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from sympy>=1.13.3->torch>=1.11->optimum) (1.3.0)\n", "Requirement already satisfied: regex!=2019.12.17 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers>=4.29->optimum) (2026.4.4)\n", "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers>=4.29->optimum) (0.22.2)\n", "Requirement already satisfied: safetensors>=0.4.3 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from transformers>=4.29->optimum) (0.7.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from jinja2->torch>=1.11->optimum) (3.0.3)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->huggingface_hub>=0.8.0->optimum) (3.4.7)\n", "Requirement already satisfied: idna<4,>=2.5 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->huggingface_hub>=0.8.0->optimum) (3.11)\n", "Requirement already satisfied: urllib3<3,>=1.26 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->huggingface_hub>=0.8.0->optimum) (2.6.3)\n", "Requirement already satisfied: certifi>=2023.5.7 in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (from requests->huggingface_hub>=0.8.0->optimum) (2026.2.25)\n", "Note: you may need to restart the kernel to use updated packages.\n", "Looking in indexes: http://mirrors.aliyun.com/pypi/simple\n", "Requirement already satisfied: numpy in /root/autodl-tmp/AI-Guide-and-Demos-zh_CN/.venv/lib/python3.12/site-packages (2.4.4)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install langchain langchain-community langchain-text-splitters langchain-huggingface unstructured \n", "%pip install pandas\n", "%pip install transformers sentence-transformers accelerate\n", "%pip install faiss-gpu-cu12\n", "%pip install optimum\n", "%pip install numpy" ] }, { "cell_type": "markdown", "id": "031fe481-99e4-4542-a185-e411bc5d468e", "metadata": {}, "source": [ "loader.load() 报错的时候执行以下代码\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "ec84e705-620e-4e46-84bc-31c0b208b50c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Downloading package punkt to /root/nltk_data...\n", "[nltk_data] Package punkt is already up-to-date!\n", "[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n", "[nltk_data] Package punkt_tab is already up-to-date!\n", "[nltk_data] Downloading package averaged_perceptron_tagger to\n", "[nltk_data] /root/nltk_data...\n", "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", "[nltk_data] date!\n", "[nltk_data] Downloading package averaged_perceptron_tagger_eng to\n", "[nltk_data] /root/nltk_data...\n", "[nltk_data] Package averaged_perceptron_tagger_eng is already up-to-\n", "[nltk_data] date!\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import nltk\n", "\n", "nltk.download('punkt')\n", "nltk.download('punkt_tab')\n", "nltk.download('averaged_perceptron_tagger')\n", "nltk.download('averaged_perceptron_tagger_eng')" ] }, { "cell_type": "markdown", "id": "72add581-aad1-490b-a63a-98063f90544e", "metadata": {}, "source": [ "## RA" ] }, { "cell_type": "code", "execution_count": 3, "id": "229e819b-c471-4010-aace-80d8fa0138ac", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "什么是 Top-K 和 Top-P 采样?Temperature 如何影响生成结果?\n", "\n", "在文章 09 中我们探讨了 Beam Search 和 Greedy Search,现在来聊聊 model.generate() 中常见的三个参数: top-k, top-p 和 temperature。\n", "\n", "代码文件下载\n", "\n", "在线链接:Kaggle | Colab\n", "\n", "目录\n", "\n", "采样方法概述\n", "\n", "Top-K 采样详解\n", "\n" ] } ], "source": [ "import os\n", "# 设置模型下载镜像\n", "os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n", "\n", "from langchain_community.document_loaders import DirectoryLoader\n", "\n", "# 定义文件所在的路径\n", "DOC_PATH = \"../Guide\"\n", "\n", "# 使用 DirectoryLoader 从指定路径加载文件。\"*.md\" 表示加载所有 .md 格式的文件,这里仅导入文章 10(避免文章 20 的演示内容对结果的影响)\n", "loader = DirectoryLoader(DOC_PATH, glob=\"10*.md\")\n", "\n", "# 加载目录中的指定的 .md 文件并将其转换为文档对象列表\n", "documents = loader.load()\n", "\n", "# 打印查看加载的文档内容(可以注意到是去除了 markdown 标记的)\n", "print(documents[0].page_content[:200])" ] }, { "cell_type": "markdown", "id": "b2024a56-bd30-4999-9819-79872a9722f1", "metadata": {}, "source": [ "### 文本处理\n", "\n", "> 或许你对 chunk 会有一点印象,在 [15. 用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频助手](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/15.%20用%20API%20实现%20AI%20视频摘要:动手制作属于你的%20AI%20视频助手.md#拆分文本)中,我们使用了非常简单的分块方法(直接截断)。\n", ">\n", "> LangChain 提供了多种文本分块方式,例如 [RecursiveCharacterTextSplitter](https://python.langchain.com/api_reference/text_splitters/character/langchain_text_splitters.character.RecursiveCharacterTextSplitter.html)、[HTMLSectionSplitter](https://python.langchain.com/api_reference/text_splitters/html/langchain_text_splitters.html.HTMLSectionSplitter.html)、[MarkdownTextSplitter](https://python.langchain.com/api_reference/text_splitters/markdown/langchain_text_splitters.markdown.MarkdownTextSplitter.html) 等,可以根据需求选择。本文将演示 `RecursiveCharacterTextSplitter`。\n", "\n", "不过,在使用 `split_documents()` 处理文档之前,我们先使用 `split_text()` 来看看它究竟是怎么进行分块的。摘取一段[长隆万圣节](https://www.chimelong.com/gz/chimelongparadise/news/1718.html)的文本介绍:" ] }, { "cell_type": "code", "execution_count": 4, "id": "1ba0eb02-a932-4883-81e6-fc0ae97d677a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "581\n" ] } ], "source": [ "text = \"\"\"长隆广州世界嘉年华系列活动的长隆欢乐世界潮牌玩圣节隆重登场,在揭幕的第一天就吸引了大批年轻人前往打卡。据悉,这是长隆欢乐世界重金引进来自欧洲的12种巨型花车重磅出巡,让人宛若进入五彩缤纷的巨人国;全新的超级演艺广场每晚开启狂热的电音趴,将整个狂欢氛围推向高点。\n", "\n", "记者在现场看到,明日之城、异次元界、南瓜欢乐小镇、暗黑城、魔域,五大风格迥异的“鬼”域在夜晚正式开启,全新重磅升级的十大“鬼”屋恭候着各位的到来,各式各样的“鬼”开始神出“鬼”没:明日之城中丧尸成群出行,寻找新鲜的“血肉”。异次元界异形生物游走,美丽冷艳之下暗藏危机。暗黑城亡灵出没,诅咒降临。魔域异“鬼”横行,上演“血腥恐怖”。南瓜欢乐小镇小丑当家,滑稽温馨带来欢笑。五大“鬼”域以灯光音效科技情景+氛围营造360°沉浸式异域次元界探险模式为前来狂欢的“鬼”友们献上“惊奇、恐怖、搞怪、欢乐”的玩圣体验。持续23天的长隆欢乐玩圣节将挑战游客的认知极限,让你大开眼界!\n", "据介绍,今年长隆玩圣节与以往相比更为隆重,沉浸式场景营造惊悚氛围,两大新“鬼”王隆重登场,盛大的“鬼”王出巡仪式、数十种集声光乐和高科技于一体的街头表演、死亡巴士酷跑、南瓜欢乐小镇欢乐电音、暗黑城黑暗朋克、魔术舞台双煞魔舞、异形魔幻等一系列精彩节目无不让人拍手称奇、惊叹不止的“玩圣”盛宴让 “鬼”友们身临其境,过足“戏”瘾!\n", "\"\"\"\n", "print(len(text))" ] }, { "cell_type": "markdown", "id": "1c29c603-13a9-4477-bdbd-e3bb6fc566e1", "metadata": {}, "source": [ "这段文本长度为 581。接下来看看结果如何:" ] }, { "cell_type": "code", "execution_count": 5, "id": "efae196a-42ae-4509-83ce-20120fa8aae6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", "100\n", "出巡,让人宛若进入五彩缤纷的巨人国;全新\n", "出巡,让人宛若进入五彩缤纷的巨人国;全新\n" ] } ], "source": [ "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "# 创建一个文本分割器。\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=100, # 每个文本块的最大长度\n", " chunk_overlap=20 # 文本块之间的字符重叠数量\n", ")\n", "\n", "# 将文本分割成多个块\n", "texts = text_splitter.split_text(text)\n", "\n", "# 打印分割后的文本块数量\n", "print(len(texts))\n", "\n", "# 打印第一个文本块的长度\n", "print(len(texts[0]))\n", "\n", "# 打印第一个文本块的最后 20 个字符\n", "print(texts[0][80:])\n", "\n", "# 打印第二个文本块的前 20 个字符\n", "print(texts[1][:20])" ] }, { "cell_type": "markdown", "id": "12fa7183-9c02-42a8-9118-8ae856d99835", "metadata": {}, "source": [ "> 你可以通过下图来理解 overlap:\n", ">\n", "> ![文本处理](../Guide/assets/%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86.png)\n", "\n", "到目前为止,`RecursiveCharacterTextSplitter` 的表现就像是一个简单的文本截断,没有什么特别之处。但是,让我们观察 `len(text)` 和 `len(texts)`:原文本长度为 581,分割后的段落数为 9,问题出现了。按照直接截断的假设,前 8 段应为 100 个字符,即便去除 overlap,总长度仍应超过 600,这与原始文本的长度不符。说明文本分割过程中一定执行了其他操作,而不仅仅是直接截断。\n", "\n", "实际上,`RecursiveCharacterTextSplitter()` 的关键在于 **RecursiveCharacter**,即**递归地按照指定的分隔符**(默认为 `[\"\\n\\n\", \"\\n\", \" \", \"\"]`)进行文本拆分。也就是说,在文本拆分的时候,它会尝试使用较大的分隔符来拆分文本,如果长度仍超过 `chunk_size`,则逐步使用更小的分隔符,直到长度满足或最终进行截断,也就是出现第一次分块当中的结果。所以说,第一次的分块实际上是一个“妥协”。\n", "\n", "为了更好的进行理解,现在将 `chunk_overlap` 设置为 0,并打印输出:" ] }, { "cell_type": "code", "execution_count": 6, "id": "5eefda1e-089b-42b4-9ea3-8b69ad46dec6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chunk 1 length: 100\n", "长隆广州世界嘉年华系列活动的长隆欢乐世界潮牌玩圣节隆重登场,在揭幕的第一天就吸引了大批年轻人前往打卡。据悉,这是长隆欢乐世界重金引进来自欧洲的12种巨型花车重磅出巡,让人宛若进入五彩缤纷的巨人国;全新\n", "--------------------------------------------------\n", "Chunk 2 length: 30\n", "的超级演艺广场每晚开启狂热的电音趴,将整个狂欢氛围推向高点。\n", "--------------------------------------------------\n", "Chunk 3 length: 99\n", "记者在现场看到,明日之城、异次元界、南瓜欢乐小镇、暗黑城、魔域,五大风格迥异的“鬼”域在夜晚正式开启,全新重磅升级的十大“鬼”屋恭候着各位的到来,各式各样的“鬼”开始神出“鬼”没:明日之城中丧尸成群\n", "--------------------------------------------------\n", "Chunk 4 length: 100\n", "出行,寻找新鲜的“血肉”。异次元界异形生物游走,美丽冷艳之下暗藏危机。暗黑城亡灵出没,诅咒降临。魔域异“鬼”横行,上演“血腥恐怖”。南瓜欢乐小镇小丑当家,滑稽温馨带来欢笑。五大“鬼”域以灯光音效科技情\n", "--------------------------------------------------\n", "Chunk 5 length: 85\n", "景+氛围营造360°沉浸式异域次元界探险模式为前来狂欢的“鬼”友们献上“惊奇、恐怖、搞怪、欢乐”的玩圣体验。持续23天的长隆欢乐玩圣节将挑战游客的认知极限,让你大开眼界!\n", "--------------------------------------------------\n", "Chunk 6 length: 99\n", "据介绍,今年长隆玩圣节与以往相比更为隆重,沉浸式场景营造惊悚氛围,两大新“鬼”王隆重登场,盛大的“鬼”王出巡仪式、数十种集声光乐和高科技于一体的街头表演、死亡巴士酷跑、南瓜欢乐小镇欢乐电音、暗黑城黑\n", "--------------------------------------------------\n", "Chunk 7 length: 46\n", "暗朋克、魔术舞台双煞魔舞、异形魔幻等一系列精彩节目无不让人拍手称奇、惊叹不止的“玩圣”盛宴让\n", "--------------------------------------------------\n", "Chunk 8 length: 17\n", "“鬼”友们身临其境,过足“戏”瘾!\n", "--------------------------------------------------\n" ] } ], "source": [ "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=100,\n", " chunk_overlap=0 # 不重叠\n", ")\n", "texts = text_splitter.split_text(text)\n", "\n", "# 输出每个片段的长度和内容\n", "for i, t in enumerate(texts):\n", " print(f\"Chunk {i+1} length: {len(t)}\")\n", " print(t)\n", " print(\"-\" * 50)" ] }, { "cell_type": "markdown", "id": "37d583a2-4d19-48ed-a41a-6ff42c14a724", "metadata": {}, "source": [ "可以看到,文本在 `全新` 和 `出巡` 之间被截断,因为达到了 100 个字符的限制,这符合直觉。然而,接下来的 `chunk 2` 只有 30 个字符,这是因为 `RecursiveCharacterTextSplitter` 并不是逐「段」分割,而是逐「分隔符」分割。" ] }, { "cell_type": "markdown", "id": "762c5210-7529-459e-937d-ee386064be92", "metadata": {}, "source": [ "❌ `length_function` 错误示范:\n", "\n", "此时无论多长,`text_splitter._length_function()` 都返回为1,所以对任一分割的文本来说,都是一个 `_good_splits`。" ] }, { "cell_type": "code", "execution_count": 7, "id": "30977432-4013-488e-9e89-65da6ab32660", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chunk 1 length: 580\n", "1\n" ] } ], "source": [ "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=100,\n", " chunk_overlap=0,\n", " length_function=lambda x: 1,\n", ")\n", "texts = text_splitter.split_text(text)\n", "\n", "# 输出每个片段的长度和内容\n", "for i, t in enumerate(texts):\n", " print(f\"Chunk {i+1} length: {len(t)}\")\n", "\n", "print(text_splitter._length_function(\"Hello\"))" ] }, { "cell_type": "markdown", "id": "d38beada-7b0b-41dc-b743-c458d9cb589f", "metadata": {}, "source": [ "回归正题,处理文档:\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "ba1e1960-8b17-4cce-be50-4ff84641e39e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "18\n" ] } ], "source": [ "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=500, # 尝试调整它\n", " chunk_overlap=100, # 尝试调整它\n", " #length_function=len, # 可以省略\n", " #separators=[\"\\n\\n\", \"\\n\", \" \", \"。\", \"\"] # 可以省略\n", ")\n", "docs = text_splitter.split_documents(documents)\n", "\n", "print(len(docs))" ] }, { "cell_type": "markdown", "id": "6bc8f595-327c-4e8e-9308-a920ee09f1ea", "metadata": {}, "source": [ "### 加载编码模型\n", "\n", "接下来,使用 `HuggingFaceEmbeddings` 加载 Hugging Face 上的预训练模型:\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "f2e2a7b0-4f46-4756-983a-af9a60e274bf", "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "cf4cf8fa64ff4582adc221838af0048a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Loading checkpoint shards: 0%| | 0/2 [00:00 常用于 G (生成)的模型通常是 **Decoder-only** 架构,典型代表是 GPT 系列。\n", "\n", "### 加载文本生成模型\n", "\n", "这里我们选择 [19a](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/19a.%20从加载到对话:使用%20Transformers%20本地运行量化%20LLM%20大模型(GPTQ%20%26%20AWQ).md#前言) 所使用的量化模型,当然,你可以替换它:" ] }, { "cell_type": "code", "execution_count": 15, "id": "91f516ed-d4c2-48a0-95d1-3d049940941f", "metadata": { "scrolled": true }, "outputs": [], "source": [ "from transformers import AutoTokenizer, AutoModelForCausalLM\n", "\n", "# 文本生成模型\n", "model_path = 'Qwen/Qwen2.5-1.5B-Instruct'\n", "\n", "# 加载\n", "tokenizer = AutoTokenizer.from_pretrained(model_path)\n", "model = AutoModelForCausalLM.from_pretrained(\n", " model_path,\n", " dtype=\"auto\", # 自动选择模型的权重数据类型\n", " device_map=\"auto\", # 自动选择可用的设备(CPU/GPU)\n", ")" ] }, { "cell_type": "markdown", "id": "9fd29b7d-aafb-4f8c-9046-cdae8633a28b", "metadata": {}, "source": [ "### 创建管道\n", "\n", "使用 Transformers 的 `pipeline` 创建一个文本生成器:" ] }, { "cell_type": "code", "execution_count": 16, "id": "dd88441e-4e75-4d72-91ae-a2f8d469f233", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Device set to use cuda:0\n" ] } ], "source": [ "from transformers import pipeline\n", "\n", "generator = pipeline(\n", " \"text-generation\", # 指定任务类型为文本生成\n", " model=model,\n", " tokenizer=tokenizer,\n", " max_length=4096, # 指定生成文本的最大长度\n", " pad_token_id=tokenizer.eos_token_id\n", ")" ] }, { "cell_type": "markdown", "id": "7e2a86c3-f9dc-44cd-baa7-0566122213fe", "metadata": {}, "source": [ "`pipeline()` 的第一个参数 [task](https://huggingface.co/docs/transformers/main_classes/pipelines#transformers.pipeline.task) 并不是可以随意自定义的名称,而是特定任务的标识。例如,\"text-generation\" 对应于构造一个 [TextGenerationPipeline](https://huggingface.co/docs/transformers/v4.45.2/en/main_classes/pipelines#transformers.TextGenerationPipeline),用于生成文本。" ] }, { "cell_type": "markdown", "id": "9a444cda-b454-437f-9f29-9cbeb795d5fa", "metadata": {}, "source": [ "### 集成到 LangChain\n", "\n", "使用 LangChain 的 `HuggingFacePipeline` 将生成器包装为 LLM 接口:" ] }, { "cell_type": "code", "execution_count": 17, "id": "5b1fde7d-8eb7-474c-bdfc-481a61c5a816", "metadata": {}, "outputs": [], "source": [ "from langchain_huggingface import HuggingFacePipeline\n", "\n", "llm = HuggingFacePipeline(pipeline=generator)" ] }, { "cell_type": "markdown", "id": "bdc0246c-ff99-483d-8df3-6b3038ab6791", "metadata": {}, "source": [ "### 定义提示词模版\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "b094ece9-f1ff-48b7-a6a1-eaafaf123343", "metadata": {}, "outputs": [], "source": [ "from langchain_core.prompts import ChatPromptTemplate\n", "\n", "# 使用 LCEL 的 ChatPromptTemplate\n", "# 标签有助于模型区分上下文和问题,虽然不是必须的,但推荐这样做\n", "prompt = ChatPromptTemplate.from_template(\"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", "\n", "\n", "{context}\n", "\n", "\n", "Question: {input}\n", "Answer:\"\"\")" ] }, { "cell_type": "markdown", "id": "45de0416-083c-4d57-8367-e5ab53c5701e", "metadata": {}, "source": [ "## 构建问答链\n", "\n", "使用检索器和 LLM 创建问答链:" ] }, { "cell_type": "code", "execution_count": 19, "id": "9f1f7587-71cd-4d49-a241-1c570c48be62", "metadata": {}, "outputs": [], "source": [ "# LCEL: 用纯 langchain-core 组装 RAG 链,不依赖 langchain_classic.chains\n", "from langchain_core.runnables import RunnablePassthrough\n", "from langchain_core.output_parsers import StrOutputParser\n", "\n", "def format_docs(docs):\n", " return \"\\n\\n\".join(d.page_content for d in docs)\n", "\n", "qa_chain = (\n", " {\"context\": retriever | format_docs, \"input\": RunnablePassthrough()}\n", " | prompt\n", " | llm\n", " | StrOutputParser()\n", ")\n" ] }, { "cell_type": "markdown", "id": "2c9b7be2-4ae8-4329-a919-7ea4f4124ad0", "metadata": {}, "source": [ "`chain_type` 参数说明:\n", "\n", "- **stuff**\n", " 将所有检索到的文档片段直接与问题“堆叠”在一起,传递给 LLM。这种方式简单直接,但当文档数量较多时,可能会超过模型的上下文长度限制。\n", "\n", "- **map_reduce**\n", "\n", " 对每个文档片段分别生成回答(map 阶段),然后将所有回答汇总为最终答案(reduce 阶段)。\n", "\n", "- **refine**\n", "\n", " 先对第一个文档片段生成初始回答,然后依次读取后续文档,对答案进行逐步细化和完善。\n", "\n", "- **map_rerank**\n", "\n", " 对每个文档片段分别生成回答,并为每个回答打分,最终选择得分最高的回答作为答案。\n", "\n", "> `map_reduce` 和 `refine` 在[用 API 实现 AI 视频摘要](https://github.com/Hoper-J/AI-Guide-and-Demos-zh_CN/blob/master/Guide/15.%20用%20API%20实现%20AI%20视频摘要:动手制作属于你的%20AI%20视频助手.md#这里演示两种摘要方式)一文中有简单的概念解释。\n", "\n" ] }, { "cell_type": "markdown", "id": "ff945771-dea1-4252-acae-e4d2eaaf0f0c", "metadata": {}, "source": [ "## 进行 QA\n", "\n", "生成可能需要等待几分钟。\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "bd4fc917-9ccf-4651-a4d1-50b842460776", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Human: Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", "\n", "\n", "什么是 Top-K 和 Top-P 采样?Temperature 如何影响生成结果?\n", "\n", "在文章 09 中我们探讨了 Beam Search 和 Greedy Search,现在来聊聊 model.generate() 中常见的三个参数: top-k, top-p 和 temperature。\n", "\n", "代码文件下载\n", "\n", "在线链接:Kaggle | Colab\n", "\n", "目录\n", "\n", "采样方法概述\n", "\n", "Top-K 采样详解\n", "\n", "工作原理\n", "\n", "数学表述\n", "\n", "代码示例\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "数学表述\n", "\n", "代码示例\n", "\n", "Temperature 的作用\n", "\n", "工作原理\n", "\n", "代码示例\n", "\n", "在大模型中的应用\n", "\n", "Top-K 和 Top-P 采样是否可以一起使用?\n", "\n", "如果我只想使用 Top-K 或者 Top-P 应该怎么办?\n", "\n", "参考链接\n", "\n", "在生成文本时,模型为每个可能的下一个词汇分配一个概率分布,选择下一个词汇的策略直接决定了输出的质量和多样性。以下是几种常见的选择方法:\n", "\n", "Greedy Search(贪心搜索): 每次选择概率最高的词汇。\n", "\n", "Beam Search(束搜索): 保留多个候选序列,平衡生成质量和多样性。\n", "\n", "输出:\n", "\n", "Top-K 采样选择的词汇和对应的概率: \n", "C: 0.22\n", "B: 0.33\n", "A: 0.44\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "Top-P 采样(又称 Nucleus Sampling)是一种动态选择候选词汇的方法。与 Top-K 采样不同,Top-P 采样不是固定选择 $K$ 个词汇,而是选择一组累计概率达到 $P$ 的词汇集合(即从高到低加起来的概率)。这意味着 Top-P 采样可以根据当前的概率分布动态调整候选词汇的数量,从而更好地平衡生成的多样性和质量。\n", "\n", "步骤:\n", "\n", "获取概率分布: 模型为每个可能的下一个词汇生成一个概率分布。\n", "\n", "排序概率: 将词汇按照概率从高到低排序。\n", "\n", "累积概率: 计算累积概率,直到达到预设的阈值 $P$。\n", "\n", "筛选 Top-P: 选择累积概率达到 $P$ 的最小词汇集合。\n", "\n", "重新归一化: 将筛选后的词汇概率重新归一化。\n", "\n", "采样: 根据重新归一化后的概率分布,从 Top-P 词汇中随机采样一个词汇作为下一个生成的词。\n", "\n", "数学表述\n", "\n", "设 $V$ 为词汇表, $P(y|Y)$ 为在给定上下文 $Y$ 下生成词汇 $y$ 的概率。\n", "\n", "# 设置 Top-K\n", "K = 3\n", "\n", "# 获取概率最高的 K 个词汇索引\n", "top_indices = np.argsort(probs)[-K:]\n", "\n", "# 保留这些 K 个词汇及其概率\n", "top_k_probs = np.zeros_like(probs)\n", "top_k_probs[top_indices] = probs[top_indices]\n", "\n", "# 归一化保留的 K 个词汇的概率\n", "top_k_probs = top_k_probs / np.sum(top_k_probs)\n", "\n", "# 打印 Top-K 采样的结果\n", "print(\"Top-K 采样选择的词汇和对应的概率:\")\n", "for i in top_indices:\n", " print(f\"{words[i]}: {top_k_probs[i]:.2f}\")\n", "\n", "输出:\n", "\n", "Top-K 采样选择的词汇和对应的概率: \n", "C: 0.22\n", "B: 0.33\n", "A: 0.44\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "\n", "Question: Top-K 和 Top-P 的区别是什么?\n", "Answer: Top-K 是选择前 $K$ 大概率的词汇,而 Top-P 是选择累计概率达到 $P$ 的词汇集合。Top-P 更适合生成多样化但不完全随机的结果,因为它能更灵活地控制词汇的选择数量。相比之下,Top-K 通常用于确保输出具有一定的连贯性,因为它保持了较高的概率分布一致性。Top-P 在实际应用中常用于生成高质量的文本,特别是在需要保持语义连贯性的场景下。例如,在自然语言处理任务中,Top-P 可以帮助生成更加连贯、逻辑合理的句子。因此,根据具体的应用需求,可以选择 Top-K 或 Top-P 进行采样。但是,这两种方法不能同时使用,因为它们的工作机制不同,可能会产生冲突的结果。\n" ] } ], "source": [ "# 提出问题\n", "query = \"Top-K 和 Top-P 的区别是什么?\"\n", "\n", "# 获取答案(LCEL 版本直接返回字符串)\n", "answer = qa_chain.invoke(query)\n", "print(answer)\n" ] }, { "cell_type": "markdown", "id": "62f57144-58bb-4f55-86e5-373d66a27879", "metadata": {}, "source": [ "实际上,LangChain 并非必需。你可以观察到,代码对于模型的处理完全可以基于 Transformers,文档的递归分割实际上也可以自己构造函数来实现,使用 LangChain 只是为了将其引入我们的视野。" ] }, { "cell_type": "markdown", "id": "eaaf6b33-6ad2-4178-9f84-65634127d3d6", "metadata": {}, "source": [ "## 完整代码\n" ] }, { "cell_type": "code", "execution_count": 21, "id": "56805985-689a-4a41-b939-d3a5e2f29b8b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "01aa6d05fe434347a809f97235e0d795", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Loading checkpoint shards: 0%| | 0/2 [00:00\n", "什么是 Top-K 和 Top-P 采样?Temperature 如何影响生成结果?\n", "\n", "在文章 09 中我们探讨了 Beam Search 和 Greedy Search,现在来聊聊 model.generate() 中常见的三个参数: top-k, top-p 和 temperature。\n", "\n", "代码文件下载\n", "\n", "在线链接:Kaggle | Colab\n", "\n", "目录\n", "\n", "采样方法概述\n", "\n", "Top-K 采样详解\n", "\n", "工作原理\n", "\n", "数学表述\n", "\n", "代码示例\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "数学表述\n", "\n", "代码示例\n", "\n", "Temperature 的作用\n", "\n", "工作原理\n", "\n", "代码示例\n", "\n", "在大模型中的应用\n", "\n", "Top-K 和 Top-P 采样是否可以一起使用?\n", "\n", "如果我只想使用 Top-K 或者 Top-P 应该怎么办?\n", "\n", "参考链接\n", "\n", "在生成文本时,模型为每个可能的下一个词汇分配一个概率分布,选择下一个词汇的策略直接决定了输出的质量和多样性。以下是几种常见的选择方法:\n", "\n", "Greedy Search(贪心搜索): 每次选择概率最高的词汇。\n", "\n", "Beam Search(束搜索): 保留多个候选序列,平衡生成质量和多样性。\n", "\n", "输出:\n", "\n", "Top-K 采样选择的词汇和对应的概率: \n", "C: 0.22\n", "B: 0.33\n", "A: 0.44\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "Top-P 采样(又称 Nucleus Sampling)是一种动态选择候选词汇的方法。与 Top-K 采样不同,Top-P 采样不是固定选择 $K$ 个词汇,而是选择一组累计概率达到 $P$ 的词汇集合(即从高到低加起来的概率)。这意味着 Top-P 采样可以根据当前的概率分布动态调整候选词汇的数量,从而更好地平衡生成的多样性和质量。\n", "\n", "步骤:\n", "\n", "获取概率分布: 模型为每个可能的下一个词汇生成一个概率分布。\n", "\n", "排序概率: 将词汇按照概率从高到低排序。\n", "\n", "累积概率: 计算累积概率,直到达到预设的阈值 $P$。\n", "\n", "筛选 Top-P: 选择累积概率达到 $P$ 的最小词汇集合。\n", "\n", "重新归一化: 将筛选后的词汇概率重新归一化。\n", "\n", "采样: 根据重新归一化后的概率分布,从 Top-P 词汇中随机采样一个词汇作为下一个生成的词。\n", "\n", "数学表述\n", "\n", "设 $V$ 为词汇表, $P(y|Y)$ 为在给定上下文 $Y$ 下生成词汇 $y$ 的概率。\n", "\n", "# 设置 Top-K\n", "K = 3\n", "\n", "# 获取概率最高的 K 个词汇索引\n", "top_indices = np.argsort(probs)[-K:]\n", "\n", "# 保留这些 K 个词汇及其概率\n", "top_k_probs = np.zeros_like(probs)\n", "top_k_probs[top_indices] = probs[top_indices]\n", "\n", "# 归一化保留的 K 个词汇的概率\n", "top_k_probs = top_k_probs / np.sum(top_k_probs)\n", "\n", "# 打印 Top-K 采样的结果\n", "print(\"Top-K 采样选择的词汇和对应的概率:\")\n", "for i in top_indices:\n", " print(f\"{words[i]}: {top_k_probs[i]:.2f}\")\n", "\n", "输出:\n", "\n", "Top-K 采样选择的词汇和对应的概率: \n", "C: 0.22\n", "B: 0.33\n", "A: 0.44\n", "\n", "Top-P 采样详解\n", "\n", "工作原理\n", "\n", "\n", "Question: Top-K 和 Top-P 的区别是什么?\n", "Answer: \n", "\n", "Assistant: Top-K 和 Top-P 是两种不同的采样方法,用于在生成文本时选择词汇。它们的主要区别在于如何确定最终选择的词汇集:\n", "\n", "1. **Top-K 采样**:\n", " - 选择前 K 个词汇,并根据其概率进行排序。\n", " - 这种方法固定地选取前 K 个最有可能出现的词汇,但没有考虑到词汇之间的关系。\n", " - 示例代码中,选择了词汇 C、B 和 A,并且它们的对应概率分别是 0.22、0.33 和 0.44。\n", "\n", "2. **Top-P 采样(Nucleus Sampling)**:\n", " - 确保累计概率达到某个特定阈值 P 的词汇集合。\n", " - 通过逐步累加词汇的概率,找到第一个满足条件的词汇集合。\n", " - 这种方法能够更准确地平衡生成的多样性与质量,因为它考虑到了词汇间的相对重要性。\n", " - 示例代码中,计算出的 Top-P 词汇是 C、B 和 A,它们的累积概率分别达到了 0.77、1.08 和 1.52。\n", "\n", "总结来说,Top-K 采样简单直观,但它可能会导致词汇之间缺乏关联;而 Top-P 采样则更加复杂,它能更好地处理词汇之间的相互依赖关系,因此在实际应用中更为常用。\n" ] } ], "source": [ "from langchain_community.document_loaders import DirectoryLoader\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "from langchain_community.vectorstores import FAISS\n", "from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline\n", "from langchain_huggingface import HuggingFaceEmbeddings, HuggingFacePipeline\n", "\n", "# 新增 LCEL 相关导入\n", "from langchain_core.prompts import ChatPromptTemplate\n", "\n", "# 定义文件所在的路径\n", "DOC_PATH = \"../Guide\"\n", "\n", "# 使用 DirectoryLoader 从指定路径加载文件。\"*.md\" 表示加载所有 .md 格式的文件,这里仅导入文章 10(避免文章 20 的演示内容对结果的影响)\n", "loader = DirectoryLoader(DOC_PATH, glob=\"10*.md\")\n", "\n", "# 加载目录中的指定的 .md 文件并将其转换为文档对象列表\n", "documents = loader.load()\n", "\n", "# 文本处理\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " chunk_size=500, # 尝试调整它\n", " chunk_overlap=100, # 尝试调整它\n", " #length_function=len, # 可以省略\n", " #separators=[\"\\n\\n\", \"\\n\", \" \", \"。\", \"\"] # 可以省略\n", ")\n", "docs = text_splitter.split_documents(documents)\n", "\n", "# 生成嵌入(使用 Hugging Face 模型)\n", "# 指定要加载的预训练模型的名称,参考排行榜:https://huggingface.co/spaces/mteb/leaderboard\n", "model_name = \"tencent/Youtu-Embedding\"\n", "\n", "# 创建 Hugging Face 的嵌入模型实例,这个模型将用于将文本转换为向量表示(embedding)\n", "# Youtu-Embedding 自带自定义模型代码(按新版 transformers 编写),本项目固定 transformers<4.57,\n", "# LossKwargs 在新版已更名为 TransformersKwargs,这里做等价别名 shim 后再加载\n", "import transformers.utils as _tu\n", "if not hasattr(_tu, \"LossKwargs\"):\n", " _tu.LossKwargs = _tu.TransformersKwargs\n", "\n", "embedding_model = HuggingFaceEmbeddings(\n", " model_name=model_name,\n", " model_kwargs={\n", " \"trust_remote_code\": True,\n", " # 内层 model_kwargs 由 SentenceTransformer 转发给 transformers,指定 fp16 省显存\n", " \"model_kwargs\": {\"dtype\": \"float16\"},\n", " },\n", ")\n", "\n", "# 建立向量数据库\n", "vectorstore = FAISS.from_documents(docs, embedding_model)\n", "\n", "# 保存向量数据库(可选)\n", "#vectorstore.save_local(\"faiss_index\")\n", "\n", "# 加载向量数据库(可选)\n", "# 注意参数 allow_dangerous_deserialization,确保你完全信任需要加载的数据库(当然,自己生成的不需要考虑这一点)\n", "#vectorstore = FAISS.load_local(\"faiss_index\", embedding_model, allow_dangerous_deserialization=True)\n", "\n", "# 创建检索器\n", "retriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})\n", "\n", "# 加载文本生成模型\n", "model_path = 'Qwen/Qwen2.5-1.5B-Instruct'\n", "\n", "# 加载\n", "tokenizer = AutoTokenizer.from_pretrained(model_path)\n", "model = AutoModelForCausalLM.from_pretrained(\n", " model_path,\n", " dtype=\"auto\", # 自动选择模型的权重数据类型\n", " device_map=\"auto\", # 自动选择可用的设备(CPU/GPU)\n", ")\n", "\n", "# 创建文本生成管道\n", "generator = pipeline(\n", " \"text-generation\", # 指定任务类型为文本生成\n", " model=model,\n", " tokenizer=tokenizer,\n", " max_length=4096, # 指定生成文本的最大长度\n", " pad_token_id=tokenizer.eos_token_id\n", ")\n", "\n", "# 包装为 LangChain 的 LLM 接口\n", "llm = HuggingFacePipeline(pipeline=generator)\n", "\n", "# --- LCEL 更改部分 ---\n", "\n", "# 定义 Prompt\n", "prompt = ChatPromptTemplate.from_template(\"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.\n", "\n", "\n", "{context}\n", "\n", "\n", "Question: {input}\n", "Answer:\"\"\")\n", "\n", "# LCEL: 用纯 langchain-core 组装 RAG 链,不依赖 langchain_classic.chains\n", "from langchain_core.runnables import RunnablePassthrough\n", "from langchain_core.output_parsers import StrOutputParser\n", "\n", "def format_docs(docs):\n", " return \"\\n\\n\".join(d.page_content for d in docs)\n", "\n", "qa_chain = (\n", " {\"context\": retriever | format_docs, \"input\": RunnablePassthrough()}\n", " | prompt\n", " | llm\n", " | StrOutputParser()\n", ")\n", "\n", "# 提出问题\n", "query = \"Top-K 和 Top-P 的区别是什么?\"\n", "\n", "# 获取答案(LCEL 版本直接返回字符串)\n", "answer = qa_chain.invoke(query)\n", "print(answer)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "3745b38f-1bcb-4e54-aad5-56d74e93bfe6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "ai", "language": "python", "name": "ai" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" } }, "nbformat": 4, "nbformat_minor": 5 }