RAG-01-假设性问题索引

作用:将文档分割成多份,按每份文档假设出多个问题,当用户提问时,提示词和问题匹配后再向量化匹配,增加查询效率,更精准。

步骤如下:

 加载

1: 加载文档
2: 分割文档
3: 初始化 Embedding 模型
4: 初始化 LLM
5.生成假设性问题
6: 存储到向量数据库

检索
1: 显示检索到的相似问题
2: 创建回答提示模板
3: 生成问题回答链
4: 生成问题回答
"""
假设性问题索引 - 完善版(无警告)
使用在线 DashScope Embedding + 优化的 LLM 调用
"""
import uuid
import warnings
from typing import List

from langchain_chroma import Chroma
from langchain_classic.retrievers import MultiVectorRetriever
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings.dashscope import DashScopeEmbeddings
from langchain_core.documents import Document
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.stores import InMemoryByteStore
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.runnables import RunnableMap
from langchain_core.output_parsers import StrOutputParser
from langchain_text_splitters import RecursiveCharacterTextSplitter
from pydantic import BaseModel, Field

from config import QIANWEN_CONFIG

# 过滤 Pydantic 警告
warnings.filterwarnings('ignore', category=UserWarning, module='pydantic')

print("=" * 60)
print("假设性问题索引 - 完善版")
print("=" * 60)

# 步骤 1: 加载文档
print("\n[1/6] 加载文档...")
loader = TextLoader("deepseek简介.txt", encoding='utf-8')
docs = loader.load()
print(f"✅ 加载了 {len(docs)} 个文档")

# 步骤 2: 分割文档
print("\n[2/6] 分割文档...")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=100)
docs = text_splitter.split_documents(docs)
print(f"✅ 分割为 {len(docs)} 个文档块")

# 步骤 3: 初始化 Embedding 模型
print("\n[3/6] 初始化 Embedding 模型...")
embeddings_model = DashScopeEmbeddings(
    model="text-embedding-v1",
    dashscope_api_key=QIANWEN_CONFIG["api_key"]
)
print("✅ Embedding 模型初始化成功")

# 步骤 4: 初始化 LLM
print("\n[4/6] 初始化 LLM...")
llm = ChatOpenAI(
    api_key=QIANWEN_CONFIG["api_key"],
    base_url=QIANWEN_CONFIG["base_url"],
    model=QIANWEN_CONFIG["model"],
    timeout=60,
    max_retries=3,
    temperature=0.7
)
print("✅ LLM 初始化成功")


class HypotheticalQuestions(BaseModel):
    """生成假设性问题的数据模型"""
    questions: List[str] = Field(description="基于文档生成的假设性问题列表")


# 创建 JSON 输出解析器
parser = JsonOutputParser(pydantic_object=HypotheticalQuestions)

# 创建提示模板
prompt = ChatPromptTemplate.from_template(
    """请基于以下文档内容,生成3个相关的假设性问题。

文档内容:
{doc}

要求:
1. 问题应该与文档内容密切相关
2. 问题应该具有探索性和思考性
3. 使用中文提问
4. 输出格式必须为 JSON

{format_instructions}
"""
)

# 创建处理链
chain = (
        {"doc": lambda x: x.page_content, "format_instructions": lambda x: parser.get_format_instructions()}
        | prompt
        | llm
        | parser
)

# 步骤 5: 生成假设性问题
print("\n[5/6] 生成假设性问题...")
print("提示: 这可能需要一些时间,请耐心等待...")

hypothetical_questions = []
for i, doc in enumerate(docs, 1):
    try:
        print(f"  处理文档 {i}/{len(docs)}...", end=" ")
        result = chain.invoke(doc)
        questions = result.get("questions", [])
        hypothetical_questions.append(questions)
        print(f"✓ 生成了 {len(questions)} 个问题")
    except Exception as e:
        print(f"✗ 失败: {e}")
        # 使用默认问题
        hypothetical_questions.append([
            f"这段文档的主要内容是什么?",
            f"这段文档讨论了哪些关键问题?",
            f"这段文档的核心观点是什么?"
        ])

print(f"\n✅ 总共生成了 {sum(len(q) for q in hypothetical_questions)} 个问题")

# 显示部分生成的问题
print("\n生成的问题示例(前3个):")
for i, questions in enumerate(hypothetical_questions[:3], 1):
    print(f"\n文档块 {i}:")
    for j, q in enumerate(questions, 1):
        print(f"  {j}. {q}")

# 步骤 6: 存储到向量数据库
print("\n[6/6] 存储到向量数据库...")

# 初始化向量数据库
vectorstore = Chroma(
    collection_name="hypo-questions-v2",
    embedding_function=embeddings_model
)
# 初始化内存存储(存储原始文档)
store = InMemoryByteStore()
# 文档标识键名
id_key = "doc_id"

# 配置多向量检索器
retriever = MultiVectorRetriever(
    vectorstore=vectorstore,
    byte_store=store,
    id_key=id_key,
)

# 为每个原始文档生成唯一ID
doc_ids = [str(uuid.uuid4()) for _ in docs]
question_docs = []
# 将生成的问题转换为带元数据的文档对象
for i, question_list in enumerate(hypothetical_questions):
    for question in question_list:
        question_docs.append(
            Document(page_content=question, metadata={id_key: doc_ids[i]})
        )

# 将问题文档存入向量数据库
retriever.vectorstore.add_documents(question_docs)
# 将原始文档存入字节存储(通过ID关联)
retriever.docstore.mset(list(zip(doc_ids, docs)))

print(f"✅ 存储了 {len(question_docs)} 个问题和 {len(docs)} 个文档")

# 测试检索和回答
print("\n" + "=" * 60)
print("测试检索和回答功能")
print("=" * 60)

# 执行相似性搜索测试
query = "deepseek受到哪些攻击?"
print(f"\n问题: {query}")
print("-" * 60)

# 步骤1: 显示检索到的相似问题
print("\n[步骤1] 检索到的相似问题:")
sub_docs = retriever.vectorstore.similarity_search(query, k=3)
for i, doc in enumerate(sub_docs, 1):
    print(f"  {i}. {doc.page_content[:80]}...")

# 步骤2: 创建回答提示模板
prompt1 = ChatPromptTemplate.from_template(
    """根据下面的文档回答问题:

文档内容:
{doc}

问题: {question}

请基于文档内容给出准确、详细的回答。
"""
)

# 步骤3: 生成问题回答链
qa_chain = RunnableMap({
    "doc": lambda x: "\n\n".join([d.page_content for d in retriever.invoke(x["question"])]),
    "question": lambda x: x["question"]
}) | prompt1 | llm | StrOutputParser()

# 步骤4: 生成问题回答
print("\n[步骤2] 检索到的原始文档片段:")
retrieved_docs = retriever.invoke(query)
for i, doc in enumerate(retrieved_docs[:2], 1):
    print(f"  片段{i}: {doc.page_content[:100]}...")

print("\n[步骤3] 生成回答:")
print("-" * 60)
try:
    answer = qa_chain.invoke({"question": query})
    print(answer)
except Exception as e:
    print(f"❌ 生成回答失败: {e}")
print("-" * 60)

print("\n" + "=" * 60)
print("✅ 完成!向量数据库已创建并可以使用。")
print("=" * 60)
C:\Users\hotsa\PycharmProjects\PythonProject\.venv\Scripts\python.exe C:\Users\hotsa\PycharmProjects\PythonProject\01-假设性问题索引-完善版.py 
============================================================
假设性问题索引 - 完善版
============================================================

[1/6] 加载文档...
✅ 加载了 1 个文档

[2/6] 分割文档...
✅ 分割为 3 个文档块

[3/6] 初始化 Embedding 模型...
✅ Embedding 模型初始化成功

[4/6] 初始化 LLM...
✅ LLM 初始化成功

[5/6] 生成假设性问题...
提示: 这可能需要一些时间,请耐心等待...
  处理文档 1/3... ✓ 生成了 3 个问题
  处理文档 2/3... ✗ 失败: 'NoneType' object has no attribute 'get'
  处理文档 3/3... ✓ 生成了 3 个问题

✅ 总共生成了 9 个问题

生成的问题示例(前3个):

文档块 1:
  1. 如果DeepSeek-R1模型确如黄仁勋所言是‘最强大的开源模型’,那么其在算力需求显著低于同类大模型的前提下实现高性能的底层技术路径可能是什么?
  2. 鉴于美国、日本、新加坡、台湾地区及爱尔兰等多方监管机构对DeepSeek提出安全与数据合规性质疑,若DeepSeek被证实未使用任何受出口管制的美国技术且完全遵守GDPR及各国数据本地化要求,这将如何重塑全球AI治理中‘技术来源’与‘数据主权’的认定标准?
  3. DeepSeek-R1在短短一个月内实现从登陆NVIDIA NIM、接入云平台到获顶级域名ai.com认可,并引发多国政策层面震动,倘若这种‘轻量级架构+高效训练范式+快速工程落地’的模式成为主流,是否意味着以‘参数规模’和‘算力堆叠’为标志的AI发展范式正在发生根本性转向?

文档块 2:
  1. 这段文档的主要内容是什么?
  2. 这段文档讨论了哪些关键问题?
  3. 这段文档的核心观点是什么?

文档块 3:
  1. 韩国国防部屏蔽DeepSeek军事用途访问的决定,是否可能引发其他国家在国防AI应用领域对开源大模型安全边界的重新评估与政策调整?
  2. DeepSeek在短短一周内密集完成与车企、游戏、教育、搜索等多行业深度融合,这种爆发式生态扩张是否暗示其技术架构已具备某种可快速适配垂直场景的‘模块化智能底座’特性?
  3. 当DeepSeek同时出现在军事限制清单、高校研究平台、商业产品集成及游戏NPC驱动等截然不同的应用场景中,其模型能力边界与实际部署风险之间是否存在尚未被公开讨论的张力或权衡机制?

[6/6] 存储到向量数据库...
✅ 存储了 9 个问题和 3 个文档

============================================================
测试检索和回答功能
============================================================

问题: deepseek受到哪些攻击?
------------------------------------------------------------

[步骤1] 检索到的相似问题:
  1. 当DeepSeek同时出现在军事限制清单、高校研究平台、商业产品集成及游戏NPC驱动等截然不同的应用场景中,其模型能力边界与实际部署风险之间是否存在尚未被公开讨...
  2. 鉴于美国、日本、新加坡、台湾地区及爱尔兰等多方监管机构对DeepSeek提出安全与数据合规性质疑,若DeepSeek被证实未使用任何受出口管制的美国技术且完全遵...
  3. DeepSeek在短短一周内密集完成与车企、游戏、教育、搜索等多行业深度融合,这种爆发式生态扩张是否暗示其技术架构已具备某种可快速适配垂直场景的‘模块化智能底座...

[步骤2] 检索到的原始文档片段:
  片段1: 2025 年 2 月 6 日,援引韩国官员的说法称,韩国国防部也已经屏蔽其用于军事目的的计算机访问 DeepSeek。[71]
2025 年 2 月 7 日 19 时 46 分,DeepSeek 在官...
  片段2: 2025 年 1 月 31 日,英伟达宣布 DeepSeek-R1 模型登陆 NVIDIA NIM。同一时段内,亚马逊和微软也接入 DeepSeek-R1 模型。黄仁勋称,DeepSeek-R1 是最...

[步骤3] 生成回答:
------------------------------------------------------------
根据所提供的文档内容,**DeepSeek 并未遭受任何技术性网络攻击(如黑客入侵、DDoS 攻击、数据泄露等)或物理攻击**。文档中**没有提及任何针对 DeepSeek 系统、服务器、模型或基础设施的恶意网络攻击、安全漏洞利用或破坏性行为**。

然而,文档多次描述了 DeepSeek 面临的**多维度非技术性“攻击”或挑战**,主要包括以下四类,均属**地缘政治、监管合规、舆论与信任层面的压力与反制措施**,而非网络安全意义上的攻击:

---

### 一、**国家层面的访问限制与屏蔽(行政/政策性封禁)**
- **韩国国防部**:于2025年2月6日**主动屏蔽其军用计算机对 DeepSeek 的访问**,理由是“用于军事目的”,表明出于国家安全考量实施的技术隔离。(来源:[71])  
- **台湾地区数字发展主管部门**:在2025年1月31日表达对 DeepSeek 的“**资安疑虑**”(即信息安全疑虑),虽未明确宣布封禁,但已将其列为需审慎评估的风险对象。(来源:文档“2025年2月1日”段)  
- **新加坡当局**:虽否认“通过新加坡服务器处理数据”的报道,但文档指出其“**已感受到……引发的地震**”,暗示存在监管警惕与潜在审查压力。(来源:文档“2025年2月”段)

> ✅ 性质:主权国家基于数据主权、国防安全或供应链风险作出的**行政性访问限制或政策性防范措施**,非黑客攻击。

---

### 二、**国际监管机构的合规调查与问询(法律/监管压力)**
- **爱尔兰数据保护委员会(DPC)**:主席格雷厄姆・多勒于2025年1月**正式要求 DeepSeek 提供关于其如何收集、处理爱尔兰用户个人数据的详细说明**,属于GDPR框架下的执法问询。(来源:文档“2025年1月”段)  
- **日本内阁官房长官林芳正**:于2025年1月30日公开对 DeepSeek 的AI服务表达“**关切**”,反映日本政府层面的审慎立场与潜在监管动向。(来源:《日本经济新闻》报道)

> ✅ 性质:依据本国数据保护法(如GDPR)或AI治理框架发起的**合规性质询与监管审查**,属合法行政程序,非攻击。

---

### 三、**政治指控与知识产权污名化(舆论与外交攻击)**
- **美国商务部长提名人霍华德・卢特尼克**:在2025年1月声称,DeepSeek 在开发聊天机器人时“**使用了窃取的美国技术**”。该说法属未经证实的政治指控,意在质疑其技术合法性与商业道德。(来源:文档“2025年1月”段)  
- **韩国官方表述**:将 DeepSeek 技术称为“**新的冲击**”,并推动成立“国家AI委员会”以应对——隐含将 DeepSeek 视为战略竞争对手与技术威胁。(来源:[69])

> ✅ 性质:**地缘政治话语中的污名化指控与战略遏制叙事**,旨在削弱其国际声誉与市场准入,属软性攻击(信息战/认知作战范畴),无技术实证支撑。

---

### 四、**仿冒与虚假信息风险(品牌与信任攻击)**
- DeepSeek 于2025年2月7日**主动发布公告**,指出存在“**部分与 DeepSeek 有关的仿冒账号和不实信息**”,已对公众造成“误导和困扰”。(来源:[71])  
  → 这属于典型的**社会工程类信任攻击**:第三方冒用其名义发布虚假内容,损害品牌公信力与用户安全。DeepSeek 本身是受害者,且已采取辟谣与官方账号认证等响应措施。

> ✅ 性质:**外部主体实施的品牌仿冒与虚假信息传播**,构成对组织声誉与用户权益的现实威胁,属网络安全中的“信任链攻击”。

---

### ❌ 明确排除的内容(文档中未出现):
- 无任何关于 DeepSeek 服务器被黑、模型权重被盗、API 被滥刷、训练数据泄露、零日漏洞利用等**技术性攻击事件**的记载;  
- 无用户数据大规模泄露、系统宕机、服务中断等**安全事件报告**;  
- 无黑客组织(如APT团伙)宣称对 DeepSeek 发起攻击的声明。

---

### 总结回答:
> DeepSeek 在文档所述时间段(2025年1–2月)**未遭受任何技术性网络攻击**,但面临四类实质性外部压力:  
> (1)**国家行政封禁**(韩国国防部屏蔽、台当局资安疑虑);  
> (2)**跨境监管问询**(爱尔兰DPC数据合规调查、日本政府关切);  
> (3)**政治化指控与战略污名化**(美方“窃取技术”指控、韩国称其为“新冲击”);  
> (4)**仿冒账号与不实信息传播**(官方已发文辟谣)。  
>   
> 这些均属于**地缘政治博弈、监管合规挑战与品牌信任风险**范畴,反映了 DeepSeek 作为新兴中国AI力量崛起所触发的全球性战略警惕与制度性应对,而非传统意义的“黑客攻击”。

如需进一步区分“攻击”类型(如ISO/IEC 27001标准中的威胁分类),可提供延伸分析。
------------------------------------------------------------

============================================================
✅ 完成!向量数据库已创建并可以使用。
============================================================

Process finished with exit code 0

 

posted @ 2026-03-04 22:57  蔡徐坤1987  阅读(0)  评论(0)    收藏  举报