{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "516baa67", "metadata": {}, "outputs": [], "source": [ "import os\n", "from langchain_community.utilities import SQLDatabase\n", "from langchain_community.agent_toolkits import SQLDatabaseToolkit\n", "from langchain_openai import ChatOpenAI\n", "from langchain.agents import create_agent \n", "from dotenv import load_dotenv\n", "load_dotenv()\n", "\n", "kimi_url= os.getenv(\"kimi_url\")\n", "kimi_api_key= os.getenv(\"kimi_api_key\")\n", "llm = ChatOpenAI(\n", " model_name=\"kimi-k2.6\", # DeepSeek 的对话模型\n", " api_key=kimi_api_key, # 在 platform.deepseek.com 获取\n", " base_url=kimi_url # DeepSeek API 地址\n", ")" ] }, { "cell_type": "code", "execution_count": 2, "id": "bf6dbb97", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "文档类型:\n", "PDF 共 354 页\n" ] } ], "source": [ "from langchain_community.document_loaders import PyMuPDFLoader\n", "\n", "# 创建加载器实例,传入 PDF 文件路径\n", "pdf_loader = PyMuPDFLoader(\"./car_info.pdf\")\n", "\n", "# 调用 load() 方法,返回一个 Document 列表(每页一个 Document)\n", "pdf_pages = pdf_loader.load()\n", "\n", "# 看看加载结果\n", "print(f\"文档类型:{type(pdf_pages)}\")\n", "print(f\"PDF 共 {len(pdf_pages)} 页\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "27ec8061", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "清洗PDF 解析出的文本,去除常见噪声\n" ] } ], "source": [ "def clean_pdf_text(text: str) -> str:\n", " \"\"\"清洗 PDF 解析出的文本,去除常见噪声\"\"\"\n", " import re\n", " \n", " # 删除非中文字符之间的换行符\n", " text = re.sub(r'[^一](\\n)[^一]', \n", " lambda m: m.group(0).replace('\\n', ''), text)\n", " \n", " # 删除项目符号和多余空格\n", " text = text.replace('•', '').replace(' ', ' ')\n", " \n", " # 删除连续的换行符(保留一个)\n", " text = re.sub(r'\\n{2,}', '\\n', text)\n", " \n", " return text.strip()\n", "\n", "print(clean_pdf_text('清洗•PDF \\n解析出的文本,\\n\\n去除常见噪声')) " ] }, { "cell_type": "code", "execution_count": null, "id": "3873dda8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "元数据:{'producer': 'PDFlib+PDI 9.0.6 (C++/Win64)', 'creator': 'PTC Arbortext Publishing Engine', 'creationdate': '2023-06-16T15:35:59+08:00', 'source': './car_info.pdf', 'file_path': './car_info.pdf', 'total_pages': 354, 'format': 'PDF 1.7', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'moddate': '2023-06-16T17:41:45+08:00', 'trapped': '', 'modDate': \"D:20230616174145+08'00'\", 'creationDate': \"D:20230616153559+08'00'\", 'page': 0}\n", "内容预览:欢迎\n", "感谢您选择了具有优良安全性、舒适性、动力性和经济性的Lynk & Co领克汽车。\n", "首次使用前请仔细、完整地阅读本手册内容,将有助于您更好地了解和使用车辆。\n", "本手册中的所有资料均为出版时的最新资料,但本公司将对产品进行不断的改进和优化,您所购的车辆可能与本手册中的描述有所不同,请以实际\n", "接收的车辆为准。\n", "如您有任何问题,或需要预约服务,请拨打电话4006-010101 联系我们。您也可以开车前\n" ] } ], "source": [ "first_page = pdf_pages[0]\n", "print(f\"元数据:{first_page.metadata}\")\n", "print(f\"内容预览:{first_page.page_content[:200]}\")\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "c532668a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "向量维度:1024\n", "前5个值:[-0.013686468824744225, 0.01563349738717079, -0.05268431454896927, 0.033748503774404526, -0.08253876119852066]\n" ] } ], "source": [ "from langchain_community.embeddings import DashScopeEmbeddings\n", "\n", "# 初始化 Embedding 模型\n", "# 需要先在 https://dashscope.console.aliyun.com/ 获取 API Key\n", "embedding_model = DashScopeEmbeddings(\n", " model=\"text-embedding-v3\", # 模型名称\n", " dashscope_api_key='sk-ws-H.RXRYMRH.ePUo.MEYCIQDhQ-PhXhECGdVgjhuqfXvzGOHzhoiBPnKIw32tJ1xGsQIhAK84sP-Q0evVxifw3BnxSOE9AYiQx10sf-YUjeU3d7Q-' # 替换为你的真实 Key\n", ")\n", "\n", "# 单条文本向量化\n", "text = \"RAG系统搭建实战\"\n", "embedding = embedding_model.embed_query(text)\n", "print(f\"向量维度:{len(embedding)}\")\n", "print(f\"前5个值:{embedding[:5]}\")" ] }, { "cell_type": "code", "execution_count": 10, "id": "d71ebbd5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "生成了 4 个向量\n", "每个向量维度:1024\n" ] } ], "source": [ "texts = [\n", " \"什么是大语言模型\",\n", " \"RAG的概念和原理\",\n", " \"牛顿第一定律是什么\",\n", " \"波粒二象性\",\n", "]\n", "\n", "embeddings = embedding_model.embed_documents(texts)\n", "print(f\"生成了 {len(embeddings)} 个向量\")\n", "print(f\"每个向量维度:{len(embeddings[0])}\")" ] }, { "cell_type": "code", "execution_count": 11, "id": "27d633db", "metadata": {}, "outputs": [], "source": [ "from langchain_community.vectorstores import Chroma\n", "\n", "\n", "# 准备一些测试数据\n", "datas = [\n", " \"小明特别喜欢吃脆甜多汁的苹果\",\n", " \"小红对榴莲那独特的味道情有独钟\",\n", " \"小明和小丽是一对甜蜜的情侣\",\n", " \"王老师教学认真负责,是公认的好老师\",\n", " \"小李每天都要吃一根香蕉\",\n", " \"小王的男朋友长得阳光帅气,是大家公认的大帅哥\"\n", "]\n", "\n", "# 创建向量数据库并持久化(会同时把文本和对应的向量存入数据库)\n", "db = Chroma.from_texts(\n", " texts=datas,\n", " embedding=embedding_model,\n", " collection_metadata={\"hnsw:space\": \"cosine\"}, # 关键配置:指定距离算法为余弦相似度\n", " persist_directory=\"./chroma_db1\" # 数据库存储路径\n", ")" ] }, { "cell_type": "code", "execution_count": 12, "id": "54d449ac", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "匹配内容:王老师教学认真负责,是公认的好老师\n" ] } ], "source": [ "query = \"谁是老师\"\n", "results = db.similarity_search(query, k=1) # 返回最相似的 1 条\n", "\n", "for doc in results:\n", " print(f\"匹配内容:{doc.page_content}\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "dd7b9467", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "内容:王老师教学认真负责,是公认的好老师 | 相似度分数:0.3910\n", "内容:小明和小丽是一对甜蜜的情侣 | 相似度分数:0.6156\n", "内容:小明特别喜欢吃脆甜多汁的苹果 | 相似度分数:0.6303\n" ] } ], "source": [ "query = \"谁是老师\"\n", "results = db.similarity_search_with_score(query, k=3)\n", "\n", "for doc, score in results:\n", " print(f\"内容:{doc.page_content} | 相似度分数:{score:.4f}\")" ] }, { "cell_type": "code", "execution_count": 20, "id": "79e22e24", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--- 块1 ---\n", "LangChain 是一个让你的 LLM 变得更强大的开源框架。\n", "\n", "--- 块2 ---\n", "你想开发一个基于 LLM 的应用,需要什么组件它都有,直接使用就行。\n", "\n", "--- 块3 ---\n", "甚至针对常规的应用流程,它利用 Chain 这个概念已经内置标准化方案了。\n", "\n", "--- 块4 ---\n", "下面我们从新兴的大语言模型技术栈的角度来看看为何它的理念这么受欢迎。\n", "\n" ] } ], "source": [ "\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "# 创建递归字符分割器\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " # 分隔符优先级:段落 → 换行 → 句号 → 空格 → 硬切\n", " separators=[\"\\n\\n\", \"\\n\", \"。\", \"!\", \"?\", \" \", \"\"],\n", " \n", " # 每个块最大 50 字符\n", " chunk_size=40,\n", " \n", " # 相邻块重叠 10 字符(chunk_size 的 20%)\n", " chunk_overlap=5,\n", " \n", " # 长度计算函数\n", " length_function=len\n", ")\n", "\n", "# 对单段文本进行分割\n", "text = \"\"\"\n", "LangChain 是一个让你的 LLM 变得更强大的开源框架。\n", "你想开发一个基于 LLM 的应用,需要什么组件它都有,直接使用就行。\n", "甚至针对常规的应用流程,它利用 Chain 这个概念已经内置标准化方案了。\n", "下面我们从新兴的大语言模型技术栈的角度来看看为何它的理念这么受欢迎。\n", "\"\"\"\n", "chunks = text_splitter.split_text(text)\n", "for i, chunk in enumerate(chunks):\n", " print(f\"--- 块{i+1} ---\\n{chunk}\\n\")" ] }, { "cell_type": "code", "execution_count": 21, "id": "6a33f960", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "切分后的文件数量:5074\n", "切分后的字符数(可以用来大致评估 token 数):142467\n" ] } ], "source": [ "split_docs = text_splitter.split_documents(pdf_pages)\n", "print(f\"切分后的文件数量:{len(split_docs)}\")\n", "print(f\"切分后的字符数(可以用来大致评估 token 数):{sum([len(doc.page_content) for doc in split_docs])}\")" ] }, { "cell_type": "code", "execution_count": 24, "id": "10ea40a2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "语义分块结果:1 个块\n" ] } ], "source": [ "from langchain_experimental.text_splitter import SemanticChunker\n", "from langchain_community.embeddings import DashScopeEmbeddings\n", "\n", "\n", "# 创建语义分块器\n", "semantic_splitter = SemanticChunker(\n", " embeddings=embedding_model,\n", " breakpoint_threshold_type=\"percentile\", # 使用百分位数作为阈值\n", " breakpoint_threshold_amount=85 # 相似度低于 85% 百分位时切分\n", ")\n", "\n", "# 分块\n", "docs = semantic_splitter.create_documents([text])\n", "print(f\"语义分块结果:{len(docs)} 个块\")" ] }, { "cell_type": "code", "execution_count": 25, "id": "015ba40e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "有效块数量:5074\n", "总字符数(可大致评估 Token 数):142467\n" ] } ], "source": [ "valid_docs = [\n", " doc for doc in split_docs \n", " if doc.page_content and doc.page_content.strip()\n", "]\n", "\n", "print(f\"有效块数量:{len(valid_docs)}\")\n", "print(f\"总字符数(可大致评估 Token 数):{sum(len(d.page_content) for d in valid_docs)}\")" ] }, { "cell_type": "code", "execution_count": 30, "id": "f5ae4df9", "metadata": {}, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[30]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m langchain_community.embeddings \u001b[38;5;28;01mimport\u001b[39;00m DashScopeEmbeddings\n\u001b[32m 3\u001b[39m \n\u001b[32m 4\u001b[39m \n\u001b[32m 5\u001b[39m \u001b[38;5;66;03m# 从文档创建向量库(写数据)\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m vectorstore = Chroma.from_documents(\n\u001b[32m 7\u001b[39m documents=valid_docs,\n\u001b[32m 8\u001b[39m embedding=embedding_model,\n\u001b[32m 9\u001b[39m collection_metadata={\u001b[33m\"hnsw:space\"\u001b[39m: \u001b[33m\"cosine\"\u001b[39m},\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\vectorstores\\chroma.py:887\u001b[39m, in \u001b[36mChroma.from_documents\u001b[39m\u001b[34m(cls, documents, embedding, ids, collection_name, persist_directory, client_settings, client, collection_metadata, **kwargs)\u001b[39m\n\u001b[32m 885\u001b[39m texts = [doc.page_content \u001b[38;5;28;01mfor\u001b[39;00m doc \u001b[38;5;129;01min\u001b[39;00m documents]\n\u001b[32m 886\u001b[39m metadatas = [doc.metadata \u001b[38;5;28;01mfor\u001b[39;00m doc \u001b[38;5;129;01min\u001b[39;00m documents]\n\u001b[32m--> \u001b[39m\u001b[32m887\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mcls\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mfrom_texts\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 888\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtexts\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mtexts\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 889\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43membedding\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43membedding\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 890\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mmetadatas\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmetadatas\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 891\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mids\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mids\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 892\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mcollection_name\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mcollection_name\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 893\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mpersist_directory\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mpersist_directory\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 894\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mclient_settings\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mclient_settings\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 895\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mclient\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mclient\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 896\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mcollection_metadata\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mcollection_metadata\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 897\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 898\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\vectorstores\\chroma.py:843\u001b[39m, in \u001b[36mChroma.from_texts\u001b[39m\u001b[34m(cls, texts, embedding, metadatas, ids, collection_name, persist_directory, client_settings, client, collection_metadata, **kwargs)\u001b[39m\n\u001b[32m 835\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mchromadb\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mutils\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mbatch_utils\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m create_batches\n\u001b[32m 837\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m batch \u001b[38;5;129;01min\u001b[39;00m create_batches(\n\u001b[32m 838\u001b[39m api=chroma_collection._client,\n\u001b[32m 839\u001b[39m ids=ids,\n\u001b[32m 840\u001b[39m metadatas=metadatas,\n\u001b[32m 841\u001b[39m documents=texts,\n\u001b[32m 842\u001b[39m ):\n\u001b[32m--> \u001b[39m\u001b[32m843\u001b[39m \u001b[30;43mchroma_collection\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43madd_texts\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 844\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtexts\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbatch\u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m3\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mif\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43mbatch\u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m3\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01melse\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 845\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mmetadatas\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbatch\u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m2\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mif\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43mbatch\u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m2\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01melse\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 846\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mids\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbatch\u001b[39;49m\u001b[30;43m[\u001b[39;49m\u001b[30;43m0\u001b[39;49m\u001b[30;43m]\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 847\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 848\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 849\u001b[39m chroma_collection.add_texts(texts=texts, metadatas=metadatas, ids=ids)\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\vectorstores\\chroma.py:277\u001b[39m, in \u001b[36mChroma.add_texts\u001b[39m\u001b[34m(self, texts, metadatas, ids, **kwargs)\u001b[39m\n\u001b[32m 275\u001b[39m texts = \u001b[38;5;28mlist\u001b[39m(texts)\n\u001b[32m 276\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._embedding_function \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m277\u001b[39m embeddings = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_embedding_function\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43membed_documents\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mtexts\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 278\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m metadatas:\n\u001b[32m 279\u001b[39m \u001b[38;5;66;03m# fill metadatas with empty dicts if somebody\u001b[39;00m\n\u001b[32m 280\u001b[39m \u001b[38;5;66;03m# did not specify metadata for all texts\u001b[39;00m\n\u001b[32m 281\u001b[39m length_diff = \u001b[38;5;28mlen\u001b[39m(texts) - \u001b[38;5;28mlen\u001b[39m(metadatas)\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\embeddings\\dashscope.py:155\u001b[39m, in \u001b[36mDashScopeEmbeddings.embed_documents\u001b[39m\u001b[34m(self, texts)\u001b[39m\n\u001b[32m 146\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34membed_documents\u001b[39m(\u001b[38;5;28mself\u001b[39m, texts: List[\u001b[38;5;28mstr\u001b[39m]) -> List[List[\u001b[38;5;28mfloat\u001b[39m]]:\n\u001b[32m 147\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Call out to DashScope's embedding endpoint for embedding search docs.\u001b[39;00m\n\u001b[32m 148\u001b[39m \n\u001b[32m 149\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 153\u001b[39m \u001b[33;03m List of embeddings, one for each text.\u001b[39;00m\n\u001b[32m 154\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m155\u001b[39m embeddings = \u001b[30;43membed_with_retry\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 156\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43minput\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mtexts\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mtext_type\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m\"\u001b[39;49m\u001b[30;43mdocument\u001b[39;49m\u001b[30;43m\"\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\n\u001b[32m 157\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 158\u001b[39m embedding_list = [item[\u001b[33m\"\u001b[39m\u001b[33membedding\u001b[39m\u001b[33m\"\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m embeddings]\n\u001b[32m 159\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m embedding_list\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\embeddings\\dashscope.py:83\u001b[39m, in \u001b[36membed_with_retry\u001b[39m\u001b[34m(embeddings, **kwargs)\u001b[39m\n\u001b[32m 80\u001b[39m i += batch_size\n\u001b[32m 81\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m result\n\u001b[32m---> \u001b[39m\u001b[32m83\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43m_embed_with_retry\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\tenacity\\__init__.py:331\u001b[39m, in \u001b[36mBaseRetrying.wraps..wrapped_f\u001b[39m\u001b[34m(*args, **kw)\u001b[39m\n\u001b[32m 329\u001b[39m copy = \u001b[38;5;28mself\u001b[39m.copy()\n\u001b[32m 330\u001b[39m wrapped_f.statistics = copy.statistics \u001b[38;5;66;03m# type: ignore[attr-defined]\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m331\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mcopy\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mf\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkw\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\tenacity\\__init__.py:470\u001b[39m, in \u001b[36mRetrying.__call__\u001b[39m\u001b[34m(self, fn, *args, **kwargs)\u001b[39m\n\u001b[32m 468\u001b[39m retry_state = RetryCallState(retry_object=\u001b[38;5;28mself\u001b[39m, fn=fn, args=args, kwargs=kwargs)\n\u001b[32m 469\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m470\u001b[39m do = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43miter\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mretry_state\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mretry_state\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 471\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(do, DoAttempt):\n\u001b[32m 472\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\tenacity\\__init__.py:371\u001b[39m, in \u001b[36mBaseRetrying.iter\u001b[39m\u001b[34m(self, retry_state)\u001b[39m\n\u001b[32m 369\u001b[39m result = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 370\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m.iter_state.actions:\n\u001b[32m--> \u001b[39m\u001b[32m371\u001b[39m result = \u001b[30;43maction\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mretry_state\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 372\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\tenacity\\__init__.py:393\u001b[39m, in \u001b[36mBaseRetrying._post_retry_check_actions..\u001b[39m\u001b[34m(rs)\u001b[39m\n\u001b[32m 391\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_post_retry_check_actions\u001b[39m(\u001b[38;5;28mself\u001b[39m, retry_state: \u001b[33m\"\u001b[39m\u001b[33mRetryCallState\u001b[39m\u001b[33m\"\u001b[39m) -> \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 392\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m.iter_state.is_explicit_retry \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m.iter_state.retry_run_result):\n\u001b[32m--> \u001b[39m\u001b[32m393\u001b[39m \u001b[38;5;28mself\u001b[39m._add_action_func(\u001b[38;5;28;01mlambda\u001b[39;00m rs: \u001b[30;43mrs\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43moutcome\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mresult\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m)\n\u001b[32m 394\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[32m 396\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.after \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\concurrent\\futures\\_base.py:449\u001b[39m, in \u001b[36mFuture.result\u001b[39m\u001b[34m(self, timeout)\u001b[39m\n\u001b[32m 447\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[32m 448\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._state == FINISHED:\n\u001b[32m--> \u001b[39m\u001b[32m449\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m__get_result\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 451\u001b[39m \u001b[38;5;28mself\u001b[39m._condition.wait(timeout)\n\u001b[32m 453\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._state \u001b[38;5;129;01min\u001b[39;00m [CANCELLED, CANCELLED_AND_NOTIFIED]:\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\concurrent\\futures\\_base.py:401\u001b[39m, in \u001b[36mFuture.__get_result\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 399\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._exception:\n\u001b[32m 400\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m401\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m._exception\n\u001b[32m 402\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 403\u001b[39m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[32m 404\u001b[39m \u001b[38;5;28mself\u001b[39m = \u001b[38;5;28;01mNone\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\tenacity\\__init__.py:473\u001b[39m, in \u001b[36mRetrying.__call__\u001b[39m\u001b[34m(self, fn, *args, **kwargs)\u001b[39m\n\u001b[32m 471\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(do, DoAttempt):\n\u001b[32m 472\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m473\u001b[39m result = \u001b[30;43mfn\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43margs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 474\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m: \u001b[38;5;66;03m# noqa: B902\u001b[39;00m\n\u001b[32m 475\u001b[39m retry_state.set_exception(sys.exc_info()) \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\langchain_community\\embeddings\\dashscope.py:66\u001b[39m, in \u001b[36membed_with_retry.._embed_with_retry\u001b[39m\u001b[34m(**kwargs)\u001b[39m\n\u001b[32m 60\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m i < input_len:\n\u001b[32m 61\u001b[39m kwargs[\u001b[33m\"\u001b[39m\u001b[33minput\u001b[39m\u001b[33m\"\u001b[39m] = (\n\u001b[32m 62\u001b[39m input_data[i : i + batch_size]\n\u001b[32m 63\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(input_data, \u001b[38;5;28mlist\u001b[39m)\n\u001b[32m 64\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m input_data\n\u001b[32m 65\u001b[39m )\n\u001b[32m---> \u001b[39m\u001b[32m66\u001b[39m resp = \u001b[30;43membeddings\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mclient\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcall\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 67\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m resp.status_code == \u001b[32m200\u001b[39m:\n\u001b[32m 68\u001b[39m result += resp.output[\u001b[33m\"\u001b[39m\u001b[33membeddings\u001b[39m\u001b[33m\"\u001b[39m]\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\dashscope\\embeddings\\text_embedding.py:73\u001b[39m, in \u001b[36mTextEmbedding.call\u001b[39m\u001b[34m(cls, model, input, workspace, api_key, text_type, dimension, output_type, instruct, **kwargs)\u001b[39m\n\u001b[32m 71\u001b[39m kwargs[\u001b[33m\"\u001b[39m\u001b[33minstruct\u001b[39m\u001b[33m\"\u001b[39m] = instruct\n\u001b[32m 72\u001b[39m task_group, function = _get_task_group_and_task(\u001b[34m__name__\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m73\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43msuper\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcall\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 74\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mmodel\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 75\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43minput\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43membedding_input\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 76\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtask_group\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mtask_group\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 77\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtask\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mTextEmbedding\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mtask\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 78\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mfunction\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mfunction\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 79\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mapi_key\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mapi_key\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 80\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mworkspace\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mworkspace\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 81\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 82\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\dashscope\\client\\base_api.py:558\u001b[39m, in \u001b[36mBaseApi.call\u001b[39m\u001b[34m(cls, model, input, task_group, task, function, api_key, workspace, **kwargs)\u001b[39m\n\u001b[32m 548\u001b[39m request = _build_api_request(\n\u001b[32m 549\u001b[39m model=model,\n\u001b[32m 550\u001b[39m \u001b[38;5;28minput\u001b[39m=\u001b[38;5;28minput\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 555\u001b[39m **kwargs,\n\u001b[32m 556\u001b[39m )\n\u001b[32m 557\u001b[39m \u001b[38;5;66;03m# call request service.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m558\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mrequest\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcall\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\dashscope\\api_entities\\http_request.py:144\u001b[39m, in \u001b[36mHttpRequest.call\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 142\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m (item \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m response)\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m144\u001b[39m output = \u001b[38;5;28mnext\u001b[39m(response)\n\u001b[32m 145\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 146\u001b[39m \u001b[38;5;28mnext\u001b[39m(response)\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\dashscope\\api_entities\\http_request.py:492\u001b[39m, in \u001b[36mHttpRequest._handle_request\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 488\u001b[39m logger.debug(\u001b[33m\"\u001b[39m\u001b[33mRequest body: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m, obj)\n\u001b[32m 489\u001b[39m body = json.dumps(obj, ensure_ascii=\u001b[38;5;28;01mFalse\u001b[39;00m).encode(\n\u001b[32m 490\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mutf-8\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 491\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m492\u001b[39m response = \u001b[30;43msession\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mpost\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 493\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 494\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mstream\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mstream\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 495\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mdata\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 496\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m{\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m}\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 497\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 498\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 499\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.method == HTTPMethod.GET:\n\u001b[32m 500\u001b[39m params = {}\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\requests\\sessions.py:712\u001b[39m, in \u001b[36mSession.post\u001b[39m\u001b[34m(self, url, data, json, **kwargs)\u001b[39m\n\u001b[32m 695\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpost\u001b[39m(\n\u001b[32m 696\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m 697\u001b[39m url: _t.UriType,\n\u001b[32m (...)\u001b[39m\u001b[32m 700\u001b[39m **kwargs: Unpack[_t.PostKwargs],\n\u001b[32m 701\u001b[39m ) -> Response:\n\u001b[32m 702\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33mr\u001b[39m\u001b[33;03m\"\"\"Sends a POST request. Returns :class:`Response` object.\u001b[39;00m\n\u001b[32m 703\u001b[39m \n\u001b[32m 704\u001b[39m \u001b[33;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 709\u001b[39m \u001b[33;03m :rtype: requests.Response\u001b[39;00m\n\u001b[32m 710\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m712\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mrequest\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m\"\u001b[39;49m\u001b[30;43mPOST\u001b[39;49m\u001b[30;43m\"\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mdata\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mdata\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mjson\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mjson\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\requests\\sessions.py:651\u001b[39m, in \u001b[36mSession.request\u001b[39m\u001b[34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[39m\n\u001b[32m 646\u001b[39m send_kwargs = {\n\u001b[32m 647\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtimeout\u001b[39m\u001b[33m\"\u001b[39m: timeout,\n\u001b[32m 648\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mallow_redirects\u001b[39m\u001b[33m\"\u001b[39m: allow_redirects,\n\u001b[32m 649\u001b[39m }\n\u001b[32m 650\u001b[39m send_kwargs.update(settings)\n\u001b[32m--> \u001b[39m\u001b[32m651\u001b[39m resp = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msend\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mprep\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43msend_kwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 653\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\requests\\sessions.py:784\u001b[39m, in \u001b[36mSession.send\u001b[39m\u001b[34m(self, request, **kwargs)\u001b[39m\n\u001b[32m 781\u001b[39m start = preferred_clock()\n\u001b[32m 783\u001b[39m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m784\u001b[39m r = \u001b[30;43madapter\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msend\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mrequest\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mkwargs\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[32m 787\u001b[39m elapsed = preferred_clock() - start\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\requests\\adapters.py:696\u001b[39m, in \u001b[36mHTTPAdapter.send\u001b[39m\u001b[34m(self, request, stream, timeout, verify, cert, proxies)\u001b[39m\n\u001b[32m 693\u001b[39m resolved_timeout = TimeoutSauce(connect=timeout, read=timeout)\n\u001b[32m 695\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m696\u001b[39m resp = \u001b[30;43mconn\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43murlopen\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 697\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mmethod\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mrequest\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mmethod\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 698\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 699\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mrequest\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;03m# type: ignore[arg-type] # urllib3 stubs don't accept Iterable[bytes | str]\u001b[39;49;00m\n\u001b[32m 700\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mrequest\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;03m# type: ignore[arg-type] # urllib3#3072\u001b[39;49;00m\n\u001b[32m 701\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mredirect\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 702\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43massert_same_host\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 703\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mpreload_content\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 704\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mdecode_content\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 705\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mretries\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mmax_retries\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 706\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mresolved_timeout\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 707\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mchunked\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mchunked\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 708\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 710\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[32m 711\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request=request)\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:788\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 785\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 787\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m788\u001b[39m response = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_make_request\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 789\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mconn\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 790\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mmethod\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 791\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43murl\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 792\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mtimeout\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mtimeout_obj\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 793\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 794\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mheaders\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 795\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mchunked\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mchunked\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 796\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mretries\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mretries\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 797\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mresponse_conn\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mresponse_conn\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 798\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mpreload_content\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mpreload_content\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 799\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mdecode_content\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mdecode_content\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 800\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43mresponse_kw\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 801\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 803\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 804\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\urllib3\\connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[30;43mconn\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgetresponse\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", "\u001b[36mFile \u001b[39m\u001b[32me:\\test\\3_rag\\.venv\\Lib\\site-packages\\urllib3\\connection.py:571\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 568\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 570\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m571\u001b[39m httplib_response = \u001b[30;43msuper\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgetresponse\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 573\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 574\u001b[39m assert_header_parsing(httplib_response.msg)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\http\\client.py:1415\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1413\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1414\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1415\u001b[39m \u001b[30;43mresponse\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mbegin\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 1416\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1417\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\http\\client.py:330\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 328\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 329\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m330\u001b[39m version, status, reason = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_read_status\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 331\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 332\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\http\\client.py:291\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 290\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m291\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mself\u001b[39m.fp.readline(_MAXLINE + \u001b[32m1\u001b[39m), \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 292\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 293\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\socket.py:718\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 716\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m 717\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m718\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_sock\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mrecv_into\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mb\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 719\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 720\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\ssl.py:1314\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1310\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1311\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1312\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1313\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1314\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mread\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mnbytes\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mbuffer\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 1315\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1316\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", "\u001b[36mFile \u001b[39m\u001b[32m~\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\Lib\\ssl.py:1166\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1164\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1165\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1166\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_sslobj\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mread\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mlen\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mbuffer\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 1167\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1168\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", "\u001b[31mKeyboardInterrupt\u001b[39m: " ] } ], "source": [ "from langchain_community.vectorstores import Chroma\n", "from langchain_community.embeddings import DashScopeEmbeddings\n", "\n", "\n", "# 从文档创建向量库(写数据)\n", "vectorstore = Chroma.from_documents(\n", " documents=valid_docs,\n", " embedding=embedding_model,\n", " collection_metadata={\"hnsw:space\": \"cosine\"},\n", " persist_directory=\"./chroma_db1\"\n", ")\n", "\n", "# 创建检索器,设置返回 Top-3 最相关文档\n", "retriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})" ] }, { "cell_type": "code", "execution_count": null, "id": "2d88cfbe", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 40, "id": "dd37bb0f", "metadata": {}, "outputs": [], "source": [ "from langchain_community.document_loaders import PyMuPDFLoader\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "from langchain_community.embeddings import DashScopeEmbeddings\n", "from langchain_community.vectorstores import Chroma\n", "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_community.chat_models import ChatTongyi\n", "from langchain_core.output_parsers import StrOutputParser\n", "\n", "# ========== 第一步:加载文档 ==========\n", "loader = PyMuPDFLoader(\"./2222.pdf\")\n", "pages = loader.load()\n", "\n", "# ========== 第二步:清洗数据(可选,根据文档质量决定)==========\n", "# clean_pages = [clean_pdf_text(page) for page in pages]\n", "\n", "# ========== 第三步:分块 ==========\n", "splitter = RecursiveCharacterTextSplitter(\n", " # 分隔符优先级:段落 → 换行 → 句号 → 空格 → 硬切\n", " separators=[\"\\n\\n\", \"\\n\", \"。\", \"!\", \"?\", \" \", \"\"],\n", " # 每个块最大 50 字符\n", " chunk_size=500,\n", " # 相邻块重叠 10 字符(chunk_size 的 20%)\n", " chunk_overlap=50,\n", " # 长度计算函数\n", " length_function=len\n", ")\n", "docs = splitter.split_documents(pages)\n", "\n", "# ========== 第四步:向量化 + 存入向量库 ==========\n", "embedding_model = DashScopeEmbeddings(\n", " model=\"text-embedding-v3\",\n", " dashscope_api_key=\"sk-ws-H.RXRYMRH.ePUo.MEYCIQDhQ-PhXhECGdVgjhuqfXvzGOHzhoiBPnKIw32tJ1xGsQIhAK84sP-Q0evVxifw3BnxSOE9AYiQx10sf-YUjeU3d7Q-\"\n", ")\n", "vectorstore = Chroma.from_documents(\n", " documents=docs,\n", " embedding=embedding_model,\n", " persist_directory=\"./222_db\"\n", ")\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "529ca296", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "针对备件异常问题,结合案例暴露的原因,建议从以下几方面解决:\n", "\n", "1. **重新评估并管控供应商**:采购部已发现“B公司去年存在多项失信行为记录”,应以此为依据重新评估其供货资格,引入合格供应商并签订明确的质量保证与违约责任条款,避免仅以“价格较低”作为选择标准。\n", "\n", "2. **完善备件储备与库存管理**:针对“部分核心系统备件没有储备”以及“库存信息中显示有库存,但调取时却找不到”的问题,应按合同时效要求(核心系统四小时到场)建立安全库存,并定期盘点、更新库存台账,确保账实相符,杜绝临时采购延误。\n", "\n", "3. **严格执行到货验收并保留证据**:针对“没有进行备件到货验收和相关记录”,应建立严格的到货验收制度,对备件进行外观检查及必要的加电测试,形成书面验收记录;对异常备件及时拍照、记录并拒收,以便明确责任,避免“无法提供相应证据”。\n", "\n", "4. **整改库房环境**:针对B公司提出的“库房温度、湿度超标”问题,应立即改善库房环境,加装温湿度监控与调控设备,规范备件存放条件,防止因存储环境问题导致备件异常。\n", "\n", "5. **加强采购过程控制与文档管理**:针对“缺少采购过程的控制”和“整个采购过程缺少规范的文档记录”,应建立覆盖采购申请、审批、到货、验收、入库的全流程文档体系,加强过程监控,避免“甲方投诉才发现备件不能及时到场”。\n", "\n", "6. **明确责任与索赔**:基于合同与验收记录,就加电异常和延误问题向B公司追责或要求退换货;同时通过规范的环境监控和验收记录,厘清“质量问题”与“环境问题”的争议。\n" ] } ], "source": [ "# ========== 第五步:创建检索器 ==========\n", "retriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})\n", "\n", "# ========== 第六步:提问 ==========\n", "query = \"针对备件异常的问题怎么解决\"\n", "relevant_docs = retriever.invoke(query)\n", "\n", "# ========== 第七步:生成回答 ==========\n", "context = \"\\n\\n---\\n\\n\".join([d.page_content for d in relevant_docs])\n", "\n", "prompt = ChatPromptTemplate.from_template(\"\"\"\n", "你是一个专业的知识库助手。请根据以下上下文回答问题。\n", "\n", "**规则:**\n", "- 只基于提供的上下文回答,不要编造\n", "- 如果上下文中没有相关信息,直接说「根据现有资料,我找不到这个问题的答案」\n", "- 回答要简洁直接,引用原文时用引号\n", "\n", "**上下文:**\n", "{context}\n", "\n", "**问题:**\n", "{question}\n", "\"\"\")\n", "kimi_url= os.getenv(\"kimi_url\")\n", "kimi_api_key= os.getenv(\"kimi_api_key\")\n", "llm = ChatOpenAI(\n", " model_name=\"kimi-k2.6\", # DeepSeek 的对话模型\n", " api_key=kimi_api_key, # 在 platform.deepseek.com 获取\n", " base_url=kimi_url \n", ")\n", "chain = prompt | llm | StrOutputParser()\n", "\n", "answer = chain.invoke({\"context\": context, \"question\": query})\n", "print(answer)\n", "'''针对备件异常问题,结合案例暴露的原因,建议从以下几方面解决:\n", "\n", "1. **重新评估并管控供应商**:采购部已发现“B公司去年存在多项失信行为记录”,应以此为依据重新评估其供货资格,引入合格供应商并签订明确的质量保证与违约责任条款,避免仅以“价格较低”作为选择标准。\n", "\n", "2. **完善备件储备与库存管理**:针对“部分核心系统备件没有储备”以及“库存信息中显示有库存,但调取时却找不到”的问题,应按合同时效要求(核心系统四小时到场)建立安全库存,并定期盘点、更新库存台账,确保账实相符,杜绝临时采购延误。\n", "\n", "3. **严格执行到货验收并保留证据**:针对“没有进行备件到货验收和相关记录”,应建立严格的到货验收制度,对备件进行外观检查及必要的加电测试,形成书面验收记录;对异常备件及时拍照、记录并拒收,以便明确责任,避免“无法提供相应证据”。\n", "\n", "4. **整改库房环境**:针对B公司提出的“库房温度、湿度超标”问题,应立即改善库房环境,加装温湿度监控与调控设备,规范备件存放条件,防止因存储环境问题导致备件异常。\n", "\n", "5. **加强采购过程控制与文档管理**:针对“缺少采购过程的控制”和“整个采购过程缺少规范的文档记录”,应建立覆盖采购申请、审批、到货、验收、入库的全流程文档体系,加强过程监控,避免“甲方投诉才发现备件不能及时到场”。\n", "\n", "6. **明确责任与索赔**:基于合同与验收记录,就加电异常和延误问题向B公司追责或要求退换货;同时通过规范的环境监控和验收记录,厘清“质量问题”与“环境问题”的争议。'''" ] } ], "metadata": { "kernelspec": { "display_name": "3_rag (3.11.15)", "language": "python", "name": "python3" }, "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.11.15" } }, "nbformat": 4, "nbformat_minor": 5 }