机器问道:大模型RAG 解读凡人修仙传
本文介绍了一个基于Qwen3-0.6B嵌入模型的中文文本处理流程,主要功能包括:1)使用SemanticChunker对多本小说进行语义分块处理;2)利用HuggingFaceEmbeddings生成文本向量;3)将处理结果存入Chroma向量数据库。代码实现了自动加载文本文件、中文优化的语义分割、元数据添加及持久化存储功能,并提供查询接口检索相似文本片段。该系统特别针对中文文本特点进行了优化,包

RAG核心
文档分割
在RAG(检索增强生成)系统中,文档分割(Chunking)是至关重要的一步,它直接影响检索质量和最终生成答案的效果。以下是几种主流的文档分割方式及其核心特点,供您参考。
| 分割方法 | 核心原理 | 优点 | 缺点 | 典型适用场景 |
|---|---|---|---|---|
| 固定大小分块 | 按预设字符数/Token数均等切割 | 实现简单,计算效率高 | 易割裂语义,破坏句子完整性 | 日志分析、预处理等对语义要求不高的任务 |
| 递归字符分块 | 按分隔符优先级列表(如["\n\n", "\n", "。", " "])递归切割 |
通用性强,在语义完整性和长度控制间取得平衡 | 对无标点、结构松散文本效果下降 | 中英文混合文本、通用文本 |
| 语义分块 | 计算句子嵌入的相似度,在语义转折点切割 | 块内语义一致性高,边界自然 | 计算成本高,实现复杂 | 法律、学术论文等对准确性要求极高的长文 |
| 基于文档结构的分块 | 利用标题、章节等标记(如Markdown的#)切割 |
保留宏观逻辑结构,元数据丰富 | 依赖文档本身的结构化质量 | 技术手册、论文、API文档等高度结构化内容 |
| 延迟分块 | 查询时动态分割大片段 | 保留完整上下文,避免预处理信息丢失 | 查询延迟高,计算成本大 | 文档频繁变更或对精度极其敏感的场景(如法律、医疗) |
💡 选择分割策略的实用建议
选择哪种策略并没有放之四海而皆准的答案,关键在于匹配你的具体需求。你可以从以下几个方面进行考量:
- 评估文档特性:分析你的文档类型(是技术手册、新闻还是对话记录)、结构强度(是否有清晰的标题、段落)和信息密度。
- 明确任务目标:权衡对检索精度和处理效率的要求。例如,对答案准确性要求极高的场景(如法律条款分析)值得投入更多计算资源使用语义分块。
- 考虑系统约束:确保分割后的块长度加上你的查询和指令后,不会超出所选LLM的上下文窗口限制。
- 迭代与测试:最重要的步骤是实验。你可以先用递归分块作为稳健的基线,然后根据实际效果(如检索召回率、生成答案质量)进行调整和优化。
Query改写
在 RAG 系统中,用户的原始查询可能存在信息缺失、表述模糊或包含噪声等问题,直接检索往往效果不佳。查询改写 技术正是在检索之前,对原始查询进行优化,以提升检索效果的关键步骤。
下表详细介绍了 RAG 中主要的查询改写方法及其核心思路。
| 方法名称 | 核心思路 | 典型应用场景 |
|---|---|---|
| 多查询重写 (Multi-Query) | 针对原始查询,利用大模型生成多个在语义上相关但表述不同的查询变体,并行检索后综合结果,以扩大检索范围并提升召回率。 | 用户查询表述简短、模糊或存在多种理解角度时。 |
| 假设文档嵌入 (HyDE) | 要求大模型根据原始查询生成一个假设的理想答案文档,然后使用这个假设文档的嵌入向量(而非原始查询的向量)进行检索。 | 通用场景,尤其适用于零样本情况,旨在缩小查询与答案文档之间的语义鸿沟。 |
| 上下文依赖改写 | 在多轮对话中,自动将对话历史中提及的关键信息补充到当前查询中,使其成为独立的、完整的查询。 | 当前查询包含“这个”、“它”、“上面说的”等指代词的对话场景。 |
| 对比型查询改写 | 当查询涉及比较多个实体时,在查询中显式添加“与…的区别”、“优缺点对比”等比较性词汇,使查询意图更明确。 | 用户提问涉及两个或多个实体比较的场景。 |
| 查询分解 (子查询改写) | 将一个复杂的、包含多个子问题的查询拆解成一系列简单的子查询,分别检索后再综合答案。 | 处理复杂或多主题的查询,避免不同主题信息相互干扰。 |
| 退一步提示 (Step-Back Prompting) | 让大模型从包含具体细节的原始查询中,抽象出更高层次的概念或通用原则,先基于这个抽象问题进行检索,为回答具体问题提供背景框架。 | 查询非常具体或专业,直接检索相关文档困难时。 |
| 去噪与关键词提取 | 去除查询中冗余的语气词、修饰语和背景信息,直接提取核心关键词,使查询更简洁,更适合关键词检索。 | 查询冗长、包含大量无关细节(噪声)时。 |
💡 如何选择适合的改写方法
选择合适的查询改写方法取决于你的具体应用场景和查询特点:
- 通用场景的稳健选择:多查询重写和假设文档嵌入 是两种应用广泛且效果稳定的方法,适合作为大多数系统的起点。
- 处理对话上下文:如果你的应用包含多轮对话,上下文依赖改写 是必不可少的,它能有效解决指代消解问题。
- 应对复杂查询:对于需要进行对比或包含多个意图的复杂查询,可以尝试对比型查询改写或查询分解。
- 追求深度理解:当需要模型进行更深层推理时,退一步提示 能引导模型从基本原理出发,提升答案的深度和准确性。
🚀 进阶技巧
- 组合使用:这些方法并不互斥。例如,可以先将一个复杂的对比查询分解成若干子查询,再对每个子查询应用HyDE或多查询重写,最后综合所有结果。
- 评估与迭代:引入查询改写后,务必通过检索召回率、答案准确性等指标评估其效果,并根据反馈进行迭代优化。改写后的查询质量很大程度上依赖于所用大模型的能力。
希望以上梳理能帮助你理解和选择适合的查询改写方法。如果你有特定的应用场景或遇到具体问题,欢迎提出,我们可以继续深入探讨。
Embedding & Rerank
在 RAG 系统中,Embedding 模型和重排模型分别承担着“海量筛选”和“精准排序”的关键角色。下面这个表格清晰地展示了它们的核心区别,并列举了当前主流的选择。
| 特性维度 | Embedding模型 (负责“初步召回”) | 重排模型 (负责“精细排序”) |
|---|---|---|
| 核心功能 | 将文本转换为向量,通过计算向量间相似度,从海量文档中快速找出大量可能相关的候选文档。目标是“广撒网”,提高召回率。 | 对初步召回的少量候选文档进行深度语义分析,精确评估其与查询的相关性并重新打分排序。目标是“精捕捞”,提高精确率。 |
| 工作阶段 | 检索流程的第一阶段 | 检索流程的第二阶段(在Embedding模型之后工作) |
| 典型输出 | 文本的稠密向量表示 | 查询-文档对的相关性分数 |
| 计算复杂度/速度 | 相对较低/较快(可预先计算文档向量) | 相对较高/较慢(需实时计算查询与每个候选文档的相关性) |
| 核心技术/架构 | 双编码器,如BGE、GTE、OpenAI text-embedding系列 | 交叉编码器(如BGE-Reranker, Cohere Reranker)或LLM |
💡 主流模型选择与协作策略
了解区别后,如何为你的项目选择合适的模型并让它们协同工作呢?
-
Embedding模型选型参考
- 通用多语言/中文场景:BGE系列(如
BAAI/bge-large-zh-v1.5)和GTE系列是不错的选择,它们在多项基准测试中表现优异,且开源免费 。 - 依赖OpenAI生态:可选用
text-embedding-3-small或text-embedding-3-large,需注意其为闭源API服务 。 - 特定需求:处理超长文本可考虑
Nomic-Embed;专门优化中文可关注M3E系列 。
- 通用多语言/中文场景:BGE系列(如
-
重排模型选型参考
- 开源优选:BGE-Reranker 系列(如
BAAI/bge-reranker-base)是开源方案中的佼佼者,支持中英文,平衡了效果与成本 。 - 商用API服务:Cohere Rerank 和 Voyage Rerank 提供高精度的托管服务,适合追求效果且不愿自运维的团队 。
- 效率与精度平衡:ColBERT 采用“延迟交互”机制,在大规模文档库的检索中,能在精度和速度间取得较好平衡 。
- 开源优选:BGE-Reranker 系列(如
-
高效协作策略
最佳实践是采用 “分层处理”管道 :- 第一层:快速召回。使用 Embedding 模型从全部文档中快速检索出成百上千的候选文档(如Top 200)。
- 第二层:精准重排。将第一步得到的大量候选文档交给重排模型,由其精排出最相关的少量结果(如Top 5)再提供给LLM生成答案。
💎 总结与核心建议
简单来说,Embedding模型负责“找得多”,重排模型负责“选得准”。它们不是替代关系,而是互补关系 。
在进行技术选型时,最关键的是结合你的具体应用场景、数据特性(如语言、长度)、对响应速度的要求以及计算资源预算。通常建议先从一款成熟的开源Embedding模型(如BGE)和一款开源重排模型(如BGE-Reranker)开始搭建基线系统,再根据实际效果进行迭代优化。
在构建RAG系统时,如何在BGE和Qwen3这两个优秀的模型系列中选择合适的Embedding和Rerank模型,确实是一个关键问题。下面的对比将帮助你清晰地把握它们的特点。
| 特性维度 | BGE 系列 | Qwen3 Embedding & Reranker 系列 |
|---|---|---|
| 核心架构 | 基于Transformer的Encoder架构。使用特殊的[CLS]标记,其对应的向量代表整句语义。 |
基于Qwen3的Decoder架构(移除了因果掩码)。使用句子末尾的[EOS]标记对应的向量代表整句语义。 |
| 训练数据与方法 | 依赖从开源社区收集的公开数据集,采用Mask猜词与相似度计算进行训练。 | 利用Qwen3基座模型主动合成高质量、多维度数据,并采用多阶段训练与模型融合技术。 |
| 指令感知 | 支持基础的指令微调,旨在提升模型在不同任务下的泛化能力。 | 支持强大的动态指令感知。查询时可附加Prompt(如“寻找写作风格相似的文档”),使同一文档库支持多维度检索。 |
| Embedding模型核心优势 | 成熟稳定、生态完善、部署简单。在中文场景下表现优异,是经过大量实践检验的可靠选择。 | 性能领先、灵活智能。尤其在多语言、代码理解和长文本处理上表现卓越,支持通过指令动态调整检索意图。 |
| Rerank模型工作方式 | 采用典型的交叉编码器架构,将查询和文档拼接后输入模型,直接输出一个相关性分数。 | 将重排任务转化为二元分类问题。模型会判断文档是否相关,并以概率形式输出得分(score = P(“yes”)),更具解释性。 |
| Rerank模型核心优势 | 技术路线经典,与主流框架兼容性好,理解和调试相对直观。 | 在多项基准测试中性能显著领先同参数规模模型,对代码、多语言等复杂语义理解更深。 |
💡 如何选择:场景与建议
了解区别后,你可以根据具体需求做出选择:
-
追求稳定与快速落地:如果你的项目需求相对稳定,对成本敏感,或者希望使用一个社区成熟、文档丰富的模型来快速搭建和验证系统,BGE系列是一个非常稳妥和经典的选择。它在中文任务上的表现已经相当出色。
-
追求极致性能与灵活性:如果你的应用场景涉及多语言内容、代码检索,或者需要处理超长文档,并且你希望系统能够根据用户意图进行智能、动态的调整(例如实现个性化推荐),那么Qwen3系列在性能上的优势会更加明显。它的指令感知能力为产品设计提供了更大空间。
-
构建高性能RAG流水线:一个常见的优化策略是采用“BGE Embedding + Qwen3 Reranker”的混合方案。即用BGE Embedding进行初步的快速召回(因为它效率高),再用Qwen3 Reranker对召回结果进行精细重排(因为它精度高)。这在平衡效率和效果方面往往能取得很好的结果。
embedding数据库选择
| 特性维度 | FAISS | Chroma | Milvus | Qdrant |
|---|---|---|---|---|
| 核心定位 | 专注于向量相似性搜索的高性能库 | 开发者友好的嵌入式向量数据库,开箱即用 | 专为超大规模数据设计的分布式向量数据库 | 提供丰富功能和API优先的向量数据库 |
| 部署方式 | 作为一个Python库直接集成到应用中,无独立服务 | 可作为嵌入式数据库使用,也支持客户端-服务器模式 | 需要独立部署和运维的分布式服务 | 需要独立部署服务,通过HTTP/gRPC接口调用 |
| 扩展性 | 主要用于单机,扩展性有限 | 适合中小规模应用,扩展性一般 | 扩展性极佳,支持分布式集群,可处理亿级甚至更多的向量 | 支持分布式部署,扩展性好,适合中大型在线服务 |
| 性能特点 | 检索速度极快,尤其在使用GPU加速时 | 性能适中,对于中小规模数据表现良好 | 为海量数据下的高性能、低延迟检索而优化 | 使用Rust开发,注重性能和高效率 |
| 易用性 | 需手动处理索引构建和持久化,有一定复杂度 | API简单直观,内置持久化,上手非常快 | 学习曲线较陡峭,部署和配置相对复杂 | 提供清晰的API,但需要额外部署服务 |
| 主要优势 | Facebook开源,在单一机器上速度优势明显,社区活跃 | 集成简便,适合快速原型开发和实验 | 专为企业级海量数据场景设计,功能全面 | 支持多种搜索方式(如元数据过滤),为生产环境打造 |
| 理想适用场景 | 数据量在百万级以内,追求极致检索速度的本地化应用或研究项目 | 中小型项目、概念验证、需要快速上手的开发场景 | 需要处理千万级及以上向量数量的大型企业级应用 | 需要强大功能、分布式特性和REST API的生产级服务 |
💡 如何选择?
你可以根据项目的核心需求,参考以下路径进行选择:
- 追求快速验证和简单集成:如果你的目标是快速构建一个原型或中小型应用,希望尽可能简化部署和集成工作,那么 Chroma 是一个很好的起点 。
- 专注高性能和本地部署:如果你的数据量在百万级别以内,且非常看重检索速度,同时希望避免维护外部服务的开销,FAISS 是经过大量实践检验的可靠选择 。
- 应对海量数据和企业级需求:当你的应用需要处理千万级甚至亿级的向量数据,并要求高可用性、可扩展性时,Milvus 或 Qdrant 这类专业的分布式向量数据库是更合适的选择 。
为了帮助您快速了解和选型,下面这个表格详细对比了四款主流的分布式向量数据库在核心架构、性能、功能特性和适用场景等方面的关键差异。
| 特性维度 | Milvus | Qdrant | Weaviate | Chroma |
|---|---|---|---|---|
| 核心架构与设计语言 | 专为海量数据设计的云原生分布式架构(Go/C++),采用计算存储分离的微服务设计。 | 基于Rust语言构建,侧重高性能与内存安全,支持单机和集群模式,架构相对简洁。 | 基于 Go 语言,以 GraphQL 为核心接口,支持模块化扩展,设计上支持单节点和集群部署。 | 设计初衷是轻量级和开发者友好(Python核心),支持嵌入式运行和客户端/服务器模式,易于快速集成。 |
| 分布式与扩展能力 | 扩展性极佳,原生为水平扩展设计,可处理千亿级向量,支持动态扩缩容。 | 支持分片与副本机制,扩展性良好,但在大规模数据集和高并发场景下的表现可能略逊于Milvus。 | 通过分片机制支持水平扩展,能处理亿级向量,混合搜索是其亮点。 | 扩展能力相对较弱,主要面向中小规模数据(百万级以下),大规模扩展并非其强项。 |
| 性能特点 | 高性能,针对十亿级向量数据能做到毫秒级延迟,支持多种高性能索引(如HNSW, IVF, DiskANN)。 | 低延迟、高吞吐,Rust内核带来优异的性能表现,特别擅长高效的元数据过滤。 | 并发性能好,支持HNSW索引,其混合搜索(向量+关键词)能力突出。 | 在中小型数据集上表现良好,适合快速原型开发。大规模数据下性能有显著下降。 |
| 关键功能 | 功能非常丰富,支持多索引、多租户、复杂过滤、TTL等,是企业级应用的强大选择。 | 功能丰富,在强元数据过滤(可前置/后置)、地理搜索、推荐API等方面表现强劲。 | 功能非常丰富,原生支持多模态检索和混合搜索,内置模块可自动向量化数据。 | 核心的向量存储、搜索和过滤功能完善,API简洁。与AI生态(如LangChain)集成紧密,易于上手。 |
| 部署与运维 | 复杂,组件较多,推荐使用Kubernetes部署,运维专业性要求高,适合有专业运维团队的场景。 | 灵活度中等,支持Docker、Kubernetes等多种方式,相比Milvus部署相对简单。 | 灵活度中等,支持Docker、Kubernetes部署,集群配置需要理解其特定概念。 | 极其简单,特别是本地开发模式, pip安装即可使用。服务器模式的部署也相对容易。 |
| 理想应用场景 | 企业级超大规模应用,如十亿级向量的推荐系统、图像/视频检索、生物基因分析等。 | 对过滤条件复杂和查询延迟敏感的语义搜索、广告推荐、实时风控等中大规模场景。 | 需要强大多模态检索或混合搜索能力的中大规模应用,如智能知识图谱、内容推荐平台。 | 快速原型开发、本地实验、桌面应用以及数据量在百万级别以内的中小型项目。 |
💡 如何选择分布式向量数据库
选择哪款数据库,最终取决于您的具体需求、技术栈和资源。您可以参考以下路径进行决策:
- 应对企业级超大规模场景:如果您的项目需要处理千万级乃至百亿级的向量数据,对性能、可用性和扩展性有极致要求,并且拥有专业的运维团队,那么 Milvus 是最可靠的选择。
- 平衡性能、功能与复杂度:如果您的数据量在千万到亿级,希望获得接近Milvus的高性能,同时看重高效过滤和相对简洁的架构,Qdrant 是一个非常好的折中方案。如果您的应用强烈依赖结合关键词和向量的混合搜索,或者需要开箱即用的多模态检索能力,Weaviate 的独特功能会非常有吸引力。
- 追求快速验证与轻量部署:如果您的目标是快速搭建原型、进行概念验证,或者您的数据量在百万级以下,希望极简的部署和集成体验,Chroma 是理想的选择。
💎 总结与建议
总的来说,这四款数据库各有侧重。Milvus 和 Qdrant 更像是为大规模生产环境准备的“重器”,而 Chroma 和 Weaviate 则在易用性和特定功能上表现突出。
一个实用的建议是:在项目早期,可以先用 Chroma 快速验证想法和流程。当业务数据和并发增长后,再根据对性能、扩展性和功能(如混合搜索、多模态)的具体要求,评估是否迁移到 Qdrant、Weaviate 或 Milvus。
embedding向量查找算法
理解您想系统了解嵌入向量的查找算法。这些算法对于构建高效的语义搜索、推荐系统或RAG应用至关重要。下面这个表格汇总了主要的向量查找算法及其核心特征,方便您快速对比。
| 算法类别 | 代表算法 | 核心原理 | 优点 | 缺点 | 典型适用场景 |
|---|---|---|---|---|---|
| 精确查找 | 线性搜索 | 计算查询向量与数据库中每一个向量的距离 | 结果100%准确 | 计算成本极高,无法扩展 | 数据量极小(如数百个)的验证性场景 |
| 基于树结构 | KD树 | 递归地将k维空间分割成二叉树结构 | 在中低维空间效率较高 | 维数灾难(维度升高后性能急剧下降),构建耗时 | 维度较低(通常<20)且数据量不大的场景 |
| 基于哈希 | 局部敏感哈希 | 设计特殊哈希函数,使相似向量以高概率落入同一个哈希桶 | 查询速度极快 | 精度通常较低,对参数敏感 | 对速度要求极高,可接受一定精度损失的场景 |
| 基于量化 | 乘积量化 | 将高维向量分割成子空间并分别量化,用编码近似表示原向量 | 压缩率极高,大幅节省存储和内存 | 量化会引入误差,精度有损失 | 海量数据(亿级以上)存储和检索,内存资源紧张 |
| 基于图结构 | HNSW | 构建分层导航小世界图,高层实现快速粗筛,底层实现精细搜索 | 速度和精度平衡极佳,是目前主流选择 | 索引构建较慢,内存占用较高 | 对查询速度和精度要求高的通用场景,如推荐系统、语义搜索 |
💡 核心概念:近似最近邻搜索
面对海量高维数据,精确查找的计算成本变得无法承受。因此,在实际应用中,我们几乎总是采用近似最近邻搜索。
ANN的核心思想是牺牲少量精度以换取查询速度的数量级提升。它不再保证找到绝对最近的邻居,而是通过高效的索引结构,快速找到距离查询向量“足够近”的候选向量。对于绝大多数应用来说,95%以上甚至99%的召回率已经足够,而速度却能提升成百上千倍。
🔍 主流算法详解
在ANN算法中,基于图的方法(尤其是HNSW)和基于量化的方法是目前应用最广泛的两大方向。
-
HNSW:高性能的通用选择
HNSW可以说是当前最流行的向量检索算法。其灵感来自于可导航的小世界网络(如社交网络),通过构建一个多层次的图结构来工作。高层的图连接较稀疏,便于快速进行远距离“跳跃”,迅速定位到目标区域。底层的图连接密集,用于在目标区域内进行精细搜索,找到最邻近的节点。这种结构使得HNSW在搜索时能够实现对数级别的时间复杂度,在亿级数据上也能达到毫秒级的响应速度,同时保持很高的召回率。 -
乘积量化:为海量数据而生
乘积量化是一种通过压缩技术来应对海量向量的方案。它的核心步骤是分块、聚类、编码:首先将高维向量切分成多个低维子向量;然后在每个子空间内进行聚类,得到一组聚类中心(码本);最后,每个原始向量可以用其各个子向量所属聚类中心的索引编码来表示。这样,一个浮点数向量就被压缩成了一个短短的整数编码,存储空间可以降低数十倍。在搜索时,通过查询向量与码本中聚类中心预先计算的距离表,可以高效地估算出与库中压缩向量的近似距离。这种方法特别适合当数据量远超内存容量时的磁盘检索场景。
🛠️ 如何选择算法?
选择哪种算法取决于您的具体需求和约束条件:
- 数据规模与维度:这是首要考虑因素。千万级以下的数据,HNSW通常是性能最优的选择。如果数据量达到亿级甚至更大,需要优先考虑内存占用,可以评估乘积量化或HNSW与量化结合的混合方案。
- 精度与速度要求:如果对精度要求极高且数据量不大,可以调大HNSW的参数或考虑精确搜索。如果对速度要求极端苛刻,可以尝试LSH或高度优化的量化方法。
- 系统资源:内存充足时,HNSW的性能表现非常出色。如果内存紧张或需要处理十亿级数据,量化方法是更可行的选择。
- 数据更新频率:对于需要频繁更新的数据库,HNSW的增量插入能力通常比需要全局重新构建的量化方法更有优势。
📚 学习与工具推荐
理论结合实践能更好地掌握这些算法。推荐您使用Faiss这个强大的开源库,它由Facebook开发,集成了上述几乎所有主流算法(包括HNSW、PQ、LSH等),并提供了Python接口,非常适合进行实验和原型开发。
数据:
https://www.sudugu.org/txt/?id=128&p=1
https://www.sudugu.org/txt/?id=128&p=2
https://www.sudugu.org/txt/?id=128&p=3
https://www.sudugu.org/txt/?id=128&p=4
https://www.sudugu.org/txt/?id=128&p=5
https://www.sudugu.org/txt/?id=128&p=6
首先安装必要的库
pip install langchain-experimental langchain-community transformers torch chromadb flask langchain_openai
文档分割与embedding
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
import glob
from langchain_community.document_loaders import TextLoader
from langchain_experimental.text_splitter import SemanticChunker
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
import hashlib
def generate_document_id(text, metadata=None):
"""为文档生成唯一ID"""
content_hash = hashlib.md5(text.encode()).hexdigest()[:10]
source = metadata.get('source', 'unknown') if metadata else 'unknown'
return f"{source}_{content_hash}"
def get_text_files(directory_path, file_pattern="*.txt"):
"""
获取目录下所有文本文件的路径
参数:
directory_path: 目录路径
file_pattern: 文件匹配模式,如 "*.txt" 或 "*.md"
"""
# 方法1: 使用glob获取当前目录下的匹配文件
file_paths = glob.glob(os.path.join(directory_path, file_pattern))
# 方法2: 如果需要递归获取子目录中的文件,可以使用下面这行代码
# file_paths = glob.glob(os.path.join(directory_path, "**", file_pattern), recursive=True)
print(f"找到 {len(file_paths)} 个匹配的文件")
return file_paths
def chunk_multiple_novels(directory_path, file_pattern="f0*.txt", persist_directory="./chroma_novel_db"):
"""
处理目录下的多个小说文件:分割 → 生成嵌入 → 存入ChromaDB
参数:
directory_path: 包含小说文件的目录路径
file_pattern: 文件匹配模式
persist_directory: ChromaDB持久化存储目录
"""
# 1. 获取所有文本文件路径
file_paths = get_text_files(directory_path, file_pattern)
if not file_paths:
print("未找到匹配的文本文件")
return None
# 2. 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name="Qwen/Qwen3-Embedding-0.6B", # 使用适合中文的轻量级模型
model_kwargs={
'device': 'cuda',
'trust_remote_code': True
},
encode_kwargs={
'normalize_embeddings': True,
'batch_size': 8
}
)
print("✅ 嵌入模型加载完成")
# 3. 创建语义分割器(优化中文分割)
novel_splitter = SemanticChunker(
embeddings=embeddings,
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=85,
sentence_split_regex=r'(?<=[。!?\n])', # 适配中文标点
buffer_size=1,
add_start_index=True
)
all_chunks = []
processed_files = 0
# 4. 逐个处理每个文件
for file_path in file_paths:
filename = os.path.basename(file_path)
print(f"\n📖 处理文件 ({processed_files + 1}/{len(file_paths)}): {filename}")
try:
# 加载文档
loader = TextLoader(file_path, encoding='utf-8')
documents = loader.load()
print(f" 文件加载成功,字符数:{len(documents[0].page_content)}")
# 对每个文档进行语义分割
for doc in documents:
chunks = novel_splitter.split_documents([doc])
print(f" 📊 生成 {len(chunks)} 个语义块")
# 为每个块添加文件来源元数据
for i, chunk in enumerate(chunks):
chunk.metadata.update({
'source_file': filename,
'file_path': file_path,
'chunk_id': i,
'total_chunks_in_file': len(chunks)
})
all_chunks.extend(chunks)
processed_files += 1
# 显示前2个块作为示例
for i, chunk in enumerate(chunks[:2]):
preview = chunk.page_content[:100].replace('\n', ' ')
print(f" 示例块{i+1}: {preview}...")
except Exception as e:
print(f" ❌ 处理文件 {filename} 时出错: {e}")
continue
# 5. 如果有成功处理的块,存入ChromaDB
if all_chunks:
print(f"\n🚀 开始处理 {len(all_chunks)} 个文本块,生成嵌入并存入ChromaDB...")
try:
# 构建向量数据库
vectorstore = Chroma.from_documents(
documents=all_chunks,
embedding=embeddings,
persist_directory=persist_directory,
collection_metadata={"hnsw:space": "cosine"}
)
# 持久化到磁盘
vectorstore.persist()
print(f"✅ 向量数据库构建完成!")
print(f"💾 数据库已保存至: {persist_directory}")
print(f"📊 总共处理了 {processed_files} 个文件,生成 {len(all_chunks)} 个语义块")
return vectorstore
except Exception as e:
print(f"❌ 向量数据库构建失败: {e}")
return None
return None
def query_vector_db(vectorstore, question, k=3):
"""
查询向量数据库
参数:
vectorstore: Chroma向量数据库实例
question: 查询问题
k: 返回最相似的结果数量
"""
if vectorstore is None:
print("❌ 向量数据库未初始化")
return None
print(f"\n🔍 执行查询: '{question}'")
# 相似度搜索
similar_docs = vectorstore.similarity_search(question, k=k)
print(f"找到 {len(similar_docs)} 个相关片段:")
for i, doc in enumerate(similar_docs):
print(f"\n--- 相关片段 {i+1} (来自: {doc.metadata.get('source_file', '未知')}) ---")
print(f"内容: {doc.page_content[:200]}...")
return similar_docs
def load_existing_vector_db(persist_directory="./chroma_novel_db"):
if not os.path.exists(persist_directory):
return None
"""
加载已存在的向量数据库
"""
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5"
)
try:
vectorstore = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
# 检查集合中是否有文档
count = vectorstore._collection.count()
print(f"✅ 数据库加载成功!包含 {count} 个文档")
return vectorstore
except Exception as e:
print(f"❌ 数据库加载失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 配置参数
novels_directory = "./data" # 包含多个小说文件的目录
db_directory = "./chroma_multiple_novels_db" # 向量数据库存储目录
print("=" * 60)
print("📚 多文件小说语义分割与向量数据库构建系统")
print("=" * 60)
# 检查是否已存在数据库
existing_db = load_existing_vector_db(db_directory)
if existing_db is None:
# 执行完整的处理流程
vector_db = chunk_multiple_novels(novels_directory, "*.txt", db_directory)
else:
vector_db = existing_db
print("使用已存在的数据库")
if vector_db:
# 测试查询
test_questions = [
"不同小说中的主人公特点",
"故事中的冒险场景描述",
"情感描写的段落"
]
for question in test_questions:
query_vector_db(vector_db, question, k=2)
print("\n" + "=" * 60)
print("🎉 多文件处理完成!")
print(" 现在您可以对多个小说文件进行语义搜索")
print("=" * 60)
# 显示数据库统计信息
collection_count = vector_db._collection.count()
print(f"\n📈 数据库统计:")
print(f" 总文档数: {collection_count}")
# 获取所有文件的来源统计
if hasattr(vector_db, '_collection'):
results = vector_db._collection.get()
if results and 'metadatas' in results:
sources = [meta.get('source_file', 'unknown') for meta in results['metadatas']]
from collections import Counter
source_count = Counter(sources)
print(f" 文件来源分布:")
for source, count in source_count.items():
print(f" {source}: {count} 个块")
query 重写+embedding查找+rerank+大模型
#encoding:utf-8
import os
import argparse
from flask import Flask
from flask import Flask, request, jsonify, render_template_string
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["DEEPSEEK_API_KEY"] = "sk-replace to yours"
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from typing import List, Tuple
import traceback
class LocalChineseReranker:
def __init__(self, reranker_model_name='Qwen/Qwen3-Reranker-0.6B', device=None):
"""
修复版的重排模型 - 解决padding token未定义问题
"""
# 设备配置
if device is None:
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
else:
self.device = torch.device(device)
print(f"正在加载重排模型: {reranker_model_name}")
print(f"使用设备: {self.device}")
# 加载tokenizer和模型
self.tokenizer = AutoTokenizer.from_pretrained(reranker_model_name)
self.model = AutoModelForSequenceClassification.from_pretrained(reranker_model_name)
# 🚨 关键修复:检查并设置padding token
self._setup_padding_token()
# 将模型移动到设备
self.model = self.model.to(self.device)
self.model.eval()
print("✅ 重排模型加载完成!")
def _setup_padding_token(self):
"""
设置padding token - 解决批量处理错误的核心方法
"""
# 检查当前的pad_token
print(f"当前pad_token: {self.tokenizer.pad_token}")
print(f"当前pad_token_id: {self.tokenizer.pad_token_id}")
# 如果pad_token未设置,使用eos_token作为pad_token
if self.tokenizer.pad_token is None:
print("⚠️ 检测到pad_token未设置,正在配置...")
if self.tokenizer.eos_token is not None:
# 方法1:使用eos_token作为pad_token(最常见解决方案)
self.tokenizer.pad_token = self.tokenizer.eos_token
self.tokenizer.pad_token_id = self.tokenizer.eos_token_id
print(f"✅ 设置pad_token为eos_token: {self.tokenizer.pad_token}")
else:
# 方法2:添加自定义pad_token
self.tokenizer.add_special_tokens({'pad_token': '[PAD]'})
print("✅ 添加自定义pad_token: [PAD]")
# 确保模型配置与tokenizer同步[5](@ref)
if hasattr(self.model.config, 'pad_token_id'):
self.model.config.pad_token_id = self.tokenizer.pad_token_id
print(f"✅ 同步模型pad_token_id: {self.model.config.pad_token_id}")
print("🎯 Padding token配置完成")
def rerank(self, query: str, documents: List[str], top_k: int = 3, batch_size: int = 20):
"""
对初步召回的文档进行重排(分批处理版本)
参数:
query: 用户查询字符串
documents: 初步召回的文档列表
top_k: 返回前K个最相关的文档
batch_size: 批处理大小,默认为20
返回:
ranked_results: 排序后的文档列表,格式为 [(文档内容, 得分), ...]
"""
if not documents:
return []
all_scores = [] # 存储所有文档的分数
processed_docs = [] # 存储处理过的文档,确保顺序一致
# 将文档分成批次处理
for i in range(0, len(documents), batch_size):
batch_docs = documents[i:i + batch_size]
processed_docs.extend(batch_docs)
# 构建当前批次的查询-文档对
batch_pairs = [[query, doc] for doc in batch_docs]
try:
with torch.no_grad():
# Tokenize并自动padding
inputs = self.tokenizer(
batch_pairs,
padding=True, # 启用自动padding
truncation=True,
max_length=512,
return_tensors='pt'
).to(self.device) # 确保输入数据在正确设备上
# 模型推理
outputs = self.model(**inputs)
# 正确的分数提取
if outputs.logits.dim() == 2 and outputs.logits.shape[1] == 1:
# 标准情况: [batch_size, 1] -> [batch_size]
batch_scores = outputs.logits.squeeze(1)
elif outputs.logits.dim() == 2 and outputs.logits.shape[1] > 1:
# 多分数情况: 取第一列(通常相关性分数)
batch_scores = outputs.logits[:, 0]
else:
# 降级处理
batch_scores = outputs.logits.flatten()
# 将分数移到CPU并转换为Python列表
batch_scores = batch_scores.float().cpu().tolist()
all_scores.extend(batch_scores)
# 打印批次处理进度
print(f"已处理批次 {i//batch_size + 1}/{(len(documents)-1)//batch_size + 1}, "
f"当前批次大小: {len(batch_docs)}")
except Exception as e:
print(f"处理批次 {i//batch_size + 1} 时出错: {e}")
# 为当前批次的文档设置默认分数0
all_scores.extend([0.0] * len(batch_docs))
# 确保分数和文档数量一致
if len(all_scores) != len(processed_docs):
print(f"警告: 分数数量({len(all_scores)})与文档数量({len(processed_docs)})不匹配")
# 截断或填充以保持一致性
min_len = min(len(all_scores), len(processed_docs))
all_scores = all_scores[:min_len]
processed_docs = processed_docs[:min_len]
# 按分数从高到低排序
scored_docs = list(zip(processed_docs, all_scores))
ranked_results = sorted(scored_docs, key=lambda x: x[1], reverse=True)
# 返回前top_k个结果
return ranked_results[:top_k]
reranker = LocalChineseReranker()
app = Flask(__name__)
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=10000
)
# 新增:Query 改写模块
rewrite_prompt = PromptTemplate.from_template("""
你是一个修仙小说智能问答助手,你的任务是将用户的口语化、不清晰的问题改写为更专业清晰、更准确的表达,以便更好地进行信息检索。将一个问题从三个方面改出三个问题
原始问题: {question}
改写后的问题:
""")
query_rewriter = rewrite_prompt | llm | StrOutputParser()
embeddings = HuggingFaceEmbeddings(model_name="Qwen/Qwen3-Embedding-0.6B")
vectorstore = Chroma(persist_directory="./chroma_multiple_novels_db", embedding_function=embeddings)
def retriever(vectorstore):
ret = vectorstore.as_retriever(search_kwargs={"k": 300})
template = """使用以下上下文来回答问题。可以加入合理的逻辑推导,但是要说明是推理而来,不用说是第几个文档片段。
{context}
问题: {question}
答案:"""
prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
def rerank_docs(inputs):
question = inputs["question"]
docs = inputs["context"].split("\n\n")
print("before rerank:", len(docs))
# 使用 reranker 对文档进行重排序
reranked_docs = reranker.rerank(question, docs, 30)
outputs = {"question":question, "context": []}
for i, (doc, score) in enumerate(reranked_docs):
print(f"{i+1}. 得分: {score:.4f} 文档: {doc}\n")
outputs["context"].append(doc)
print("after rerank:", len(reranked_docs))
return outputs
rag_chain = (
RunnableParallel({"context": ret | format_docs, "question": RunnablePassthrough()})
| RunnableLambda(rerank_docs)
| prompt
| llm
| StrOutputParser()
)
return ret, rag_chain
ret, chain = retriever(vectorstore)
def ask(question):
inputs = {"question": question}
rewritten_question = query_rewriter.invoke(inputs)
print("rewritten_question: ", rewritten_question)
answer = chain.invoke(rewritten_question)
docs = ret.invoke(rewritten_question)
sources = [{"page_content": doc.page_content} for doc in docs]
return {
"question": question,
"rewritten_question" : rewritten_question,
"answer": answer,
"sources": sources
}
print("load finish")
print("使用 `exit` 退出程序。")
while True:
query = input("\nUser: ")
if query.strip() == "exit":
break
rets = ask(query)
print("question:\n", rets['question'])
print("rewritten_question:\n", rets['rewritten_question'])
print("answer:\n", rets['answer'])
运行
User: 总结一下韩立的生平
rewritten_question: 1. 请系统梳理韩立从凡人到飞升仙界的完整修仙历程与关键节点。
2. 请归纳韩立在《凡人修仙传》系列中的主要身份转变、重要成就及对应阶段。
3. 请概述韩立一生中的重要际遇、核心功法和对其道途产生决定性影响的人物事件。
before rerank: 382
已处理批次 1/20, 当前批次大小: 20
已处理批次 2/20, 当前批次大小: 20
已处理批次 3/20, 当前批次大小: 20
已处理批次 4/20, 当前批次大小: 20
已处理批次 5/20, 当前批次大小: 20
已处理批次 6/20, 当前批次大小: 20
已处理批次 7/20, 当前批次大小: 20
已处理批次 8/20, 当前批次大小: 20
已处理批次 9/20, 当前批次大小: 20
已处理批次 10/20, 当前批次大小: 20
已处理批次 11/20, 当前批次大小: 20
已处理批次 12/20, 当前批次大小: 20
已处理批次 13/20, 当前批次大小: 20
已处理批次 14/20, 当前批次大小: 20
已处理批次 15/20, 当前批次大小: 20
已处理批次 16/20, 当前批次大小: 20
已处理批次 17/20, 当前批次大小: 20
已处理批次 18/20, 当前批次大小: 20
已处理批次 19/20, 当前批次大小: 20
已处理批次 20/20, 当前批次大小: 2
after rerank: 30
question:
总结一下韩立的生平
rewritten_question:
- 请系统梳理韩立从凡人到飞升仙界的完整修仙历程与关键节点。
- 请归纳韩立在《凡人修仙传》系列中的主要身份转变、重要成就及对应阶段。
- 请概述韩立一生中的重要际遇、核心功法和对其道途产生决定性影响的人物事件。
answer:
1. 韩立从凡人到飞升仙界的完整修仙历程与关键节点
韩立的修仙历程可划分为以下关键阶段:
- 凡人起步:出身越国镜州青牛镇五里沟的普通农家,因身具灵根被七玄门墨大夫引入修仙之路,修炼《长春功》,后凭借“升仙令”加入黄枫谷,正式踏入修仙界(见升仙令相关片段)。
- 炼气至元婴期:
- 在黄枫谷期间修炼青元剑诀、大衍诀,参与血色试炼,结丹后游历乱星海,炼制本命法宝青竹蜂云剑(金雷竹法宝)。
- 结婴后返回天南,参与对抗慕兰族、坠魔谷探险,后期进阶元婴后期(大修士),成为天南乃至大晋顶尖强者。
- 化神与飞升灵界:
- 在人界昆吾山事件后,通过空间节点飞升灵界,飞升过程充满风险(见银月提及的“星盘之力”及“北冥岛”经历)。
- 在灵界初期隐匿修为,加入天渊城青冥卫(卓冲提及韩立曾为队长),后游历各族大陆,修为逐步提升至炼虚、合体期。
- 大乘与渡劫飞升:
- 进阶大乘后,参与魔界之战、冥河之地等事件,积累机缘(如始魔之地之行),最终渡飞升之劫。据紫灵所述,韩立飞升仙界的把握超过五成(见“一半几率飞入仙界”片段)。
- 关键节点:
- 升仙令:奠定宗门根基;
- 金雷竹法宝:强化战力与机缘;
- 飞升灵界:突破人界资源限制;
- 大乘渡劫:完成凡俗至仙道的终极跨越。
2. 韩立在《凡人修仙传》系列中的主要身份转变、重要成就及对应阶段
- 身份转变:
- 凡人→低阶修士:七玄门弟子→黄枫谷链气弟子(凭借升仙令)。
- 宗门精英→独行强者:黄枫谷结丹修士→乱星海散修(炼制金雷竹法宝,对抗逆星盟)。
- 人界巅峰→灵界飞升者:天南大修士→灵界青冥卫、炼虚修士(卓冲称其“神通深不可测”)。
- 灵界大能→仙界飞升者:大乘期至尊(黑枭王称其“进阶大乘”),最终渡劫成仙。
- 重要成就:
- 人界阶段:创青元剑诀体系、炼制元婴级傀儡、掌握破灭法目等神通。
- 灵界阶段:修炼炼神术、融合梵圣真魔功、参与广寒界试炼,进阶大乘。
- 终极成就:渡飞升之劫,成为人族数十万年来首位成功飞升仙界的修士。
3. 韩立一生中的重要际遇、核心功法及决定性人物事件
- 重要际遇:
- 升仙令:获得黄枫谷入门资格(叶姓老者接待);
- 金雷竹:炼制本命法宝,奠定越阶战斗基础;
- 逆星盘传送:意外脱离险境(片段提及“被逆星盘传送”);
- 始魔之地机缘:提升飞升成功率(对紫灵提及“多出两成把握”)。
- 核心功法:
- 青元剑诀:主修功法,从链气期延续至大乘期;
- 大衍诀:强化神识,修炼至顶层(片段提及其“神识强大倍许”);
- 明王诀/梵圣真魔功:炼体功法,增强肉身防御;
- 疾风九变:身法神通,提升机动性。
- 决定性人物与事件:
- 墨大夫:引路人,亦为初期危机来源;
- 厉飞雨:世俗挚友,其子孙后代与韩立有渊源(虬须大汉片段);
- 银月/紫灵:红颜知己,多次助其脱困并共参大道;
- 飞升之劫:最终考验,融合毕生积累与机缘方得成功。
说明:以上梳理基于提供的文档片段,并依据《凡人修仙传》系列作品的一般情节进行了逻辑推导,以保持历程的连贯性。关键节点如升仙令、飞升灵界、大乘渡劫等均直接源自片段内容,其他细节根据修仙阶段常见设定做了合理补充。
question:
韩立是怎么一步步进阶到大乘期的?主要有哪些机缘
rewritten_question:
- 韩立从炼气期到大乘期的完整修炼历程与关键突破节点是什么?
- 韩立在进阶大乘期的过程中,获得了哪些核心机缘与关键资源?
- 韩立的修炼路径中,有哪些重要事件与抉择推动了他最终突破至大乘期?
answer:
韩立的完整修炼历程与关键突破节点
韩立的修炼始于炼气期(在黄枫谷修炼长春功,依靠黄龙丹、金髓丸等低阶丹药突破至十一层),随后通过筑基丹成功筑基。筑基后,他修炼《青元剑诀》与《三转重元功》以巩固根基,并借助大衍决增强神识。在结丹阶段,他依靠丹药和功法积累,最终结丹成功。
进入元婴期后,韩立在坠魔谷获得机缘,快速突破至元婴中期,后期则通过寒焰五魔、鬼罗幡等秘术与资源修炼至元婴后期顶峰。化神期的突破得益于绛云丹的无供应(灵药移植秘术使其能大量炼制),使他在人界元气稀薄环境下仍修炼至化神初期顶峰。
飞升灵界后,韩立经历炼虚期(在广寒界获得机缘,连跨两级至炼虚后期顶峰)、合体期(通过广寒界收获、法体双修及雷霆之道感悟,突破至合体中期),最终进阶大乘期*。关键节点包括:炼虚期广寒界机缘、合体期法体双修与心境突破、大乘期对天地法则的领悟与资源积累。
进阶大乘期的核心机缘与关键资源
- 广寒界机缘:韩立在广寒界中获得突破炼虚后期的关键资源,并积累了对后续境界有益的感悟。
- 丹药与秘术:
- 化神期依赖绛云丹(通过风希的灵药移植秘术实现无***炼制),快速修炼至化神初期顶峰。
- 炼体之术与法体双修功法:在灵根不稳时仍可修炼,保障修炼连续性。
- 大衍决增强神识,为高阶突破奠定基础。
- 天地感悟与心境突破:合体期时,韩立通过与天元圣皇等高阶修士论道、经历蛮荒冒险,提升对天地法则的理解。
- 关键资源获取:
- 芥子空间中的灵药移植,解决炼丹原料问题。
- 在蛮荒、冥河之地等地获得异族功法、雷霆之道传承等。
- 渡劫准备:为应对天劫,韩立培养隐雷灵根弟子海大少,并修炼雷霆神通以减轻渡劫负担。
重要事件与抉择推动大乘期突破
- 功法抉择:早期选择《青元剑诀》《三转重元功》与大衍决,奠定扎实根基;后期兼修法体双修与雷霆之道,适应灵根变化并增强渡劫能力。
- 机缘探索:主动进入坠魔谷、广寒界、蛮荒等险地,获取突破瓶颈的关键资源(如灵药、秘术、跨界感悟)。
- 资源管理:巧妙利用芥子空间移植灵药,确保丹药无***供应;收徒传承以换取渡劫助力(如海大少)。
- 心境锤炼:经历多次生死危机(如煞气反噬、强敌追杀),并在合体期后与高阶修士论道,巩固道心。
- 长期规划:韩立始终围绕“突破瓶颈”布局,例如化神期专注绛云丹修炼,炼虚期后注重法体双修,合体期提前培养弟子辅助渡劫。
- 应变能力:面对灵根隐患、煞气反噬等意外,及时调整修炼策略(如炼体术替代法术修炼),保障修炼进程不中断。
注:以上整合自上下文片段中韩立在不同阶段的修炼描述、资源获取及事件选择,并基于修仙小说的常见逻辑(如境界突破依赖资源、机缘与心境)进行了合理推导,以形成连贯的修炼历程。
BGE模型
embedding
# 首先安装必要的库
# pip install langchain-experimental langchain-community transformers torch chromadb
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
import glob
from langchain_community.document_loaders import TextLoader
from langchain_experimental.text_splitter import SemanticChunker
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
import hashlib
def generate_document_id(text, metadata=None):
"""为文档生成唯一ID"""
content_hash = hashlib.md5(text.encode()).hexdigest()[:10]
source = metadata.get('source', 'unknown') if metadata else 'unknown'
return f"{source}_{content_hash}"
def get_text_files(directory_path, file_pattern="*.txt"):
"""
获取目录下所有文本文件的路径
参数:
directory_path: 目录路径
file_pattern: 文件匹配模式,如 "*.txt" 或 "*.md"
"""
# 方法1: 使用glob获取当前目录下的匹配文件
file_paths = glob.glob(os.path.join(directory_path, file_pattern))
# 方法2: 如果需要递归获取子目录中的文件,可以使用下面这行代码
# file_paths = glob.glob(os.path.join(directory_path, "**", file_pattern), recursive=True)
print(f"找到 {len(file_paths)} 个匹配的文件")
return file_paths
def chunk_multiple_novels(directory_path, file_pattern="f0*.txt", persist_directory="./chroma_novel_db"):
"""
处理目录下的多个小说文件:分割 → 生成嵌入 → 存入ChromaDB
参数:
directory_path: 包含小说文件的目录路径
file_pattern: 文件匹配模式
persist_directory: ChromaDB持久化存储目录
"""
# 1. 获取所有文本文件路径
file_paths = get_text_files(directory_path, file_pattern)
if not file_paths:
print("未找到匹配的文本文件")
return None
# 2. 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5", # 使用适合中文的轻量级模型
model_kwargs={
'device': 'cuda',
'trust_remote_code': True
},
encode_kwargs={
'normalize_embeddings': True,
'batch_size': 8
}
)
print("✅ 嵌入模型加载完成")
# 3. 创建语义分割器(优化中文分割)
novel_splitter = SemanticChunker(
embeddings=embeddings,
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=95,
sentence_split_regex=r'(?<=[。!?\n])', # 适配中文标点
buffer_size=1,
add_start_index=True
)
all_chunks = []
processed_files = 0
# 4. 逐个处理每个文件
for file_path in file_paths:
filename = os.path.basename(file_path)
print(f"\n📖 处理文件 ({processed_files + 1}/{len(file_paths)}): {filename}")
try:
# 加载文档
loader = TextLoader(file_path, encoding='utf-8')
documents = loader.load()
print(f" 文件加载成功,字符数:{len(documents[0].page_content)}")
# 对每个文档进行语义分割
for doc in documents:
chunks = novel_splitter.split_documents([doc])
print(f" 📊 生成 {len(chunks)} 个语义块")
# 为每个块添加文件来源元数据
for i, chunk in enumerate(chunks):
chunk.metadata.update({
'source_file': filename,
'file_path': file_path,
'chunk_id': i,
'total_chunks_in_file': len(chunks)
})
all_chunks.extend(chunks)
processed_files += 1
# 显示前2个块作为示例
for i, chunk in enumerate(chunks[:2]):
preview = chunk.page_content[:100].replace('\n', ' ')
print(f" 示例块{i+1}: {preview}...")
except Exception as e:
print(f" ❌ 处理文件 {filename} 时出错: {e}")
continue
# 5. 如果有成功处理的块,存入ChromaDB
if all_chunks:
print(f"\n🚀 开始处理 {len(all_chunks)} 个文本块,生成嵌入并存入ChromaDB...")
try:
# 构建向量数据库
vectorstore = Chroma.from_documents(
documents=all_chunks,
embedding=embeddings,
persist_directory=persist_directory,
collection_metadata={"hnsw:space": "cosine"}
)
# 持久化到磁盘
vectorstore.persist()
print(f"✅ 向量数据库构建完成!")
print(f"💾 数据库已保存至: {persist_directory}")
print(f"📊 总共处理了 {processed_files} 个文件,生成 {len(all_chunks)} 个语义块")
return vectorstore
except Exception as e:
print(f"❌ 向量数据库构建失败: {e}")
return None
return None
def query_vector_db(vectorstore, question, k=3):
"""
查询向量数据库
参数:
vectorstore: Chroma向量数据库实例
question: 查询问题
k: 返回最相似的结果数量
"""
if vectorstore is None:
print("❌ 向量数据库未初始化")
return None
print(f"\n🔍 执行查询: '{question}'")
# 相似度搜索
similar_docs = vectorstore.similarity_search(question, k=k)
print(f"找到 {len(similar_docs)} 个相关片段:")
for i, doc in enumerate(similar_docs):
print(f"\n--- 相关片段 {i+1} (来自: {doc.metadata.get('source_file', '未知')}) ---")
print(f"内容: {doc.page_content[:200]}...")
return similar_docs
def load_existing_vector_db(persist_directory="./chroma_novel_db"):
if not os.path.exists(persist_directory):
return None
"""
加载已存在的向量数据库
"""
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5"
)
try:
vectorstore = Chroma(
persist_directory=persist_directory,
embedding_function=embeddings
)
# 检查集合中是否有文档
count = vectorstore._collection.count()
print(f"✅ 数据库加载成功!包含 {count} 个文档")
return vectorstore
except Exception as e:
print(f"❌ 数据库加载失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 配置参数
novels_directory = "./data" # 包含多个小说文件的目录
db_directory = "./chroma_multiple_novels_db" # 向量数据库存储目录
print("=" * 60)
print("📚 多文件小说语义分割与向量数据库构建系统")
print("=" * 60)
# 检查是否已存在数据库
existing_db = load_existing_vector_db(db_directory)
if existing_db is None:
# 执行完整的处理流程
vector_db = chunk_multiple_novels(novels_directory, "*.txt", db_directory)
else:
vector_db = existing_db
print("使用已存在的数据库")
if vector_db:
# 测试查询
test_questions = [
"不同小说中的主人公特点",
"故事中的冒险场景描述",
"情感描写的段落"
]
for question in test_questions:
query_vector_db(vector_db, question, k=2)
print("\n" + "=" * 60)
print("🎉 多文件处理完成!")
print(" 现在您可以对多个小说文件进行语义搜索")
print("=" * 60)
# 显示数据库统计信息
collection_count = vector_db._collection.count()
print(f"\n📈 数据库统计:")
print(f" 总文档数: {collection_count}")
# 获取所有文件的来源统计
if hasattr(vector_db, '_collection'):
results = vector_db._collection.get()
if results and 'metadatas' in results:
sources = [meta.get('source_file', 'unknown') for meta in results['metadatas']]
from collections import Counter
source_count = Counter(sources)
print(f" 文件来源分布:")
for source, count in source_count.items():
print(f" {source}: {count} 个块")
···
## query
```python
#encoding:utf-8
import os
import argparse
from flask import Flask
from flask import Flask, request, jsonify, render_template_string
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["DEEPSEEK_API_KEY"] = "sk-c19a4123c14642c0a7137858554ee1b5"
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from typing import List, Tuple
import traceback
class LocalChineseReranker:
def __init__(self, reranker_model_name='BAAI/bge-reranker-base', device=None):
"""
修复版的重排模型 - 解决padding token未定义问题
"""
# 设备配置
if device is None:
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
else:
self.device = torch.device(device)
print(f"正在加载重排模型: {reranker_model_name}")
print(f"使用设备: {self.device}")
# 加载tokenizer和模型
self.tokenizer = AutoTokenizer.from_pretrained(reranker_model_name)
self.model = AutoModelForSequenceClassification.from_pretrained(reranker_model_name)
# 🚨 关键修复:检查并设置padding token
self._setup_padding_token()
# 将模型移动到设备
self.model = self.model.to(self.device)
self.model.eval()
print("✅ 重排模型加载完成!")
def _setup_padding_token(self):
"""
设置padding token - 解决批量处理错误的核心方法
"""
# 检查当前的pad_token
print(f"当前pad_token: {self.tokenizer.pad_token}")
print(f"当前pad_token_id: {self.tokenizer.pad_token_id}")
# 如果pad_token未设置,使用eos_token作为pad_token
if self.tokenizer.pad_token is None:
print("⚠️ 检测到pad_token未设置,正在配置...")
if self.tokenizer.eos_token is not None:
# 方法1:使用eos_token作为pad_token(最常见解决方案)
self.tokenizer.pad_token = self.tokenizer.eos_token
self.tokenizer.pad_token_id = self.tokenizer.eos_token_id
print(f"✅ 设置pad_token为eos_token: {self.tokenizer.pad_token}")
else:
# 方法2:添加自定义pad_token
self.tokenizer.add_special_tokens({'pad_token': '[PAD]'})
print("✅ 添加自定义pad_token: [PAD]")
# 确保模型配置与tokenizer同步[5](@ref)
if hasattr(self.model.config, 'pad_token_id'):
self.model.config.pad_token_id = self.tokenizer.pad_token_id
print(f"✅ 同步模型pad_token_id: {self.model.config.pad_token_id}")
print("🎯 Padding token配置完成")
def rerank(self, query: str, documents: List[str], top_k: int = 3, batch_size: int = 20):
"""
对初步召回的文档进行重排(分批处理版本)
参数:
query: 用户查询字符串
documents: 初步召回的文档列表
top_k: 返回前K个最相关的文档
batch_size: 批处理大小,默认为20
返回:
ranked_results: 排序后的文档列表,格式为 [(文档内容, 得分), ...]
"""
if not documents:
return []
all_scores = [] # 存储所有文档的分数
processed_docs = [] # 存储处理过的文档,确保顺序一致
# 将文档分成批次处理
for i in range(0, len(documents), batch_size):
batch_docs = documents[i:i + batch_size]
processed_docs.extend(batch_docs)
# 构建当前批次的查询-文档对
batch_pairs = [[query, doc] for doc in batch_docs]
try:
with torch.no_grad():
# Tokenize并自动padding
inputs = self.tokenizer(
batch_pairs,
padding=True, # 启用自动padding
truncation=True,
max_length=512,
return_tensors='pt'
).to(self.device) # 确保输入数据在正确设备上
# 模型推理
outputs = self.model(**inputs)
# 正确的分数提取
if outputs.logits.dim() == 2 and outputs.logits.shape[1] == 1:
# 标准情况: [batch_size, 1] -> [batch_size]
batch_scores = outputs.logits.squeeze(1)
elif outputs.logits.dim() == 2 and outputs.logits.shape[1] > 1:
# 多分数情况: 取第一列(通常相关性分数)
batch_scores = outputs.logits[:, 0]
else:
# 降级处理
batch_scores = outputs.logits.flatten()
# 将分数移到CPU并转换为Python列表
batch_scores = batch_scores.float().cpu().tolist()
all_scores.extend(batch_scores)
# 打印批次处理进度
print(f"已处理批次 {i//batch_size + 1}/{(len(documents)-1)//batch_size + 1}, "
f"当前批次大小: {len(batch_docs)}")
except Exception as e:
print(f"处理批次 {i//batch_size + 1} 时出错: {e}")
# 为当前批次的文档设置默认分数0
all_scores.extend([0.0] * len(batch_docs))
# 确保分数和文档数量一致
if len(all_scores) != len(processed_docs):
print(f"警告: 分数数量({len(all_scores)})与文档数量({len(processed_docs)})不匹配")
# 截断或填充以保持一致性
min_len = min(len(all_scores), len(processed_docs))
all_scores = all_scores[:min_len]
processed_docs = processed_docs[:min_len]
# 按分数从高到低排序
scored_docs = list(zip(processed_docs, all_scores))
ranked_results = sorted(scored_docs, key=lambda x: x[1], reverse=True)
# 返回前top_k个结果
return ranked_results[:top_k]
reranker = LocalChineseReranker()
app = Flask(__name__)
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=10000
)
# 新增:Query 改写模块
rewrite_prompt = PromptTemplate.from_template("""
你是一个修仙小说智能问答助手,你的任务是将用户的口语化、不清晰的问题改写为更专业清晰、更准确的表达,以便更好地进行信息检索。将一个问题从三个方面改出三个问题
原始问题: {question}
改写后的问题:
""")
query_rewriter = rewrite_prompt | llm | StrOutputParser()
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vectorstore = Chroma(persist_directory="./chroma_multiple_novels_db", embedding_function=embeddings)
def retriever(vectorstore):
ret = vectorstore.as_retriever(search_kwargs={"k": 300})
template = """严格使用以下上下文来回答问题。可以加入合理的逻辑推导,但是要说明从哪里推理而来。
{context}
问题: {question}
答案:"""
prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
def rerank_docs(inputs):
question = inputs["question"]
docs = inputs["context"].split("\n\n")
print("before rerank:", len(docs))
# 使用 reranker 对文档进行重排序
reranked_docs = reranker.rerank(question, docs, 30)
outputs = {"question":question, "context": []}
for i, (doc, score) in enumerate(reranked_docs):
print(f"{i+1}. 得分: {score:.4f} 文档: {doc}\n")
outputs["context"].append(doc)
print("after rerank:", len(reranked_docs))
return outputs
rag_chain = (
RunnableParallel({"context": ret | format_docs, "question": RunnablePassthrough()})
| RunnableLambda(rerank_docs)
| prompt
| llm
| StrOutputParser()
)
return ret, rag_chain
ret, chain = retriever(vectorstore)
def ask(question):
inputs = {"question": question}
rewritten_question = query_rewriter.invoke(inputs)
print("rewritten_question: ", rewritten_question)
answer = chain.invoke(rewritten_question)
docs = ret.invoke(rewritten_question)
sources = [{"page_content": doc.page_content} for doc in docs]
return {
"question": question,
"rewritten_question" : rewritten_question,
"answer": answer,
"sources": sources
}
print("load finish")
print("使用 `exit` 退出程序。")
while True:
query = input("\nUser: ")
if query.strip() == "exit":
break
rets = ask(query)
print("question:\n", rets['question'])
print("rewritten_question:\n", rets['rewritten_question'])
print("answer:\n", rets['answer'])
User: 韩立是如何斩杀螟虫之母的?
rewritten_question: 1. 在修仙小说《凡人修仙传》中,主角韩立凭借何种神通、法宝或战术策略,最终成功击杀螟虫之母?
2. 韩立在与螟虫之母的对战中,具体经历了哪些关键战斗阶段或转折点,从而实现了对其的斩杀?
3. 从修为境界、功法克制或环境因素等角度分析,韩立能够战胜螟虫之母的核心原因是什么?
before rerank: 382
已处理批次 1/20, 当前批次大小: 20
已处理批次 2/20, 当前批次大小: 20
已处理批次 3/20, 当前批次大小: 20
已处理批次 4/20, 当前批次大小: 20
已处理批次 5/20, 当前批次大小: 20
已处理批次 6/20, 当前批次大小: 20
已处理批次 7/20, 当前批次大小: 20
已处理批次 8/20, 当前批次大小: 20
已处理批次 9/20, 当前批次大小: 20
已处理批次 10/20, 当前批次大小: 20
已处理批次 11/20, 当前批次大小: 20
已处理批次 12/20, 当前批次大小: 20
已处理批次 13/20, 当前批次大小: 20
已处理批次 14/20, 当前批次大小: 20
已处理批次 15/20, 当前批次大小: 20
已处理批次 16/20, 当前批次大小: 20
已处理批次 17/20, 当前批次大小: 20
已处理批次 18/20, 当前批次大小: 20
已处理批次 19/20, 当前批次大小: 20
已处理批次 20/20, 当前批次大小: 2
-
得分: 5.6883 文档:
这时,紫灵接着又说道:
「据说不过短短千余年时间,这只螟虫之母就带领多达数亿的子孙,将原本界面的其他种族生灵全都屠杀干净。 而再过万余年后,整个界面就因为天地能量都被吞噬一空缘故,万物皆枯,并最终开始崩溃开来。 那只螟虫之母却在界面毁灭的前一刻,竟运用莫大神通,带着其子孙硬生生破空离开破裂的界面,进入了附近相邻的另一界面中。 不过数万余年时间,这个新进入的界面就上演了同样一幕,同样被硬生生耗尽了能量,开始崩溃。 就这样,以后的十几万年中,这位螟虫之母带着其子孙,接连毁灭了数处界面,并最终惹得上界的注意,也不知用什幺办法,竟然让两名真仙本体直接降临下来,并将这位螟虫之母和其子孙引到了魔界,展开一场厮杀。 听说当年的那番激战,几乎到了天崩地裂的地步,殃及了无处地域,现在魔界不少险地秘境都是在这场大战后,才得以形成的。 而此战最终结果,却是螟虫之母所有子孙都被斩尽,自己重创之下,则被两名真仙用一种仙界之术封印到了如今的始印之地中,永远沉睡下去。 」
「既然擒住这螟虫之母,,两名真仙何不直接取了它的性命,何必再多费功法的封印起来。 现在的魔界大劫,莫非是这螟虫之母再次苏醒了不成? 」韩立听到这里,眉头微微一皱的问道。
「为何那两名真仙没有灭掉螟虫之母,因为年代太久远的缘故,不太好说了。 可能这螟虫之母有什幺保命手段,根本无法彻底灭杀掉。 也可能一番大战后,两名真仙也重伤在身,已经无法做到此事了。 不过不管当初因为什幺缘由,韩兄现在猜想的都不错,那螟虫之母的确在万余年前就开始渐渐苏醒了,并且又繁殖出了众多的子孙,开始不停的冲击封印。 三大始祖被惊动之后,则从外面不停用各种方法来加强巩固封印,并派人不断击杀从封印缝隙中冲出的各类低中阶螟虫,也不过只能延缓螟虫之母真正冲出封印的时间而已。 而等此虫本体一旦得以脱困,魔界的下场可想而知了。 那螟虫之母可不会收留任何俘虏或者努力,万物接都要被其吞噬一空的,这可是真正的魔界大劫。 」紫灵说到最后,脸上也露出忧心的神色。
「听紫灵之言,若这螟虫之母真将魔界弄得毁灭,下一步岂不也有可能跨界来到我们灵界了。 」韩立脸色一下变得异常难看,不禁问了一句。
「和魔界相邻的界面,并不只是灵界,还有其他数个界面。 但若魔界不复存在了,灵界的确有一定机率成为下一个要遭毒手的地方。 而就算不是,等附近几个界面全都消亡掉,灵界则肯定也难逃这一劫了。 」麻衣少女却这般说道。 -
得分: 5.6266 文档:
「韩立? 就是那名在魔界斩杀了螟虫之母的人族大乘? 」道姑听了后,有几分吃惊了。
「能斩杀那头螟母绝非在下一人之力,外界传闻实在有些夸大了。 」韩立则微微一笑的回道。
光头大汉宫装女子等人,也均或多或少的露出惊讶之色来。
显然那头螟虫之母的厉害,这些大乘中真正强者都或多或少知道一些的。
「啧啧,不管怎幺说。 那头螟虫之母可是连仙人都无法真正降服的存在,这一次有道友加入的话,我等可就又多了一分把握。 」光头大汉啧啧称奇的说道。
「韩道友,你才进阶大乘不久,以前这些道友恐怕很少接触过,让老夫来介绍一二吧。 这位是巨手族的化影道友。 一身隐匿神通堪称妙绝大陆。 这是古黎族的乌夫人,其本命祝融神火威力无穷,足可煮海融山……」明尊指着光头大汉宫装女子等人,主动替韩立一一介绍起来。
这些人虽然通常在普通修炼者中名声不显,但毫无疑问他们才是灵界中真正顶阶存在。
「明兄,这一次要对付的是一名真仙,不会只有我们这些人吧。 」银罡子和韩立刚一分别落座,就坦然的向明尊直接问道。 -
得分: 5.5871 文档:
这时他才一转首,冲远处某个方向淡淡的说了一句:
「宝花道友,你也在一旁观看了许久了,也该现身出来了吧。 刚才你那秘术虽然极耗元气,但也不至于真让你一丝自保之力都没有了吧。 」
「韩兄果然神念强大远超我等这些人。 不过刚之言却真的是误会妾身了。 」那边看似空荡荡的虚空处,波动一起,宝花就脸色异常苍白的现身而出,但方一出现,就苦笑一声的冲韩立说道。
」妾身如今的确是法力所剩无几,这隐匿秘术动用的其实一位好友赠送的某种秘符才能做的
此女虽然口中满是解释之言,但是望向韩立的目光却无法掩饰一丝的震惊神色。
显然韩立和螟虫之母这一战,表现出的惊人神通,让这位远魔族始祖也大感骇然,自愧远远不如的。
故而她现在再面对韩立时,虽然面上仍显得镇定,但是心中不觉已经有了极深的忌惮之意。
「道友应该很清楚,能够击杀这只螟虫之母,可不是我的功劳,而是另有人出的手。 」韩立摇了摇头,从怀中取出了一个药瓶,倒出数颗翠绿欲滴的丹药,一口吞下后,才徐徐的说道。
「但不是韩道友神通惊人,竟有办法困住这头螟虫之母片刻,那刑罚天雷纵然厉害,却也绝无法击杀这头虫母的。 不过话说回来了,这个能操纵天雷之人到底是何人,不但能知道这里发生一切,还有办法直接传音给你我二人。 若不是这人传声过来,你我刚才恐怕真的要逃之夭夭了。 韩兄对这人身份,有什幺想法吗? 」宝花黛眉皱了一皱后,又神色一肃的说道。 -
得分: 5.2431 文档:
这可远比啊原先预料的要强大的多了。
不对,此凶虫明明才刚刚醒来,怎会一下就恢复了这般强大神通。
那封印之灵不是已经用全部力量来压制此虫实力了吗!
若是在受到封印力量压制的螟虫之母,仍具有轻易秒杀大乘的实力,上古时候岂不是早就纵横无数界面,一两名真仙又怎可能真将其镇压封印住的。
韩立毕竟不是一般修士,瞬间就想到了可疑之处。
但还未等他想联系其他人时,耳中却忽然波动一起,传来了宝花清晰的话语声:
「韩兄,眼前之人也不是螟虫之母的本体,而是其元神出窍幻化而成的一具化身而已。 故而除了玄天之物可以伤及其身外,其他一切宝物很难对其造成伤害的。 其对时间法则只是掌握了一丝皮毛,不能轻易动用的,每用一次,都会让其元神瞬间衰减一分的。 我等只要用玄天之物护住自身,就无需被对方恐吓住的。 」
「道友如何知道的这般详细! 」韩立心中一怔,不禁传音回问了一句。
「是封印之灵悄悄沟通妾身,刚刚相告的。 现在你我联手将对方牵扯住,让其余道友到水下将其本体彻底毁掉。 只要本体不再,光剩下的螟虫之母元神也就不足为惧了。 」宝花苦笑一声的回道。 -
得分: 5.0947 文档: 其手中之物通体晶莹漆黑,赫然是螟虫之母被刑罚之雷击杀后,仅剩下的那一块不知名黑色晶石。
韩立得到此物也有不短一段时间了,经过无数次神念探查和多次翻看一些典籍,也明白了此物的来历。
它正是螟虫之母这类强大妖虫在面临毁灭前,将体内精华尽数注入妖核后,留下的东西。
当然若是有可能,这些妖虫还会趁机将一缕残魂藏入其内,好用避过眼前大劫。
不过那螟虫之母的元神精魂,却是真正的冰消溶解了。
即使这晶核真有一定抵挡攻击的奇效,但是面对刑罚之雷这等的仙界天雷,却是避无可避的。
刑罚之雷的强大威能,早就扫荡过晶核里面的一切东西,甚至连晶核本身也冰消溶解了大半之多。
韩立现在将此物拿出来,一副犹豫不决的样子,似乎有什幺棘手事情极难下决定。
一阵低低的嗡声传出!
虽然近似低不可闻,但是落在韩立耳中却犹如惊雷般清晰。 -
得分: 5.0729 文档:
这时候。 韩立却顾不得螟虫之母如此就轻易被击杀的事情,所化巨猿正在抱住中间头颅的就地狂滚起来。 口中同时发出中痛楚之极的吼声。
其庞大身躯在滚动中飞快缩小的收起法相,一身紫金甲衣以肉眼可见的速度还原成紫金色鳞片,然后重新的消退而去。
足足一盏茶工夫后,韩立重新恢复了原形,勉强的站起身来,并有些昏沉沉的摇了摇沉重无比的脑袋。
刚才的变身,不但让他真元大损,幻化的神念之链更是让神识之力几乎消耗一空。 -
得分: 5.0478 文档:
「当年的事情虽然有些不堪回首,但是和你说上一些,倒也没有大碍的。 当年那头螟虫之母肆虐下界时,被上界监察仙使大人察觉后,就派我和另外一名巡查使者共同下界铲除此妖。 当然,那时候我等仙人虽然到下界来非常不易,但是通过一些特殊手段还是能做到的……」钵盂中沉寂了片刻后,竟然徐徐响起了男子讲述的声音。
能够听到一名上古传闻中的参与者,亲自讲述当年的事情经历,当然不是每个大乘存在都能有的经历,韩立自然也打起了十分的精神的凝神细听。
「虽然没有想到眼看我二人就要将螟虫之母彻底斩杀掉的时候,一场星空巨变竟然恰好的爆发而出,并直接影响到了各个界面之间。 我等一下遭到了原本通过宝物和秘术强压制的界面之力! 结果形势一下逆转,我等法力被压制下,反被这螟虫之母差点吞噬掉。 后来无奈之下,我二人只能采用两败俱伤的办法,同时自爆了身躯施展了某种仙家秘术,才重创了螟虫之母。 当然到了那时,我们也再也没有办法破去虫母的不灭之体,只能在藉助附身两名高阶魔族,修建起这座巨大封印来,并留下一番叮嘱的言语。 那时候,我等已经发现,那场星空巨变后,我二人就失去了和仙界的联系,并且没有办法按照原先的方法回到仙界。 于是,我们藉助魔族大乘的身份,悄悄探查了下界的一些著名的界面。 结果发现这场星空巨变影响了所有界面,让界面之力比以前几乎激增了十倍以上,也的确找不到任何方法主动回到仙界后。 无奈之下,我二人只能返回此界封印之地,布置下这个小型法阵,并让元神遁入其中,开始沉睡起来。 我们那时也只能寄希望,仙界的一些好友至交,还能想起我们,会设法破开界面的来营救。 在如此漫长的时间内,我二人每隔千余年就会暂时苏醒一次,但是每一次都是失望之极。 而如此长的时间慢慢过来后,我哪位同伴有些绝望之下,和我终于出现了一些争执。 结果几番争吵后,在一次苏醒后,她竟然忽然手制住了我,将贫道的元神真封印在了现在这件容器内。 」
男子的声音在祭坛上回响不已,言语中终于出现了一丝异样的波动。
「她自己却带着法阵原本用来维持神魂不灭的玉清灯油,去找那头被封印的螟虫之母了。 至于下场如何,你在见到那头螟虫之母的时候,应该也猜到了几分吧。 而贫道这边要不是多了个心眼,事先留下了一点玉清灯油,恐怕早在不知多少年前就先他一步的魂飞魄散了。 至于她为何会如此做,想来多半是想藉助那螟虫之母身躯修炼成真极之躯,然后再尝试强行突破界面之力,重新返回仙界吧。 当然,或许还有其他的一些想法。
-
得分: 4.4910 文档:
因为不愿意被多纠缠什幺。 韩立甚至没让蟹道人出手帮忙,就直接取出了玄天斩灵剑将两只人面虫斩杀了。
以他现在修为,无需动用涅槃之体就可动用这柄玄天之宝的部分力量。 对付两只连大乘都不是的人面虫自然是不不费吹灰之力的事情了
蟹道人见到这一切,神色微微一动,但二话不说的紧跟韩立遁光一闪而去。 。 -
得分: 4.4645 文档:
「找什幺东西? 」
「这元兄就不必多问了。 」韩立淡淡的回道。
话音刚落!
他一根手指一弹,一道法决冲下方光阵激射而入,一道墨绿光柱当即从巨瓶口中一喷而出,直冲九霄。
元魇见此,脸色微变,但犹豫了一下后,没有上前阻拦,只是是脸色自然变得阴似水。
虽然韩立斩杀仙人事情还未传到魔界来,但当年和宝花一同灭杀螟虫之母的事情,也让其早对韩立忌惮异常了。
外加苦灵岛这种地方,原本就魔气稀少,反对魔族大有压制之力,元魇更不愿真在这里和韩立争斗什幺。
当然修道人虎视眈眈的站在一旁,也是让其不敢真翻脸的另一个主要原因。
所以他一番思量后,干脆就站在一旁冷冷注视着韩立下面的一举一动起来。
「咦,坐标wèizhi果然就在那里了。 」
韩立只是闭目略一感应片刻,就顿时有了结果,大袖一抖的将瓶子和阵旗一收后,就和蟹道人化为两道惊虹的破空而走。
元魇见此,毫不犹豫的紧跟而去。 (未完待续……) -
得分: 4.4644 文档: 看来也只有此法最可行了。 当然这也是韩立只是化神中期修为,看起来是几人中最弱的样子,不怕他真的卷宝而逃。
-
得分: 4.3776 文档:
不管是故乡小村突遭强盗洗劫,父母小妹全遭毒手。 还是自己修为全失,重新坠为凡人,以及小瓶的秘密暴露,被整个修仙界修士追杀。 这等无一不触动韩立心中弱点的情景,一一在他面前展现出来,如梦如真,似真似幻,一旦坠入进去根本无法自拔。
即使韩立平时性再坚毅沉稳,也差点因为怒火和恐惧而沉沦其中。
好在那定灵丹和其它宝物,并非浪的虚名,总算在关键时候,保持了他脑中一点清明,这才从得以冲破幻象回归现实。
就算如此,也让韩立出了一身的冷汗。
未等他心神稍定,心魔的下一波攻击紧接又至。
在心神恍惚之间,他陷入众多美妙幸福的幻象之中。
既有和父母小妹重聚一堂,再回幼时的幸福生活,也有蓦然和南宫婉结拜成亲,共同双修美梦,到了最后还出现了墨氏姐妹、陈巧倩等数女共侍一夫的场景。 吧书69新
对于这些,韩立倒只沉溺一下,就摆脱了心中的迷恋。
下面他修为大成,一举称霸天南修仙界,最终得以飞升灵界,再成为仙界仙人,从此与天地同寿的景象,也都陆续一一出现。
他在这些幻象中不知沉醉了多少年月,仿若经历过数世的大喜大悲后,才不知有什幺机缘猛然自己醒悟过来,最终摆脱心魔迷惑,得以元婴成形。
韩立躺在床上默默回忆着,不由得又想起元婴第一次出窍时的情形。
当其元婴刚成、从天灵盖飞出肉体时,他明明感觉到元婴就是自己,自己就是元婴。 但却无法控制元婴的任何举动,值能眼睁睁的看着元婴在自己头颅上戏耍嬉戏,犹如重新回到了无忧无虑年幼时期。
在那一刻,他心里安详平和之极,什幺烦心忧愁之事都抛置了脑后,仿佛进入所谓的返璞归真境界。
事后韩立略一细想,也就明白了会出现这种情形的因由,因为他元婴初成,还无法心神合一的缘故。 等元婴彻底凝形、且修为精进以后,这种事情自然不会再出现了。
在翻来覆去中,因经历了结婴,身形皆疲倦无比的他,迷迷糊糊的入睡了。 此间他竟难得做了一场甘美之极的好梦,似乎再次回到了山间小村,和兄长小妹一齐开怀之极的漫山飞跑,然后回家在父母面前吃饭说笑。
真是一场好梦啊! -
得分: 4.0439 文档: 「果然如此! 看来这些怪虫是和那螟虫之母有些关联了。 」韩立叹了一口气的说道。
「螟虫之母,就是制造魔界大劫,逼得我祖父和莫前辈不得不进入魔界的那个螟虫之母! 」银月听得此话,倒吸了一口凉气。
「不错,我说的正是此虫母! 」韩立苦笑一声的言道。
「这些怪虫既可能和螟虫之母有联系,又这般在魔界大模大样的出现,难道那虫母已经脱困出来了。 」银月脸色难看之极的说道。
「这倒不一定的,也许只是从封印中偷跑出来的一些虫母后裔而已。 」韩立沉吟了一下后,却摇头的说道。
银月闻言,还想再继续问些什幺,但就这片刻耽搁,远处逃窜的上百遁光,就有大半都被灰色虫云吞噬一空,只剩下寥寥十几道还在狂奔,并已经到了人近前处。
遁光中的全都一些法力不弱的高阶魔族,一个个狼狈之极,异常惶恐的惊惧模样。
而韩立甚至单凭肉眼,都能清楚的看到最前边几名魔族的面容了。
这些魔族,一见韩立三人就这般静静停在高空中,一副对远处虫云视若不见的模样,也是面上一呆。 。
其中一一名二十来岁模样的魔族女子,却不加思索的冲韩立等人一声娇叱:「你们还站在那里干什幺,螟虫已经来了,还不赶紧跑走保命去。 」
话音刚落,这些遁光就已经先后一闪的从韩立三人身旁一擦而过,来不及多想的往更远处激射而走了。
韩立见此,微微一笑,再扫了远处虫云一眼后,忽然袖子一抖。 -
得分: 3.9803 文档:
「恐怕多半如此了。 」宝花苦笑一声的言道。
「不管这幺多了,能先重创对方,也是一件幸事的。 你我快些趁此机会找到螟虫之母本体才是正事。 那二位道友到现在还没有讯息传回,看来应该还没有得手的。 」韩立想了一想后,这般说道。
「这个自然……」宝花微微一笑,正想马上回复些什幺的时候,原先女童消失的地方蓦然传出一个尖尖声音:
「你们以为击败了螟一,就可以再无后顾之忧了,真是天大笑话。 现在让我螟二来好好会一会你们。 」
话音刚落,忽然一只擎天巨爪在高空一现而出,并一把向韩立和宝花狠狠一抓而下。
此爪五指一分,几乎遮蔽了大半个天空,前端尖甲就足有十余丈长,并闪动着森寒的青光。
一抓之下,虚空中顿时留下五道奇长的白痕,仿佛将整个天空都一下撕裂开一般。 「别忙,螟二! 也要给我三留下一个玩玩吧。 」另一个阴森声音也一下从四面八方传来
而韩立在刚一听到此声音的瞬间,耳中忽然传来一声诡异的笑声,似女子媚笑,又似女子娇喘**之声。
韩立神识竟不由自主的一个恍惚,双目同时闪过一丝迷茫,手中动作更为之一缓。
与此同时,一声晴天霹雳,一道巨大的灰白色电弧从高空一闪而现,气势汹汹冲韩立一劈而下。
韩立神念是何等强大,外加修炼果炼神术这等逆天秘术,几乎在一个恍惚间,体内马上一股清凉之气从丹田中一冲而出,飞快往头颅中一转后,人马上清醒过来。 -
得分: 3.8852 文档:
「前辈明鉴! 这些螟虫杀不胜杀,并且互相之间会主动合并汇聚一起,让虫群变得越来越大。 否则如今圣界也不会频频出现被虫海直接屠城的可怖传闻了。 」枯瘦老者急忙解释的回道。
「此事暂且不说了,我且问你另外一事。 」韩立想了一想后,又不动声色的说道。
「前辈请问! 」老者躬身回道。
「我和旁边这位道友才重新出世不久,没想到圣界因为螟虫之事,竟然一下变得这般混乱起来。 我且问你,元魇六极他们以及其他一干圣祖道友现在何处,为何没有出面清剿这些螟虫。 我听说,他们在螟虫出现的时候,就大都诡异的不见了。 这到底是怎幺一回事? 」韩立双目微眯而起,缓缓的问道。
「啊,原来二位圣祖大人是隐居多年的前辈,怪不得对二位大人会出现在此地,晚辈对二位前辈也颇感陌生。 至于始祖大人和其他圣祖前辈们的下落……」枯瘦老者闻言心中一惊,但面上却现出几分迟疑来。
「是不是元魇六极他们,正在对付那头螟虫之母,并交代此消息不得轻易外泄的! 」韩立见此微微一笑,并盯着老者慢悠悠的言道。 -
得分: 3.7971 文档:
韩立当然知道这所谓的碧云门,是奇渊岛几大势力之一。
无奈之下,他只好冒险闯进了深海,来躲避这位新结下的大敌。
说起来他也算是走运。 在深海闯荡的数年间,他并没有碰见一只八级以上妖兽。
最危险的一次,只不过是一此引来数只七级妖兽的情况。
虽然让他手忙脚乱了好一阵,但噬金虫、法宝齐出后,仍安然无恙的摆平了它们。
经过这些年的深海捕杀,他终存够了数百枚六七级妖丹,足够炼制丹药而绰绰有余了。 且各种妖搜的材料,同样积攒了一大堆。
如此一来,他这才毅然的原路返回了。
但刚从深海回来,经过此地海域时,他无意中发现一只琉璃兽。
韩立自然没有放过的意思,就布阵将之困住灭杀。
结果没想到,竟引来了鸠面老者三人,还惊惶之极的称呼他为虫魔。
这让韩立自然郁闷无比。
显然最大的可能,就是碧云门遍寻他不到,而又知道他会驱虫术和青竹蜂云剑的模样,这才到处煽风点火的捏造一位虫魔出来。
毫无疑问,对方既想迫坏他的名声,让他在外星海无容身之地。 又想引诱逼迫他现身,甚至直接派人假扮他真的杀人夺宝,来一举两得!
可惜的是,韩立这几年全都在深海区域,他们自然白费工夫了。
不过说到这里。 韩立倒有一点想不通了。
找一位同样精通驱虫术的高阶修士,不是什幺难事。 甚至找一些类似噬金虫的飞虫,也是轻而易举的事情。
但若真是碧云门的人在搞鬼,为什幺假扮他的人使用的飞虫是金银色的,而不是模仿他灭杀碧云门修士时的三色噬金虫。 那逃回去的结丹期修士,这一点总不会弄错吧!
而知道他噬金虫进化前颜色的,这应该是来外星海之前的事情。
难道是……是虚天殿的那些老怪物,追踪到了此处?
韩立细思量到这里时,心中一凛,神色不由大变!
若真是如此的话,情况可真的不妙了。
在原地在静静沉吟了一会儿,韩立忽然一跺足,丝毫征兆没有的腾空飞起。
随后,他化为一道青虹,向雾海小岛方向破天而去。
遁光中的韩立,神色平常,嘴角还隐含一丝冷嘲。
-
得分: 3.7796 文档:
灵虫意外的跨阶进化,从四翅进阶到了六翅,修为能有如此逆天的成长,这真是大大出韩立预料的。
这些蛮荒古虫虽然无法和普通妖兽一般,化形成人身,但也已经有了一些初步灵智。
法力强横之下,自然有了想要斩断那丝心神联系的意思。
他若是法力尚在,凭藉当初种下的禁制,可以轻易的镇压住此虫的反抗。 但偏偏现在体内丝毫法力没有,纵有千般秘术也是无计可施的。
如此情况下,就是出现突然反灵虫噬的局面,也毫不稀奇的。
故而韩立着实是捏了一把冷汗的,刚才甚至做了最坏打算,将灭仙珠也暗暗取了出来。
说起来,这也幸亏当初的十二条蜈蚣,都是从虫卵开始,就被韩立精心培养的,并且一直持续数百年之久。
两者的心神联系早已经坚固异常。 而此虫又是十二条同时凝聚而成,也相当于是将十二份联系融合成了一条,自然更加无法的轻易摆脱了。
蜈蚣这才好一阵的挣扎后,最终放弃了对韩立不利的念头,干脆自行飞走了。
韩立自然只能干瞪眼看着,无法出手阻挡什幺的。
现在的他,望着黑云渐渐远去的影子,心中有些哭笑不得的。
想当初在人界时,他不惜利用神秘小瓶苦心催育此灵虫,结果现在此虫成就了成熟体,反而根本无法控制了。
这让他有一种鸡飞蛋打的郁闷。
不过韩立轻叹了一口气后,心境也就平静了下来。
虽然此虫暂时摆脱了他的控制,但是只要法力一修复回来,还是可能将此灵虫重新降服的。
唯一的顾虑就是,灵界如此之大,修士如此之大。 此虫可别跑的踪影全无,或者被其他那位大神通者先一步的抓住了。
韩立站在原地想了好久,摇摇头的不愿多想此事了。 反而神念一转间,蓦然想起了噬金虫和啼魂兽来。
他当即脸色一沉的快步疾走,片刻工夫就到了百余丈外的某处地方。
只是低首看了一眼,韩立二话不说的单手一握拳,金光闪动间,对准地面就是狠狠一击。
「轰」的一惊天动地的巨响传来,青灰色沙地仿佛被顶阶法宝全力一击一般,以韩立为中心彻底爆裂了开来。
只见沙尘掀起高高的蘑菇状灰尘,一个圆形大坑在下面显现而出,深足有三四丈,宽二十几丈的样子。
在大坑的正中间,摆放着一只储物袋和三只灵兽袋。
韩立先见储物袋袋口完好无损,心中一安,但目光再朝那三只灵兽袋一望后,当即走了过去。
他一把将几只袋子都抓到了手中,面露沉吟之色。
虽然神念无法检查袋中之物,但是储物袋口当初留下的一些密封痕迹全完好无损,再稍微掂了一掂,就可知道袋中东西并未缺少什幺了。
至于那三只灵兽袋,一只空空如也,正是盛装六翼霜蚣的。 、
另外两只袋口微敞,韩立不用看,心神微妙联系下,也能感应到噬金虫和啼魂兽的存在。 甚至从一只袋子中,直接传来了啼魂兽阵阵的酣睡声。
韩立嘴角一翘,最后一丝担心也荡然无存了。
他当即将袋口扎紧,都揣进了怀中。
这些袋子一个个小巧玲珑,从外表,倒倒也看不出韩立身上有丝毫的异常。
不过六翼霜蚣留下的巨大虫壳,倒是颇为的麻烦。
他眉头一皱下,干脆又接连数拳,将将大坑再扩大了一些,将整只虫壳仍进了其中,再用厚厚的沙土掩盖住。
韩立围着原地又转了数圈后,的确发现不出什幺痕迹后,才面露满意之色。
擡首看了看远处黑云消失的方向,脸色阴厉了片刻后,韩立蓦然一转身,朝相反方向扬长而去。
这一次他远行的目标,却是千万里外的一座颇负盛名的妖兽之地。
那里是天元境和某一妖地相邻的边缘之地。
整片区域横垮天元境和妖兽之地,各自拥有其中的一小部分。 而此区域最广阔、最大的一部分区域,则属于三不管的地方,作为缓冲之用的。
故而此区域妖兽、蛮荒古兽,以及众多半妖人频繁活动,越到中间的最广阔地方也就危险之极。
据说还有人见到化神小车的神秘灵族,也见过高达数十丈的上古巨人,还有人声称听到过类似真龙的吼声等等。
如此多的妖异传闻,自然更给这片土地蒙上了一层神秘的面纱。 不过大多数人还是听了这些,都一笑而之的,不会真的相信这些的。
这片区域有化神级的妖修和修士出现,倒是货真价实的事情。 这让人妖两族高层都颇为忌惮的,不约而同的将交手级别,就限制在此境界上了。 若是再高阶的力量出现,那可就真的挑动了人族和妖族之间的大战了。
那可是能直接扰乱天地元气,让河水倒流,巨山平移的逆天角色。
即使三皇和七妖王这等的存在,也不过是合体大成的角色而已。
有这般多危险出现,这片区域原本应该人迹罕至才是。
偏偏此地方一直未遭到人妖两族的正式开发,里面灵脉灵药丰富之极,远超常人想像,甚至有几种根本是此地独产的灵物,连三皇等存在也颇为重视,每年花天价灵石收购它们的。 -
得分: 3.7581 文档:
「不行。 此虫原本就快要清醒过来,伱出入的动静,恐怕立刻就会将其唤醒的。 黑夜界二位道友想来也是顾忌此点,才没敢直接进入此空间的。 毕竟他们和我们不同,可没有封印力量直接送入到此空间中的。 」宝花一口否决道。
其他人听了这话,也觉有理,当即无人再提此事了。
但这时,旁边一直看着高空中巨大光阵中的韩立,却慢慢的说道:
「一些无用的话不用说了,还是趁此虫未醒的时候,
赶快动手的好。 若能一击就重创这螟虫之母,自然是最好不过的事情了。 」
「韩道友此言未免太小看我等了吧。 我们几个若是联手一击,恐怕就是真仙没有防备的挨上,也会当场陨落而亡的。 」黑袍妇人望了韩立一眼,有些不满的说道。
「哼,此虫母若真这般好灭杀,当时封印其的两位真仙也不会只将其勉强镇压了。 韩某做任何事情,一向都是先做最坏的打算再说! 」韩立冷淡的回道。
黑袍妇人听了,脸色一沉,正想再说些什幺,但却被宝花一摆手的打断道了:
「二位道友不用争什幺,我等此行只要尽力就行,最后是否真的能得手,则全看天意了。 但是小心一些,总不会错的。 所以第一击,不但要一起出手,而且妾身会全力催动所借的那件玄天之宝。 诸位要是有什幺压箱手段,也全都拿出来吧。 说不定,这螟虫之母也只会给我们这一次全力出手的机会。 」
「宝花道友此言有理,老夫没有其他意见。 」古朴老者连连点头的表示赞同。
黑袍妇人和红面大汉自然没有反对之意。
韩立却沉吟了片刻后,才凝重的微点下头。
于是宝花见此,脸上露出一丝笑容,轻吸一口气后,就单手一掐诀,背后粉光一闪,一颗粉色巨大花树虚影呈现而出。
同时此女,檀口无声的微动下,另一只手掌的缓缓的一托而起,而五指一分下,手心中却忽然黄光一闪,竟现出一截锈迹斑斑的黄色巨钉。
此钉不过半尺来长,但是表面坑坑洼洼,铭印的一些灵纹模糊不清,仿佛不知埋藏地下多少年的古物,显得破旧异常。
但宝花手托此物,神色肃然,口中法决一停后,更是直接的冲其他人郑重说道:
「这枚土皇钉,蕴含了一界的干土法则在其中,只要被此物钉在身上,任何人一身的土属性神通就再也无法施展分毫。 我没记错的话,这只螟虫之母的本源神通,好像就是土属性的。 所以只要妾身一击得手,此虫母十之的神通就算一下被废掉了。 」 -
得分: 3.7461 文档: 「哪是这般简单之事! 」宝花摇摇头,但并没有再多说什幺,反而望向刚才怪虫消失的地方,脸上露出一丝疑惑来。
「看来道友也发现其中的蹊跷了。 很显然,我们刚才的一番争斗,并未将它们真正的消灭掉。 那个螟虫之母的元神化身不说,这两头怪虫似乎也不是真正肉身之体,并非轻易可以灭杀掉的。 」韩立目光同样一扫过去后,神色有几分凝重的说道。
「的确,刚才这两头怪虫一开始也给妾身一种怪怪感觉。 不能说它们拥有的神通不厉害,但似乎都极端了一些。 ??? ???一个神念之力强大无比,令我等敬而远之。 一个肉身之力强横无匹,单凭一爪之力,就能逼得我们不得不暂避锋芒。 但二者其他手段都太贫乏了一些,这才露出弱点被我等轻易击败的。 」韩立点点头的言道。
「若是这些怪虫是那头螟虫之母培育出来的,那也未免太奇怪了一些。 以这头虫母的狡猾,怎会做这等不智的事情。 」宝花若有所思的说道。
「不过道友是否注意到了。 虽然它们单独之下,你我只要费一番手脚,还可以击败对方。 但它们若是联手,或者说这两头怪虫拥有的神通都被一只同时拥有的话……」韩立忽然嘿嘿一笑的说道。
「的确如此。 若是这些神通都被一只具有,恐怕真要轮到你我逃之夭夭了。 」宝花脸色一白,倒吸一口凉气的说道。
「而且宝花道友是否注意到了,不光一开始的螟虫之母元神化身和这两头怪虫似乎不是一路之人,就是这两头怪虫之间也隐约有些敌意。 否则,一开始它们只要有丝毫联手之意,也不至于被我们抓住弱点的分别击破了。 」韩立脸上浮现出一丝深意之色。 -
得分: 3.5300 文档:
这让他有些百思不解了。
他可不会对这种情况视之不理的,起码要先找出神念流逝的缘由来。
否则怎敢再驱使灵虫对敌的!
韩立稍一沉吟后,擡手冲空中噬金虫一招手。
顿时此虫一个盘旋,立刻落在了其手心处。
一缕神念放出,往此虫身上一绕,但一切正常,并未出现什幺异常。
轻吐了一口气,他又双目微眯的思量一下,忽然想起了什幺,猛然单手一挥,顿时此虫在空中再次飞动起来,神念再次一缠而上。 -
得分: 3.5104 文档:
凭藉着上千噬金虫的漫天寻觅。 许久之后,韩立终于发现了线索,找到了鬼灵门修士前进的路线。
他当即神念向所有分神一催,顿时上千噬金虫立刻回转,向回飞来。
当最后一只噬金虫也进入了袋中时,韩立面嘴角露出一丝冷笑的睁开了双目。 -
得分: 3.5056 文档: 韩立擡手一道法决打了过去。
顿时这些噬金虫在他神念一催之下,猛然往尸魈的残臂处飞去。 在那里凝聚变形。 -
得分: 3.4835 文档: 至此,韩立彻底明白了一切。
原来神念大损的缘由,竟然是成熟体噬金虫飞动起来,身体会自动吸驱动灵虫的神念。 怪不得一催动灵虫后,神念会不知不觉的损耗如此之巨。
知道了惧意原因后,韩立眉头紧皱的想了半天,觉得此事还真的不好解决。
本书首发.,提供给你无错章节,无乱序章节的阅读体验
虽然神念损耗只是暂时情况,一般只要静静打坐一日,或时间长些,就可尽力恢复了。
但若是在争斗中出现此情况,可是绝对致命的危机。
无论功法秘术施展,还是法宝法器驱动,可是都需要大量神念支持的。
看来在噬金虫群没有找出解决之道前,只能当做一种杀手锏来使用了。
单凭此虫方一现身,就吓跑了那条赤影看,噬金虫还真是凶名赫赫,在灵界都有这般大名头。
人界当年那名魔道修士的所谓奇虫榜排名,在韩立如今的眼中早就不值一谈了。 以那名低阶修士见识,自然会出现不少错误,其排名在灵界来说更是大半无用的。
但噬金虫成熟体的威力之大,还是远在韩立预料之外的。
心中思量完毕,韩立也不敢在此久待下去,当即辨认下方向后,就化为一道青虹直奔一线天方向而去了。
若是其他几人未陨落的话,多半还可能在哪里再次汇合的。 虽然他们身上以前下的灵气标记早就溃散消失,但是互相间自然另一套联系方式,只要互相距离不是太远的话,可以互相联系上的。
十余日后,一道青虹孤零零的在沙漠空中悄然激射而走。
遁光本身虽是青色的,但是不知道施展了什幺秘术,让遁光变得暗淡无光。 若不是仔细探查决不易发现的。
遁光中自然是韩立了。
十余天中倒是没有再出什幺事情,也未见有影族之人追来。
似乎那名赤影,真被噬金虫彻底吓跑了。
韩立心安之下,也就一直闷头赶路了。
原来消耗一空的神念,在这些天的飞遁中也自行恢复了过来。
此刻,他手中正把玩着一个光滑异常的玉瓶,正是表面铭印着灭尘丹三个古文的药瓶,里面则装着从天渊城出发时,领取的所有灭尘丹。 -
得分: 3.4618 文档:
「若是如此的话,倒还可以图谋一二的。 不过我当日之所以能在灵界斩杀一具圣祖化身,也是当时其他道友在一旁牵制相助的结果。 ??? ???н??Ж.Cσ? ???否则单凭我一人的话,仍然力有不足的。 」韩立这才神色一缓的说道。 -
得分: 3.4598 文档:
「我也是第一次知道这人的存在。 但既然能催动那般惊人的天雷,显然肯定不是下界之人。 再加上这里是上古封印之地,那人又似乎对这头螟虫之母的情形十分了解。 如此的话,那这人的身份,应该也呼之欲出了。 宝花道友,以你的聪慧,多半应该也想到此点了吧。 」韩立沉默了片刻后,忽然嘿嘿一笑的言道。
「看来,韩兄和妾身所想的真差不多。 那人多半应该是上古时候封印这头虫母的那两名真仙中的一人了。 否则,这一切就无法解释的通。 但是现在这头螟虫之母似乎也不是原来的那头了,其体内的元神似乎也对仙界了解异常,难道是另外一名仙界真仙的元神,占据这虫母的身躯? 」宝花点点头,但又露出一丝疑惑之色的喃喃道。
韩立摸了摸下巴,脸上也露出一些沉吟之色。
「二位小友若想知道其中缘由,不妨直接到贫道这里一趟,不就一切都清楚了。 」深渊上空,忽然传来一个淡淡的男子声音,平和而温厚,赫然正是先前传音给他们的那人。
韩立和宝花闻言面色微微一变,不禁都有些忌惮的互望一眼。 -
得分: 3.4308 文档: 」
韩立双目一睁,一扬手,一道青色法决打在了虫云上。
虫云嗡鸣一声后,一哄而散。 化为朵朵金花朝四面八方分射遁走。
韩立再次闭上双目时,身上灵光开始耀目此言。 紫灵见到此幕,面露一丝吃惊之色,不知韩立要施展的是什幺大神通。
而韩立这时。 却已将大衍决施展到了极致的。 竟强行将自己的神识化为了上千份之多的分神。 除了数个分神还留在身上用来护体防护意外外,其余地分神迅速追上每一只噬金虫,暂时寄附它们身上,展翅向四处分散而去。
藉助噬金虫的双目,不用再感应什幺修士的气息,直接开始向一片片,可能是下个标记的所在一点点的搜索起来。
其中自然不乏遇到空间裂缝,而被吞噬进去地。 或者失陷禁制中而无法返回。 但韩立的分神根本是无形之物,又是寄附之体,一见情况不妙就抢先抛弃了寄附的噬金虫,让分神返回到韩立身边。 不过有即使这样,还是有十几道分神脱离不及,被困或被毁。
碰到这种情形,韩立果断的放弃了这些分神地联系,省得牵连到其他分神。
不过每放弃一道分神时。 韩立脸色就不由得白了一分。
但好在他的神识实在强大之极。 这些分神的损失根本谈不到伤筋动骨,片刻间就神色如常。 -
得分: 3.4011 文档: 虽然说这样没有什幺特殊神通的法宝,韩立还有多件。 但对于一些结丹期修士来说,仍是珍贵异常的宝物。
无需再花费时间培炼威力、直接就可以使用的法宝,即使无法做到心神相通,并且威力也顶多发挥七成,这也是许多普通结丹修士可遇不可求的事情。
毕竟这多年来遗留下的法宝虽然众多,但是大部分都在修士的斗法中毁坏遗失掉了,即使有少部分现存的,也都大多掌握在一些元婴期老怪或者实力过人的结丹期修士手中。
还有一些,则被一些不知名的修士、小势力偷偷隐匿了下来。
象星宫这般的庞大势力,自然收集的法宝众多。 但是同样因为势力过大的缘故,星宫内的结丹修士也数以百计。
这两人都是结丹初期的修士,没有立什幺大功的话,自然无法获得多余的法宝赏赐。
这二人现在意外获得这飞刀法宝,自然是欣喜若狂了。
等炼化它们后,立刻会让他们的实力大涨啊!
至于,那瘦削汉子会乖乖的将那名额让出来,韩立却是真握住了对方的把柄。
当日韩立见那瘦削汉子从星空殿返回的表情实在有些古怪,就当夜潜入了其房内,将对方用秘术迷昏。
虽然没有什幺法术能做到真正控制对方神识,但是让其在半睡半醒之间,用迷魂之术和强大神识配合,让其吐露部分深藏的心声,还是能做到的。
而韩立的运气也算不错,对方吐露的只言片语中,果然透漏了他和两名星宫修士故意擡高传送费用,来压榨其他几人的信息。
韩立如今稍微用此话一要挟,外加那两枚妖丹的诱惑,瘦削汉子果然心惊胆颤的乖乖就范了,甚至丝毫不敢硬挺下去。 或许他以为这一切,都是两名星宫修士故意泄露的吧!
随着咒语之声在殿内回荡,那座传送阵四周白光闪动,接着一阵清鸣声传来,法阵四周的白光蓦然消失了。
「好了,平常这座殿内主事的还另有一人。 但是凑巧他这两日有些事情要办,被派出了星宫殿。 否则,就是你们出太多的灵石,我二人也不会收的。 现在你们把灵石交上来吧。 」秃顶老者看了看被撤销了禁制的那座传送阵,就转过头来对锦衣大汉等人毫不客气的说道。
这几人闻言,立刻早有准备的纷纷掏出了一个储物袋,递给了老者。
韩立则又拿出了两个妖兽的内丹,这让秃顶老者略露出一丝诧异之色。
一一检查了一遍后,秃顶老者满意的点点头。 这时儒雅面容的中年修士,才伸手掏出了几张符箓来,分别递给了韩立几人。
「这些传送符,你们带在身上。 现在可以走了。 」他一指那传送阵,冷冷的说道。
其他人还有些迟疑,韩立却二话不说的先走了过去。
他倒不是艺高人胆大,而是早用神识飞快扫描过了这传送阵,的确一切很正常的样子。
而这传送阵前面的石碑上,铭刻着「奇渊」二字。
韩立脑中对这名字有什幺特殊的印象,看来所去的岛屿应该也没什幺特别之处才是。 -
得分: 3.3095 文档:
「这里就是上古封印所在之处? 」韩立双目一眯,口中喃喃说了一句。
不远处宝huā闻言,轻笑一声的回首道:「韩道友那上古封印的确是在地下深处的。 ?? 6???卄ǘ??.匚O爪 ???上古时候,我等圣族就围绕此封印,将方圆万里地下全都挖掘一空,并修建了一座巨大地宫,还另行布置了一重又一重的玄妙-禁制。 那螟虫之母就深处这地宫中心处。 因为上古封印被那螟虫之母掌控部分力量缘故,原本我等是无法轻易进入地宫中的。 但现在这几天正是天地元气每隔一个周期的大爆发阶段,正是上古封印力量力量不稳之时,我等才能趁机潜入其中的。 否则平常时候我等纵然能依仗神通强行闯入,但也绝对会惊醒那头螟虫之母的。 」
「那头螟虫之母真的如此警觉! 据我所知,所有强大虫类在因为元气损伤而陷入沉睡想恢复力量时,可是极难惊醒的。 除非是潜入其极近处,要采取威胁其性命的举动,这才可能例外的。 」附近一名生有三角眼,穿着一件银丝道袍的老者,却眉头一皱的言道。
「原来是蛊道兄怪不得对虫类凶兽这般了解的。 不过道友不要忘了,这螟虫之母可不是一般凶虫,道友的一些推断用在它上面可不太合适的。 」宝huā扫了那位三角眼大乘一眼,淡淡回了一句。
「哼,希望真是如此吧。 」这位蛊道人却冷哼了一声,似乎对宝huā之言并不太信样子。
「道友要是不信话尽可现在就下去一试。 」宝huā似乎对这位蛊道人也不怎幺感冒,脸色一沉的回了一句后,就不再理会对方了只是自顾自的往峡谷深处眺望而去,似乎在静静等候什幺。
这位蛊道人闻言,脸色一变,三角眼中凶光一闪,却阴沉的没有再说什幺,当然也不会真冒失的朝峡谷深处闯去。
韩立见此却颇有兴趣的多打量这位蛊道人两眼。
在明知道宝huā不是一般大乘,这位蛊道人竟还敢用这种口气和宝huā说话可见也是大有来历之人。
「韩道友,蛊道人为人尖酸异常,但一身蛊术神通,即使我对上也大感头痛的。 ??? ???道友最好不要和其牵扯上什幺关系! 」却是宝huā直接向韩立传音过来。
韩立神色不变,只是微微点下头,没有开口说任何话的意思。
其他的大乘也纷纷悬浮在峡谷上空,静静的等候起来。
不知是那紫色雾气影响,还是因为地下封印力量缘故,所有人神念一没入峡谷百丈深处,就不由自主的一散而开,根本无法探查下方的任何动静。
望着黑乎乎的峡谷,一些大乘老祖也都不由得心生几分忌惮之心而这时,宝huā手中却不知何时多出一块银灿灿阵盘,并单手捏印下,往上面不停打出一道道法诀。
那块银色阵盘在其手心中呼暗忽明,仿佛具有了灵性一般。
足足过了一顿饭工夫后,突然银色阵盘中一阵嗡鸣,随之银芒大盛中,无数银色符文从中狂涌而出,并一阵飘舞不「就是现在,诸位道友,快快进去。 」宝huā脸色一喜,口中一声娇叱后,单手一托银盘,就化为一团粉光的往峡谷深处激射而去。
其他大乘老祖见此,不敢怠慢的也遁光一起,纷纷跟入了其后。
韩立体表淡淡金光闪动不定,将紫色雾气轻易排斥在丈许外,也夹在其他人中的往下飞落而去。 -
得分: 3.2503 文档:
第四百一十五章珠中图
二个月后,韩立终于从密室内走了出来。 ??? ?9???Ж.??? ???
此时的他虽然面容有些憔悴,内心却充满了兴奋之情。
一想到被吸入体内的七十二口「青竹蜂云剑」,韩立就忍不住的嘴角微翘,露出掩不住的喜意。
想他为了这套本命法宝,前后花费了二十多年的心血,总算没有出什幺差错的炼制出来了。
虽然还没有测试过此宝的威力,但想必经过一定时间的培炼后,即使单口飞剑的威力,也绝对远在绿煌剑这样的普通法宝之上。
当他正心中自得之际,神识中也得到了曲魂传来的「噬金虫」产卵的消息。
这让他更是喜上加喜!
韩立回到寝室中稍微休整了一日,就去了虫室一趟。
结果虫室内白花花的一大片,到处都是雪白的噬金虫之卵。
韩立没有迟疑,当即在附近另行开辟了一间虫室,使其和原来的一模一样,然后就在新虫室的地面上刻画了一个巨大的控神法阵,滴入了大量的精血。
随后,他就将大部分虫卵都移到了新虫室的法阵中件,进行了认主的控神仪式。
而原虫室中,则留下了近千枚气息最旺盛的虫卵。
做完这一切后韩立才真正的放松了下来,开始到附近的洞府拜访了一下以前结交的几位修士,好恢复到了正常的修炼之中。
在韩立入世的这些年间,整个乱星海修仙界发生了一连串的大事,显得动荡不安起来,
其中影响最大的,就是包括「六连殿」等大小七八个势力,忽然一夜之间都出现了下属或弟子叛乱的事情,那些首脑或者宗主纷纷下马,被一些原来毫无名气的人顶替了下来。 ??? 6???.?σ? ???
而另有一些不起眼的小宗门,则出现了被人全体灭门和门派重宝被夺的事情。
一时间,乱星海各个势力间人人自危,几乎同时收缩起了人手,并互相猜疑了起来。
但最糟糕的是,不知从何时起,修仙界竟出现了「天星双圣」早已走火入魔,修为全废的谣言。
还说他们如今被几名属下架空了权力,根本无力再掌控星宫了。 -
得分: 3.2383 文档: 虽然这样料想。 韩立还是手指一弹,一只不知何时取出的金色噬金虫,脱手射出,直往空中飞去。
韩立擡首看着此虫。 面无表情。
果然此虫只飞到离地面五六十丈处时,一道蓝色闪电凭空落下,正好击在了噬金虫上。
此虫当即一个打滚,从空中直接跌落而下,但掉落到七八丈高处时。 又双翅一展,若无其事的回复了正常。
见到此幕,韩立露出若有所思神色,随后用神识召回了飞虫。 -
得分: 3.2299 文档:
但就算如此,危险仍然不小的。
韩立从噬炎记忆中得到了这些消息后,大喜过望。 °.°
他现在身具化神级神识,偏偏修炼的是炼体士的功法,神血对他正好合适。
韩立自信单靠顿悟,也一定能成功修成最后一层金刚决,但耗时长短,却一点底没有的。
而小天劫却不知道何时就会降临,他自然越早回复法力越好了。
另一个让他没有多加考虑,就决定浑水摸鱼的因素,却是他现在暂时拥有了施展法力的能力。
虽然只有原先法力的六七成,但以其当初的法力凝厚,几乎就不下于一般的化神修士修为了。
原来在太阴火鸟在吞噬了噬炎之后,一身精纯的火属性灵力,也暂时被此鸟吸纳留存了下来。
韩立如今将此灵力散在体内,可以拿来驱使的。
只是此灵力并非韩立修炼出来的,损耗一点就是一点,无法再生。 因为全是火灵力缘故,他催使起来也无法真正的运转如意。 不过,单凭他一身的诡异神通和那些犀利宝物,足可以傲视同阶修士了。
而且这些火灵力即使现在不使用,随着时间的流逝,也会慢慢溃散消失的。 估计一个月后,他就会重新变成了一个凡人。
韩立可不想白白浪费这个难得的机会,决定冒险将那神血枪到手中。
他借用噬炎气息,瞒过了玄天这种等阶的玄灵,在来到混沌谷猴,就按照其吩咐混入人族中。
结果,现在终于趁乱进入了混沌谷中,从现在开始,他就要独自行动,寻找机会了。
此刻,韩立冲身前的噬灵火鸟,轻轻一点。
顿时银色火鸟双翅一展下,朝一侧石壁中激射过去一声轻响后,就没入壁中不见了踪影。
而韩立自己则单手一翻转,手指间顿时多出了一张淡黄色灵符。
往身上一拍,浑身黄光大放。
他两手一掐诀,身形一晃之下,就要直接施展土遁术没入地下。
但让韩意外的事情发生了。
双腿方没入地下尺许,就一顿的无法再下去了。 地下仿佛有一股诡异的反弹之力,让他根本无法沉下。
韩立心中一凛。
看来这混沌谷还真有些诡异之处,要多加小心一二了。
他如此想着,略一犹豫后,从储物镯中掏出了一张紫色符箓,上面隐隐有数个银色符文闪动,竟然是在灵界也很少有人能掌握的银蝌灵文。
正是韩立看了天澜兽分神所给的金阙玉书残页的体会,外加上自己的一些参悟,在人界在失败了无数次后,炼成的唯一一张半仙家灵符。
此灵符虽然只是残页中记载的几种灵符中最简单的一种隐匿符箓「太一化清符」,但是炼制所需的材料同样再人界难以完全凑齐。
韩立尝试了许多次后,才勉强找到了一部分替代的材料,才炼制成了这幺一张半成品。
因为太过珍惜,并且是一次性符箓,他就没有贸然的试验过。
现在,韩立打算浑水摸鱼的图谋神血,其他隐匿之术,在修为大降下恐怕无法瞒过同阶存在,自然就想到了此符箓。
韩立拿出符箓后,就没有在多加迟疑,手轻轻在身前一晃,随即松开了手指。
紫色符箓爆裂了开来,数个银灿灿的银蝌文随之浮现而出,围着韩立一阵上下飞舞。
随即「噗嗤」几声轻响后,这符文化为一团团银雾,眨眼间就将韩立淹没其中。
片刻后银雾散尽,原地竟空无一人了。
这时,谷口方向又传来了破空之声。 远远望去,又有数道遁光冲进谷中,向这边激射而来。
他们转眼间掠过了韩立刚才隐匿的地方,一闪的冲向了山谷的深处。
韩立心中一喜!
此刻他根本待在原地没动一步,这些人族和妖修竟然丝毫没有察觉他的存在。
他特别看的清楚,其中一名头陀,可是一名化神期修士。
不过他现在的情形也实在有些古怪。
整个人仿佛成了一种透明的雾化存在,躯体仿若无形,一吹就可飘走的样子。
韩立也暗中掐诀试了一下,发现任何太耗费灵力的秘术和法宝都无法动用的样子。
after rerank: 30
question:
韩立是如何斩杀螟虫之母的?
rewritten_question:
- 在修仙小说《凡人修仙传》中,主角韩立凭借何种神通、法宝或战术策略,最终成功击杀螟虫之母?
- 韩立在与螟虫之母的对战中,具体经历了哪些关键战斗阶段或转折点,从而实现了对其的斩杀?
- 从修为境界、功法克制或环境因素等角度分析,韩立能够战胜螟虫之母的核心原因是什么?
answer:
根据提供的上下文,可以回答如下:
1. 韩立凭借何种神通、法宝或战术策略,最终成功击杀螟虫之母?
- 关键战术策略:韩立并非独自击杀螟虫之母,而是与他人协作,并依赖外部强力干预。根据上下文,韩立与宝花等人联手对抗螟虫之母时,韩立的主要贡献是用神通困住螟虫之母片刻,为致命一击创造机会(来源:第三个上下文片段,韩立对宝花说:“但不是韩道友神通惊人,竟有办法困住这头螟虫之母片刻,那刑罚天雷纵然厉害,却也绝无法击杀这头虫母的”)。
- 致命手段:螟虫之母最终被刑罚之雷击杀,这是一种仙界天雷,由一名神秘人物(疑似上古真仙)操纵(来源:第三个上下文片段,韩立提到“能操纵天雷之人”)。韩立自身并未直接施展此雷,而是配合其发动。
- 辅助法宝:韩立在战斗中使用了玄天斩灵剑(来源:第八个上下文片段,提到韩立用玄天斩灵剑斩杀两只人面虫),但在对抗螟虫之母本体时,上下文未明确提及此剑的直接作用,而是强调需用玄天之物护身以抵御螟虫之母的法则攻击(来源:第四个上下文片段,宝花建议“用玄天之物护住自身”)。
2. 韩立在与螟虫之母的对战中,具体经历了哪些关键战斗阶段或转折点?
- 阶段一:识破化身与弱点:韩立最初遭遇的并非螟虫之母本体,而是其元神出窍幻化的化身。宝花通过封印之灵告知韩立,此化身仅能使用皮毛时间法则且惧怕玄天之物,从而制定战术(来源:第四个上下文片段)。
- 阶段二:协作牵制与本体攻击:韩立与宝花联手牵制螟虫之母的化身,同时让其他道友潜入水下攻击其本体(来源:第四个上下文片段,宝花提议“让其余道友到水下将其本体彻底毁掉”)。
- 阶段三:刑罚之雷的致命一击:在韩立困住螟虫之母的瞬间,神秘真仙操纵的刑罚之雷降临,将螟虫之母击杀(来源:第三个上下文片段)。
- 阶段四:战后状态:韩立在此战中消耗极大,真元大损、神识几乎耗尽,并因变身反噬而痛苦倒地(来源:第六个上下文片段)。
3. 韩立能够战胜螟虫之母的核心原因是什么?
- 协作与外部援助:核心原因是团队协作与上古真仙的干预。韩立单独无法击杀螟虫之母,而是依靠宝花的策略、封印之灵的信息、其他道友的攻击,以及真仙操纵的刑罚之雷(逻辑推导:从多个片段综合可见,击杀是多方合作的结果)。
- 战术克制:利用玄天之物对抗螟虫之母的法则神通,并针对其元神化身的弱点(来源:第四个上下文片段)。
- 修为与神通辅助:韩立的神念强大(修炼炼神术)和变身神通(如梵圣真魔功)使其能短暂困住螟虫之母,为刑罚之雷争取时间(来源:第三个、第六个片段)。
- 环境因素:战斗发生在封印之地,螟虫之母的力量可能受到封印压制(来源:第四个上下文片段,提到“封印之灵用全部力量来压制此虫实力”)。
总结:韩立成功击杀螟虫之母是多重因素结合的结果——包括团队战术、真仙外力、玄天宝物克制、以及自身神通牵制,而非单纯依靠个人修为或法宝。
测试
#encoding:utf-8
import os
import argparse
from flask import Flask
from flask import Flask, request, jsonify, render_template_string
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["DEEPSEEK_API_KEY"] = "sk-c19a4123c14642c0a7137858554ee1b5"
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda
from langchain_core.output_parsers import StrOutputParser
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from typing import List, Tuple
import traceback
class LocalChineseReranker:
def __init__(self, reranker_model_name='BAAI/bge-reranker-base', device=None):
"""
修复版的重排模型 - 解决padding token未定义问题
"""
# 设备配置
if device is None:
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
else:
self.device = torch.device(device)
print(f"正在加载重排模型: {reranker_model_name}")
print(f"使用设备: {self.device}")
# 加载tokenizer和模型
self.tokenizer = AutoTokenizer.from_pretrained(reranker_model_name)
self.model = AutoModelForSequenceClassification.from_pretrained(reranker_model_name)
# 🚨 关键修复:检查并设置padding token
self._setup_padding_token()
# 将模型移动到设备
self.model = self.model.to(self.device)
self.model.eval()
print("✅ 重排模型加载完成!")
def _setup_padding_token(self):
"""
设置padding token - 解决批量处理错误的核心方法
"""
# 检查当前的pad_token
print(f"当前pad_token: {self.tokenizer.pad_token}")
print(f"当前pad_token_id: {self.tokenizer.pad_token_id}")
# 如果pad_token未设置,使用eos_token作为pad_token
if self.tokenizer.pad_token is None:
print("⚠️ 检测到pad_token未设置,正在配置...")
if self.tokenizer.eos_token is not None:
# 方法1:使用eos_token作为pad_token(最常见解决方案)
self.tokenizer.pad_token = self.tokenizer.eos_token
self.tokenizer.pad_token_id = self.tokenizer.eos_token_id
print(f"✅ 设置pad_token为eos_token: {self.tokenizer.pad_token}")
else:
# 方法2:添加自定义pad_token
self.tokenizer.add_special_tokens({'pad_token': '[PAD]'})
print("✅ 添加自定义pad_token: [PAD]")
# 确保模型配置与tokenizer同步[5](@ref)
if hasattr(self.model.config, 'pad_token_id'):
self.model.config.pad_token_id = self.tokenizer.pad_token_id
print(f"✅ 同步模型pad_token_id: {self.model.config.pad_token_id}")
print("🎯 Padding token配置完成")
def rerank(self, query: str, documents: List[str], top_k: int = 3, batch_size: int = 20):
"""
对初步召回的文档进行重排(分批处理版本)
参数:
query: 用户查询字符串
documents: 初步召回的文档列表
top_k: 返回前K个最相关的文档
batch_size: 批处理大小,默认为20
返回:
ranked_results: 排序后的文档列表,格式为 [(文档内容, 得分), ...]
"""
if not documents:
return []
all_scores = [] # 存储所有文档的分数
processed_docs = [] # 存储处理过的文档,确保顺序一致
# 将文档分成批次处理
for i in range(0, len(documents), batch_size):
batch_docs = documents[i:i + batch_size]
processed_docs.extend(batch_docs)
# 构建当前批次的查询-文档对
batch_pairs = [[query, doc] for doc in batch_docs]
try:
with torch.no_grad():
# Tokenize并自动padding
inputs = self.tokenizer(
batch_pairs,
padding=True, # 启用自动padding
truncation=True,
max_length=512,
return_tensors='pt'
).to(self.device) # 确保输入数据在正确设备上
# 模型推理
outputs = self.model(**inputs)
# 正确的分数提取
if outputs.logits.dim() == 2 and outputs.logits.shape[1] == 1:
# 标准情况: [batch_size, 1] -> [batch_size]
batch_scores = outputs.logits.squeeze(1)
elif outputs.logits.dim() == 2 and outputs.logits.shape[1] > 1:
# 多分数情况: 取第一列(通常相关性分数)
batch_scores = outputs.logits[:, 0]
else:
# 降级处理
batch_scores = outputs.logits.flatten()
# 将分数移到CPU并转换为Python列表
batch_scores = batch_scores.float().cpu().tolist()
all_scores.extend(batch_scores)
# 打印批次处理进度
print(f"已处理批次 {i//batch_size + 1}/{(len(documents)-1)//batch_size + 1}, "
f"当前批次大小: {len(batch_docs)}")
except Exception as e:
print(f"处理批次 {i//batch_size + 1} 时出错: {e}")
# 为当前批次的文档设置默认分数0
all_scores.extend([0.0] * len(batch_docs))
# 确保分数和文档数量一致
if len(all_scores) != len(processed_docs):
print(f"警告: 分数数量({len(all_scores)})与文档数量({len(processed_docs)})不匹配")
# 截断或填充以保持一致性
min_len = min(len(all_scores), len(processed_docs))
all_scores = all_scores[:min_len]
processed_docs = processed_docs[:min_len]
# 按分数从高到低排序
scored_docs = list(zip(processed_docs, all_scores))
ranked_results = sorted(scored_docs, key=lambda x: x[1], reverse=True)
# 返回前top_k个结果
return ranked_results[:top_k]
reranker = LocalChineseReranker()
app = Flask(__name__)
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=100000
)
text_splitter_rc = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=0,
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " "]
)
# 新增:Query 改写模块
rewrite_prompt = PromptTemplate.from_template("""
你是一个修仙小说智能问答助手,你的任务是将用户的口语化、不清晰的问题改写为更专业清晰、更准确的表达,以便更好地进行信息检索。将一个问题从三个方面改出三个问题
原始问题: {question}
改写后的问题:
""")
query_rewriter = rewrite_prompt | llm | StrOutputParser()
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vectorstore = Chroma(persist_directory="./chroma_multiple_novels_db", embedding_function=embeddings)
def retriever(vectorstore):
ret = vectorstore.as_retriever(search_kwargs={"k": 600})
template = """严格使用以下上下文来回答问题。可以加入合理的逻辑推导,但是要说明从哪里推理而来。
{context}
问题: {question}
答案:"""
prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
def rerank_docs(inputs):
question = inputs["question"]
docs = text_splitter_rc.split_text(inputs["context"])
print("before rerank:", len(docs))
# 使用 reranker 对文档进行重排序
reranked_docs = reranker.rerank(question, docs, 20)
outputs = {"question":question, "context": []}
for i, (doc, score) in enumerate(reranked_docs):
print(f"{i+1}. 得分: {score:.4f} 文档: {doc}\n")
outputs["context"].append(doc)
print("after rerank:", len(reranked_docs))
return outputs
rag_chain = (
RunnableParallel({"context": ret | format_docs, "question": RunnablePassthrough()})
| RunnableLambda(rerank_docs)
| prompt
| llm
| StrOutputParser()
)
return ret, rag_chain
ret, chain = retriever(vectorstore)
def ask(question):
inputs = {"question": question}
rewritten_question = query_rewriter.invoke(inputs)
print("rewritten_question: ", rewritten_question)
answer = chain.invoke(rewritten_question)
docs = ret.invoke(rewritten_question)
sources = [{"page_content": doc.page_content} for doc in docs]
return {
"question": question,
"rewritten_question" : rewritten_question,
"answer": answer,
"sources": sources
}
print("load finish")
User: 韩立与南宫婉什么关系
rewritten_question: 1. 在小说《凡人修仙传》中,主角韩立与角色南宫婉之间具体存在何种人物关系?
2. 韩立和南宫婉的情感发展历程及最终结局是怎样的?
3. 南宫婉在韩立的修仙道路上扮演了怎样的角色,对其产生了哪些关键影响?
before rerank: 748
已处理批次 1/38, 当前批次大小: 20
已处理批次 2/38, 当前批次大小: 20
已处理批次 3/38, 当前批次大小: 20
已处理批次 4/38, 当前批次大小: 20
已处理批次 5/38, 当前批次大小: 20
已处理批次 6/38, 当前批次大小: 20
已处理批次 7/38, 当前批次大小: 20
已处理批次 8/38, 当前批次大小: 20
已处理批次 9/38, 当前批次大小: 20
已处理批次 10/38, 当前批次大小: 20
已处理批次 11/38, 当前批次大小: 20
已处理批次 12/38, 当前批次大小: 20
已处理批次 13/38, 当前批次大小: 20
已处理批次 14/38, 当前批次大小: 20
已处理批次 15/38, 当前批次大小: 20
已处理批次 16/38, 当前批次大小: 20
已处理批次 17/38, 当前批次大小: 20
已处理批次 18/38, 当前批次大小: 20
已处理批次 19/38, 当前批次大小: 20
已处理批次 20/38, 当前批次大小: 20
已处理批次 21/38, 当前批次大小: 20
已处理批次 22/38, 当前批次大小: 20
已处理批次 23/38, 当前批次大小: 20
已处理批次 24/38, 当前批次大小: 20
已处理批次 25/38, 当前批次大小: 20
已处理批次 26/38, 当前批次大小: 20
已处理批次 27/38, 当前批次大小: 20
已处理批次 28/38, 当前批次大小: 20
已处理批次 29/38, 当前批次大小: 20
已处理批次 30/38, 当前批次大小: 20
已处理批次 31/38, 当前批次大小: 20
已处理批次 32/38, 当前批次大小: 20
已处理批次 33/38, 当前批次大小: 20
已处理批次 34/38, 当前批次大小: 20
已处理批次 35/38, 当前批次大小: 20
已处理批次 36/38, 当前批次大小: 20
已处理批次 37/38, 当前批次大小: 20
已处理批次 38/38, 当前批次大小: 8
-
得分: 5.0402 文档: 时间如梭,岁月流逝!
不知不觉间,又有五十年时间过去了!
在这期间,韩立感应到了南宫婉的一次出关,当即也终止了修炼,特地出关和自己这位伴侣相聚一番,并且联襟出游了半年时间。
在游历的时候,韩立自然享尽了南宫婉的缠绵温柔,当二人尽兴的再次回到子母峰,自然又开始了枯燥的闭关修炼。
说起来,这也是身为修士的一种悲哀,一方面,他们可以拥有凡人难及的大神通和相比悠久之极的寿元,一方面又不得不在寿元到来前,一刻不停的修炼着,为着只是那一丝几乎渺茫的之极的长生希望。
若是真是天生具有莫大毅力之辈还好,并不觉得修炼是如何痛苦之事,但对一般修士来说,则就有些进退两难了。
继续修炼,大道渺茫之极,实在不愿此生就这般在打坐闭关中枯燥度过,不修炼,则今生好不容易有机会踏上了修仙之路,就算大道希望再小,也不甘心就这般放弃的。 更何况随着每层境界的提升,还可带来寿元倍增的强大诱惑。
如此一来,这也是造成了修仙界中的修士,出现了两极分化的景象。 -
得分: 4.9123 文档: 第2442卷 真仙降世第两千四百零四章 未雨绸缪
下面的时间,韩立亲自带着南宫婉一一走遍了青元宫的所有殿堂楼阁,并按照其喜欢自行挑选了一间偏殿当做平常居住修炼之所。 ?? ? ?? ?? ???.??? ?? ?? ? ??
不过,在南宫婉看过了青元宫的藏经阁和万宝堂后,还是被里面收藏的各种奇门秘术典籍和数之不尽的法器材料丹药等宝物惊得目瞪口呆。
以韩立这些年的几次奇遇,外加通过斩杀过的那些敌对大乘而得的收获,身家之丰厚,恐怕整个灵界也没有几人可以相比的。
如此多宝物,自然远非久困小灵天的南宫婉可以想像的。
韩立微微一笑,让南宫婉从中精心挑选了几样防身秘宝,又取出了几种丹药后,就将这两处的禁制令牌也交给了此女,让其有需要时尽管自行出入这两处重地。
南宫婉见此,自然异常高兴,没有客气什幺的全都一一收了下来。
下面的时间,韩立在分别召见了青元宫的一些执事,处理了宫中的一些要紧事情,并派出一些人手去寻找冰凤的下落后,就带着南宫婉游遍了整个元合岛和大半个无涯海。 -
得分: 4.9077 文档: 但是有些事情谁也不能有十分肯定的。
万一他这位娇妻另有什幺机缘,短时间内也进阶化神了,现在已经出现在人族中,也不是不可能的。
而以他现在的修为神通,已经足以在人族中自立,可以直接庇护南宫婉了。
一想到自己爱妻的音容相貌,即使韩立这等修炼到心如枯水之人,也不禁有些失神起来。
但片刻后,他就收敛心神,全神贯注的赶路了。
这一次赶路,大出乎韩立预料的顺利。
除了路上斩杀了两只不知好歹的妖禽外,竟然丝毫海兽都未碰到。 在一个多月后,他按照海图,远终于到了一处陌生的海域。
如今他一边疾驰而行,一边神念四下搜查着海面。
按照海图所说,他应该到了那座所谓的「蓝湖岛」附近才是。 但远远望去,附近海面上空荡荡的哪有丝毫岛屿的踪迹出现。
韩立心中略有些奇怪,但是再往前飞遁了百余里后,突然神色一动,方向一调整的遁速加快起来。
结果仅仅一顿饭工夫后,韩立竟然进入一片奇怪的海域中。
天气骤然转眼,海面上竟然下起了大雪,无数白乎乎的雪花夹杂在寒风中呼啸而来,给人一股冰寒刺骨的感觉。 -
得分: 4.8894 文档: 他刚刚将身形隐匿好,并将周身灵气收敛起来。 一道刺目的白光,就闪电一样的无声飞来。
而在白光身后,一团数丈大小的血雾,鬼哭狼嚎之声不绝,紧跟不放。 再稍后点的地方,则有一片粉色的霞光,隐隐发出清鸣之声,同样直追不舍。
躲在下面山林中的韩立,没有注意前面的白光,和后面的粉色云霞,反觉得那团血雾眼熟无比! 这不是那鬼灵门少主的护体魔功吗,难道就是此人?
一想到鬼灵门少主的厉害和所吃的苦头,韩立的神色阴沉了下来。
就在韩立以为,这几人马上就会从其上空急速遁走之时,前面飞驰的白光,忽然间顿了一下,接着光华敛去并停下来,露出了一位站在飞剑之上的白衣女子。
这女子身材修长,头戴斗篷,一现出身形,就冷冰冰的向后说道:
「小辈! 你们穷追不舍,难道真想自寻死路? 」
女子的声音清寒无比,可一听到韩立的耳中,却差点让其一蹦数尺来高。
「这……这好像是那南宫婉的声音,真是此女? 」韩立大吃了一惊!
这位和他有过合体之缘的女子,虽然和他说过的话寥寥无几,但作为韩立人生中的第一位女人,其心里早就将对方音容深记在了脑海中。 -
得分: 4.8567 文档: 此女经过先前的一番交手,终于明白了。 单凭一人之力,恐怕很难应对韩立和南宫婉的联手。
如此一来,她自然要逃出洞府去,召集其他人后,再来制住二人。
毕竟韩立和南宫婉就是再厉害,也绝不会是成千上万的掩月宗弟子对手的。
况且一到了外面,她还可以发动掩月宗的镇派大阵,将二人活活困在其内。 -
得分: 4.7761 文档: 和韩立一齐经历过虚天殿、阴冥之地等诸多事情,并在无边海上共同度过一段日子后,此女和韩立间倒不显得陌生了。 现在甚至有一些把自己当成韩立颜知己的样子。
韩立闻言,打量了此女几眼。
即使以他现在元婴期的心境修为。 一见露出真面目的紫灵,仍觉得心神摇晃,不由自主的被其吸引。 大概书上说的「祸国殃民」,指的就是这等绝色佳人吧!
甚至单以姿色而言,在他心中无法替代的南宫婉,比起此女来都稍逊一筹。
当然南宫婉那种清冷气质和此女地娇艳妩媚,是两种不同类型的风情,不相伯仲的。 -
得分: 4.7583 文档: ……
因为御风车实在太显眼了!
韩立驭车飞行了一段距离,将雷万鹤等人甩的没有踪影后。 就不慌不忙将此车一收,只用普通遁光前进。
如今骤然得到南宫婉的息,并且还是最糟糕的一种,他要冷静的好好思量一番。
当年他和南宫婉只是春风一度,和此女仅有的两次见面,也因为修为身份地巨大差异,如同路人般的没有丝毫柔情可言。
但不知从何时起,韩立早已在潜移默化中。 心中将南宫婉视作自己的女人。
特别在他金丹结成和元婴先后结成,自认为足以匹配南宫婉后,心中对此更是丝毫疑惑没有的。
所以刚一听到南宫婉竟要成为别人的双修伴侣时,他才差点心神失守地大失形态。
故作不知的眼睁睁看着南宫婉嫁给他人为妇,韩立想也不想的根本不会容忍此事情的出现。
这辈子能可以娶此女为妻地男子。 也只能是韩立一人而已。
况且,他也相信作为取了南宫婉真阴的男人,此女对他也不会一点感觉没有的。
三个月后的庆典,韩立决不能让它顺利召开的。 -
得分: 4.7126 文档: 半日后,韩立出现在了洞府中的闭关密室中,身形一动不动,双目轻闭的处于打坐之中。
他现在也只有用修炼,来强迫将南宫婉事情暂时忘记掉,否则一直挂念此事极易产生心魔情障的。
韩立从进入密室开始,就一直处在入定之中,如今终于心如止水了,也缓缓睁开了双目。
一张口,一团龙眼大小的金色丝团从口中喷射而出,滴溜溜的在胸前一阵旋转后,悬浮不动起来。
看着丝团,韩立面无表情的一擡手,手指一弹,一道青色法决击在了其上。
顿一声雷鸣之声发出,金团上一丝丝纤细电弧弹射而起,然后化为一团金芒狂闪几下,所有电弧都骤然消失的无影无踪,只在原地留下一小团蚕豆大小的蓝色火团。
此火团才一现身而出,韩立根本不等它有什幺反应,再一张口,一缕同样颜色火焰从口中喷射而出,一下将这火团卷入了其中。 然后转眼间化为一团鸡蛋大小的火团,激射而回,被韩立一口吞进了腹中。
韩立不言语一句,马上手中结出一个古怪法印,双目再次闭上。
他开始炼化这得自虚天鼎的最后一丝干蓝冰焰了。 若是炼化此焰后真能让他不久后就驱使虚天鼎,那就足以让他纵横此界而无大碍了。 -
得分: 4.6798 文档: 韩立找了一个合适的时机,在服下「魔元丹」等多种灵药,并在极品灵石和五种极寒之焰的辅助下,终于一举突破化神初期成功,成了一名化神修士。
化神一成,韩立就可初步调动天地元气,呼风唤雨,神通几乎和世俗传闻中的神仙一流,并无不同。 可谓一步登天了!
韩立心中大喜,之后立刻离开了坠魔谷,去乱星海一趟。
发现南宫婉和门西卡弟子均都安然无恙,门人甚至还在乱星海发展出了一处不小的势力,直接控制了附近数十余座大小不一的修士岛屿。
韩立对此并未有什幺其他看法,一副不置可否的样子
南宫婉和门下弟子见韩立成就了化神修士,自然也是大喜之极,着实庆祝了一番。
这时的南宫婉在他赠送的大量丹药辅助下,早已进阶后期修为了,正在苦苦修炼,争取能早日修炼到后期大成,也好同样做出突破。
而那石坚也资质着实过人,数百年时间一过,竟也凝结元婴成功了。
让韩立大感欣慰。
但此期间也发生了一件不幸之事,多年齐纳,那慕沛灵因为寿元快到缘故,急于突破元婴瓶颈,结果在闭关时心境露出了一丝破绽,被那心魔趁虚而入,导致法力反噬陨落而亡。
韩立听到此消息心中一愣,有些黯然。 -
得分: 4.5075 文档: 黑色巨舟上人影一晃,韩立就和南宫婉并肩走了下来,后面则跟着花石老祖朱果儿等一干人。
-
得分: 4.4519 文档: 第403章 赤火老怪
第四百零三章赤火老怪
「南宫婉! 」韩立终于找到了那丝涟漪的源头。
这叫卓如婷的女修士,容颜虽然和南宫婉不一样,但的确有一些南宫婉的风韵在身上,这才给他如此异样的感觉,触动了他心底深处的一点心扉。
想明白其中的原因后,韩立有些复杂望了卓如婷一眼后,就将目光收回来,重新恢复了心无波澜的心境。
不过,即使韩立和曲魂到了此处,范夫人和那卓如婷仍没有马上出发的意思,而是不时的往天上望去,似乎还再等什幺人似的。
看到这一幕,韩立有些疑惑,但没有开口问什幺,而是找了个偏僻的角落和曲魂盘膝坐下,静等出发的时间。
这一等,就是小半日间。
若不是在场的人都是修仙者,个个耐性十足,恐怕早有人抱怨起来了。
不过即使这样,终有人露出了不满之色。
见此情景,范夫人和那卓如婷也露出了几分焦虑,并有些不情愿的凑在一齐,低声商量了几句什幺话语。
韩立将这一切收进了眼内,心中正推测她们在等何人之际,忽然隐隐传来了风雷之声,接着远处天边出现了一线乌黑之色。
这黑色由远及近的急速向这里飞来,引的正打坐的众修士,纷纷起身,面露惊疑之色的望去。 -
得分: 4.4136 文档: 这时就是笨蛋也看的出来。 韩立似乎和掩月宗的南宫婉关系,似乎大不简单地!
否则,韩立怎会一听到此事,竟然有如此大的反应。
但接下来大出众人意料的是,韩立脸上寒色,再盯着中年修士一会儿后,就瞬间消失不见了,反而声音一缓的温和说道:
「唐道友不用惊慌。 韩某没有什幺恶意的。 只是听到往日爱慕之人突然要变成他妇,心里有些激动罢了。 既然知道此事,在下自然要去参加好友的大喜之典了。 」
听到韩立说的如此坦然,中年修士反而大松儿了一口气,口中连连说出欢迎的言语。
但韩立只是淡淡一笑,没有再多说什幺。
雷万鹤等人也面上神色一松,毕竟现在越国六派几乎是一体地存在。 自然不想另招惹什幺事端出来。
接下来,韩立又随意的问了一些越国六派的相关事情。 都不是什幺要紧之事。 这五人自然一一告之了。 -
得分: 4.3014 文档: 「这些年,辛苦你了。 要不是你每日按时送灵药过去,我恐怕还无法这般短时间,就将化神初期修炼至顶峰。 」后出现的韩立,对身前和自己面容一般无二之人,忽然一笑的说道。
「我就是你,你就是我,还分什幺彼此? 」第一个「韩立」神色不变,淡淡说道。
他竟是第二元婴***纵的人形傀儡。
而后出现之人,才是在芥子空间中刚刚闭关出来的真正韩立。
现在已经是韩立离开落云宗三百年之后的时间了。
当年他带着南宫婉一离开落云宗后,却通过上古传送阵,将南宫婉他们带到了乱星海去,然后略显神通占据了一座灵脉不错的偏僻小岛。 让南宫婉等人定居下来,而韩立则再次返回天南坠魔谷,要开启了芥子空间,进入其中修炼元磁神光。
在进入芥子空间之前,他将那座天机府放出,将噬金虫等灵虫灵兽存放其中,并修建好了一座药园,将从子母峰带出的玄天仙藤、龙鳞果树等移植进去。
最后他又将人形傀儡留下,将神秘小交给对方,让其来负责照料这一切。
就这样他还有些不太放心,生怕有修士闯入内谷发现其行迹。
就花费了年许时间,布置一个超巨型的上古奇阵,放出了可以扰乱修士神识和五感的迷雾,将内谷大半地方都笼罩其中。 -
得分: 4.2318 文档: 韩立心中一凛,银衫女子见此,凤目中也异芒一闪,但毫不迟疑的说了一声:
「韩道友,我们动身吧。 」
随即此女周身银芒闪动,向黑洞徐徐飘去。
韩立嘴角抽搐一下,单手一拍腰间储物袋,顿时眼前银光一闪,另一个「韩立」出现在了身前。
正是那只人形傀儡。
韩立二话不说的单手一擡,冲着人形傀儡的头颅闪电般一拍。
「噗嗤」一声,一个漆黑如墨元婴从傀儡头顶浮出,乌光一闪下,射入韩立身上不见了踪影。
韩立再冲傀儡轻轻一点,顿时此傀儡银光大放,身形骤然间缩小,化为数寸大小的木偶。
而几乎与此同时,他另一只袖跑一抖,两只蓝色小鼎和一团三色光焰同样飞出,盘旋在了身前。
「婉儿,这些宝物对我通过空间节点没有多大用处了。 你在人界还不知道会遇到什幺劫数,这些东西能助你一臂之力的。 你收好吧。 」韩立说着长袖一拂,顿时一股青霞飞卷而出,将这四样宝物推向了南宫婉。
说完,韩立身形腾空而起,化为一道青虹紧追冰凤而去。
南宫婉一咬牙的纤手一招,将人形傀儡以及其它宝物均收到了手中,然后擡首注视韩立背影,面容有几分苍白。 -
得分: 4.2177 文档: 南宫婉见此,精神一振,猛然一催被困地朱雀环,顿时此宝在凤鸣声中涨大收缩不定,拼命地想要挣脱禁制似的。
一时之间,终于形成了两人联手对抗南宫婉师姐地局面。
三人的手段自然不仅仅只有这些,所以见此局面出现,三人几乎同时又有了举动。
韩立是单手猛然往腰间一扯,将一只灵兽袋祭了出去。
嗡鸣声大起,无数金灿灿飞虫蜂拥而出,形成了一块狰狞可怖的金色虫云。
南宫婉则口中一阵仙乐般的咒语声传出,头顶上空数尺处蓦然浮现赤红色的巨大光晕,如同佛光般的流转不停,并渐渐耀目异常起来。
「轮回神光! 南宫师妹,你真想拼命不成! 竟敢动用此神通! 」
冰冷女则将手中宝镜往头顶一祭,两手一搓,多出一面角形的碧绿小幡出来,但一见南宫婉头上现出的光晕,不禁面色阴沉的说道。
她虽然对韩立释放的金色虫云略感诧异,但倒不怎幺放在心上的样子。 显然不认识这些近似成熟的噬金灵虫。
「师姐不想拼命的话,就那困心术的禁制令牌交出,放我二人离去。 」南宫婉神色如常,平静的说道。 -
得分: 4.2070 文档: 一边那些资质和修为低下的中低阶修士,一旦学有小成,又自觉再次进阶希望不大,就会不元在闭关修炼了,而是更愿意过那种纳妾交友的逍遥生活,有些则干脆返回俗世,开设自己的家族,做一地的土皇帝去。
另一边,那些高阶修士自觉离长生之路较近,则丁点时间都不愿浪费,将全部心神都会放在修炼之上,对其他任何事情都变得漠不关心起来。
韩立和南宫婉自然是属于后者了。 二人现在一个是元婴后期一个是元婴中期,在人界也算是顶阶的修士,只要能飞升灵界,就离真正的长生算不远了。
故而二人虽然结成伴侣后恩爱异常,但在追求男女之欢上倒是颇能自持的。
虽说双修之道对精进修为也是有用处的,但是二人修炼的功法都未涉及此道,并且这些法力精进相对现在二人来说,也实在不值一提。 二人反而都怕过于沉溺此中,坏了心境道基,所以对男女之事并未刻意追求,只是浅尝即止而已。
反因为追求相同天道的缘故,二人在相处的时候,自然而然的做到了心心相印,水乳交融一体的恩爱感觉。
于是二人再次闭关后,都不再轻易的出关了。
直到这一天,子母峰的上空处,突然一声晴天霹雳响动,随即以此峰为中心,方圆数百里的天地元气都被触动了。 -
得分: 4.1822 文档: 「原来如此! 若是这样的话,的确大有可能。 」韩立这才有些恍然,但看着此女和南宫婉如此近似的花容月貌,嘴中仍不觉有些发苦。
他今天还真是有些邪门,先是碰到那秦素儿,被其心幻大法所化的南宫婉吓了一大跳。 结果一回来后,又面对眼前同样近似的一副容颜!
难道婉儿真出了什幺事情?
韩立是修仙之人,对一些冥冥中的预兆之类的事情,自然是有几分相信的。
他眉头不紧皱之下,心中略有些担心起来。
这时,黛儿略微一顿后,又继续说道:
「当乃韩大叔对我的恩情,黛儿一直都没有忘怀。 但人妖毕竟有别,黛儿也不想无端给大叔惹上麻烦的。 这才在前些日子初见时,如此冷淡的。 当年我刚到黑凤宫的时候,并先未见到我的父亲,而是……」
紫衫少女略加解释两句,竟和韩立聊起了当年分别后,在黑凤族生活修炼的事情。
虽然十分的琐碎,但是少女仍然说的津津有味,嘴角含笑。
韩立望着少女酷似南宫婉的面容,虽然只是静静的听着,神色也不觉温柔了几分。
黛儿和韩立这一聊i,足足耗费了数个时辰之久,最后才忽然想起了什幺,有些依恋的说出了告辞之言。 -
得分: 4.0795 文档: 「算了。 是我太贪心了。 有这一道符箓,也是难得之事。 」韩立虽然有些可惜,但转念一想,又哑然失笑起来。
南宫婉呢听到韩立此言,温婉一笑,单手往身上战甲上一拍,顿时六色战甲寸寸碎裂,重新还原成了一张银符。
接着此女冲着此符张口一吹,顿时一道红霞一卷,就将符箓包裹着,直接送到了韩立面前。
韩立没有客气,将符箓收了起来。
下边的日子里,韩立就在岛上停留了下来,和南宫婉整日朝夕相处,恩爱异常。
两人均都知道,无论是韩立是否能偷升到灵界,这段日子恐怕就是二人可以相聚的仅存时光了。 以后,二人很可能天人永隔,再次相聚一起的机率,实在渺茫异常。
故而二人都彻底放开对伴侣的感情,这些日子里简直如胶如漆,寸步不离。
但是三年后的一日,韩立正和南宫婉在雾海附近的一座,景色秀丽的小山上,品茶闲聊,却忽然面色一变的袖跑一抖。 -
得分: 4.0780 文档: ……
韩立和一身白衫的南宫婉并肩站在子母峰的母峰顶部,眺望远处白云翻滚的奇景,两人静静无语,仿佛无声胜有声一般。
不知过来多久后,南宫婉皓腕一拂额前青丝,忽然扭首冲韩立嫣然一笑:
「这一次我也算因祸得福了,藉助姹女天月决在封印中终于突破到了元婴中期。 不过,最后还是要多亏夫君出手相助,竟给我服用了帝流浆这等奇物,这起码省了我十余年的苦修之功,否则现在能否脱困,还是两说。 但夫君如此快就进阶后期,可实在让妾身大出意外啊。 以夫君现在的神通,人界除了那几个轻易不出手的化神期老怪物外,恐怕无人是敌手了吧。 」
「无敌手? 这个可不敢随便说的,既然我能有这等机缘,说不定在人界其他什幺地方,还有其他元婴修士造化不比我差呢! 」韩立微微一笑,倒谦虚的很。
)
这些妇人听完韩立此话,脸色迅速由白转红,倒给她们增添了几分娇艳!
严氏最先从恼怒中恢复了常态,她轻扶了下发髻上的玉钗,重新镇定的说道:「就算阁下真是修仙者,也不畏惧此迷香,但难道就不顾忌身上的阴毒吗? 」她还是拿出了最后的底牌。
- 得分: 4.0504 文档: 韩立在只隐约看到其中一道遁光中的南宫婉满是焦虑的丽容后,就感觉身躯一轻,立刻在无数金光包裹中,沿着光柱的向高空裂缝激射而去。
而在方一进入裂缝的瞬间,韩立只觉整个身躯一僵,头颅一沉,竟就此的昏迷过去了。
……
不知过了多久后,韩立在一股清凉之意中缓缓的张开双目,眼前却出现一张异常英俊的青年男子面孔。
这面孔主人冲其微微一笑,就露出一幅洁白牙齿的说道:
「在下高升,欢迎道友飞升来到北寒仙域! 」
(凡人一书,人界灵界部分到此全部结束了! 呵呵,仙界部分以后有时间的话,也许还会写,但这几年估计不会再写凡人续集了。 )(未完待续……
after rerank: 20
question:
韩立与南宫婉什么关系
rewritten_question:
- 在小说《凡人修仙传》中,主角韩立与角色南宫婉之间具体存在何种人物关系?
- 韩立和南宫婉的情感发展历程及最终结局是怎样的?
- 南宫婉在韩立的修仙道路上扮演了怎样的角色,对其产生了哪些关键影响?
answer:
答案:
1. 韩立与南宫婉的人物关系
根据上下文,韩立与南宫婉是伴侣(夫妻)关系。文中多次提到南宫婉是韩立的“伴侣”“爱妻”“娇妻”(例如第一段提到“韩立感应到了南宫婉的一次出关……和自己这位伴侣相聚”,第四段提到“一想到自己爱妻的音容相貌”,第七段提到“这辈子能娶此女为妻的男子,也只能是韩立一人”)。
2. 情感发展历程及最终结局
- 初遇与情感萌芽:韩立早年与南宫婉因意外发生亲密关系(第四段提到“人生中的第一位女人”),虽初期因修为差距形同路人,但韩立内心已视其为伴侣(第七段)。
- 感情深化:两人历经磨难后结为夫妻,共同修炼、游历(第一段、第二段),感情深厚(第十五段提到“心心相印,水乳交融”)。
- 结局:韩立飞升灵界后与南宫婉重聚,但为追求长生,二人仍需长期闭关修炼(第一段、第十六段)。最终韩立为飞升仙界,在空间节点与南宫婉分离,将部分宝物留给她以助其自保(第十三段),结局时二人天人相隔,南宫婉留于人界。
3. 南宫婉对韩立修仙道路的影响
- 情感寄托与心境考验:南宫婉是韩立重要的情感羁绊,她的安危常影响韩立心境(第七段提到南宫婉遇险时韩立“差点心神失守”),但也促使韩立坚定道心(第八段提到韩立需通过修炼平复对南宫婉的牵挂)。
- 辅助与支持:南宫婉在韩立修炼后期成为其伴侣,共同应对强敌(第十四段提到二人联手对敌),韩立亦为其提供修炼资源(第二段、第八段)。
- 离别推动修行抉择:韩立为飞升仙界不得不与南宫婉分离(第十三段),这一抉择凸显了修仙者追求长生与情感矛盾的悲哀(第一段),南宫婉的存在加深了韩立对“大道无情”的体悟。
推理说明:
- 人物关系与情感发展主要依据第一、四、七、十三、十五段等直接描述。
- 南宫婉的影响基于第七、八、十三、十四段中韩立因她产生的心理波动、共同对敌、离别抉择等情节推导而来,体现了她在韩立修行中的情感与实战支持作用。
User: 韩立和紫灵什么关系
rewritten_question: 1. 在小说《凡人修仙传》中,主角韩立与角色紫灵仙子之间具体存在何种人物关系?
2. 从情节发展来看,韩立与紫灵的情感互动和命运交集主要体现在哪些关键事件中?
3. 相较于韩立与其他重要女性角色(如南宫婉),他与紫灵的关系定位和特殊性是什么?
before rerank: 824
已处理批次 1/42, 当前批次大小: 20
已处理批次 2/42, 当前批次大小: 20
已处理批次 3/42, 当前批次大小: 20
已处理批次 4/42, 当前批次大小: 20
已处理批次 5/42, 当前批次大小: 20
已处理批次 6/42, 当前批次大小: 20
已处理批次 7/42, 当前批次大小: 20
已处理批次 8/42, 当前批次大小: 20
已处理批次 9/42, 当前批次大小: 20
已处理批次 10/42, 当前批次大小: 20
已处理批次 11/42, 当前批次大小: 20
已处理批次 12/42, 当前批次大小: 20
已处理批次 13/42, 当前批次大小: 20
已处理批次 14/42, 当前批次大小: 20
已处理批次 15/42, 当前批次大小: 20
已处理批次 16/42, 当前批次大小: 20
已处理批次 17/42, 当前批次大小: 20
已处理批次 18/42, 当前批次大小: 20
已处理批次 19/42, 当前批次大小: 20
已处理批次 20/42, 当前批次大小: 20
已处理批次 21/42, 当前批次大小: 20
已处理批次 22/42, 当前批次大小: 20
已处理批次 23/42, 当前批次大小: 20
已处理批次 24/42, 当前批次大小: 20
已处理批次 25/42, 当前批次大小: 20
已处理批次 26/42, 当前批次大小: 20
已处理批次 27/42, 当前批次大小: 20
已处理批次 28/42, 当前批次大小: 20
已处理批次 29/42, 当前批次大小: 20
已处理批次 30/42, 当前批次大小: 20
已处理批次 31/42, 当前批次大小: 20
已处理批次 32/42, 当前批次大小: 20
已处理批次 33/42, 当前批次大小: 20
已处理批次 34/42, 当前批次大小: 20
已处理批次 35/42, 当前批次大小: 20
已处理批次 36/42, 当前批次大小: 20
已处理批次 37/42, 当前批次大小: 20
已处理批次 38/42, 当前批次大小: 20
已处理批次 39/42, 当前批次大小: 20
已处理批次 40/42, 当前批次大小: 20
已处理批次 41/42, 当前批次大小: 20
已处理批次 42/42, 当前批次大小: 4
- 得分: 5.2159 文档: 」
韩立听完了这番解释后,心中暗自点下头,倒是接受了这一番解释。
就这般,韩立和紫灵一谈就是小半日之久!
二人之间甚至谈及一些修炼生活上的小事,并且均都津津有味,丝毫没有感觉到时间的流逝。
不知过了多久后,原本笼罩整件屋子的五色光幕忽然间一阵晃动。
就在韩立神色一动的时候,一个充满磁性的女子声音,一下透过光幕的传了进来:
「二位可是已经谈的差不多了! 现在已经到了晚上,继续聊下去的话,本斋可是要关门谢客了。 兄不是还有一件事情,需要小妹帮你解惑吗,不知现在是否还需要? 」
这话语声,自然是那麻衣少女的声音。
」
这女子自然就是易容改扮后,进入坠魔谷的紫灵。
韩立和她约好了。 让她在外谷先寻到有关灵烛果地一些蛛丝马迹。 然后等一些时日,再和她汇合去寻找灵烛果。
紫灵当初答应的很痛快,但心里自然对韩立此条件。 一直有些疑惑。
不过,她也知道此事肯定和她没有什幺关系,一直没有追问过韩立其中的缘由。
如今,她在此林中并未找到目标,犹豫了一下,又驾起遁光向三老者来的方向飞遁而去。
-
得分: 4.9184 文档: 」
「他原本就不该,此时此刻出现在此地。 既然撞上了,我自然不会再放过他的。 」韩立平静的说道,随后几步走动了尸体的旁边,毫不客气的将其腰间储物袋一把抓到手中,同时目光好奇的往那条碧云腰带瞅了一眼。
「那是四象蟠龙带,里面镶嵌了避风、辟火、避水、避尘等四种奇珠在里面,同时具有安神定魂的奇效,算是一件难得的宝物了。 他全靠着此腰带,才能一路无事的攀爬至此。 」紫灵仙子抿嘴一笑的讲解道。
「四象带,的确很适合此时使用。 」韩立犹豫了一下,还是一弯腰,将那腰带也拿到了手中。
随后,他又没有什幺忌讳的在尸体上搜刮了一遍,得了一件碧绿色内甲和其它几件宝物。
「韩兄,这位道友是……」紫灵明眸转动,瞅了几眼韩立身后站立的梅凝,美目一眨的问道。
「这位是梅姑娘。 和我一起传送到此的道友。 」韩立不动声色的沉声道。
「原来是梅姑娘! 」
「梅凝和见过紫灵道友! 」
梅凝有点局促不安,但仍好奇的打量着绝色少女。
紫灵仙子的艳名,她自然如雷贯耳,一时间也被惊人容颜震慑了好一会儿。 现在见韩立竟和对方认识的样子,不禁暗猜测两人的关系。 -
得分: 4.7695 文档: 和韩立一齐经历过虚天殿、阴冥之地等诸多事情,并在无边海上共同度过一段日子后,此女和韩立间倒不显得陌生了。 现在甚至有一些把自己当成韩立颜知己的样子。
韩立闻言,打量了此女几眼。
即使以他现在元婴期的心境修为。 一见露出真面目的紫灵,仍觉得心神摇晃,不由自主的被其吸引。 大概书上说的「祸国殃民」,指的就是这等绝色佳人吧!
甚至单以姿色而言,在他心中无法替代的南宫婉,比起此女来都稍逊一筹。
当然南宫婉那种清冷气质和此女地娇艳妩媚,是两种不同类型的风情,不相伯仲的。
「出了什幺事情,你怎幺亲自过来了。 」韩立有些意外,凝重的问了一句。
按照他与紫灵事先商量好的,为了不让二者间联系引起有心人的注意和给紫灵引来不必要的麻烦,真有什幺要紧事情,通过紫灵心腹送一下传音符,也就可以了。
二人在表面上,还是要尽量先不要见面的好。
可现在紫灵突然亲自出现,并且好像还等候有一段时间的样子,这自然让韩立有些意外了。
-
得分: 4.5220 文档: 否则,不会将时间掐的如此凑巧。
等紫灵仙子从虚天殿出来之时,门内自然早已空空无人了。
至于这股魔道势力,想藉助妙音门的这些女修在此处海域寻找什幺。 这自然另有什幺玄机在里面!
韩立事不管己,也懒得过问此事。
况且那位和自己结下大仇的妙鹤真人,似乎也和如今的妙音门扯上了关系。 韩立更不愿自投罗网的多牵扯进去。
所以,在秘市时他才一口回绝了范夫人的建议。
至于回内星海,他修为没突破瓶颈之前,根本没有考虑过此事。
此地固然妖兽横行,但对身怀宝物的他来说,内星海也不见得有多安全。
短短的时间内,韩立反复思量了文思月的这番言语数遍,并没有发现什幺不妥之处。
看来对他并没有虚言相欺。
这也不怪韩立如此小心,实在身上的虚天鼎太惹人眼红。 不知有多少元婴期老怪,正到处想找他出来。
而古往今来,因为女色落入他人圈套的事情,又不计其数了。 韩立可不想一时大意,而成为其中的一员。
当然总的来说,此女是陷井的可能性,微乎其微。
毕竟谁也不能掌握住他什幺时候现身,出现在什幺地方,而他对自己的「换形决」更是颇有几分的自信。 -
得分: 4.3768 文档: 只能貌似装糊涂的让韩立先说出口来。
韩立听了老者此言,有些似笑非笑的看了他一眼,没有说什幺,却带头向那黑袍人消失的方向走去了。
紫灵仙子自然毫不迟疑的紧跟而去。
葛笠一见此景,愣了下后,只好脸上一红的也跟了上来。
灰白色鬼雾一见有生人走了过来,竟如同有生命般的沸腾起来,并翻滚着扑向了三人。
若是普通的凡人被这些灰白雾气一缠身的话,立刻就会精血吸尽,变成枯尸而亡。 魂魄则成了这些鬼雾的一部分,从此陷入鬼道,再也无法脱身。
但韩立三人可是修仙者,自然不会惧怕这区区的鬼雾了。
只见三人身上光芒闪烁后,各有自己的防护之道。
葛笠是一擡手,放出了一把谈红色的小伞,在头上丈许高处徐徐的转动着。
而一道红蒙蒙的光柱将老者罩在了其中,鬼雾一碰触这些红光,顿时发出了「滋滋」的声音,随后冒出了一股股诡异的青烟,并隐隐发出了鬼哭狼嚎之声。
其它的鬼雾见了,就只敢在红光外张牙舞爪,却不再扑向上去了,仿佛是有智慧一样。
紫灵仙子则释放出了四颗拳头大小的圆珠法器,在周身盘旋,结成了一个丈许大的移动结界。
此结界洁白晶莹成方形,将那些鬼雾全都排斥在了其外,而无法靠近紫灵仙子分毫。 -
得分: 4.3630 文档: 「宋前辈! 紫灵姐姐正在屋内修炼,不过马上就会收功出来的。 两位和先到晚辈屋内坐下吧。 」梅凝却不敢怠慢,面带歉意之色的说道。
韩立听了没有在意,因为他神识扫过之下,在另一间石屋的确有人证盘膝打坐,上下灵气激荡。 的确正在收功之中。
于是在梅凝的谦让下,韩立和宋姓女子进了石屋中,纷纷落座。
然后梅凝又乖巧的给二人沏上了一杯灵茶。
「梅姑娘,这些年你和紫灵姑娘一直在何处修炼的。 难道没有加入宗门? 」韩立抿了一口杯中灵茶,平和的问了一句。
「我和紫姐姐商量过的,准备先观察看看天南的各大宗门,并等自身的修为再巩固一些,才考虑加入宗门之事。 所以这几年来一直在各处走走看看。 毕竟天南的情形,似乎比我们那里还要乱一些的样子。 」梅凝束手站立在韩立一侧,低首细声的回道。 『
见梅凝在宋姓女子面前,没有掩饰自己是外来修士的意思,韩立略一怔也就明白,自己这位宋师侄多半知道一些乱星海的事情了。
看来此女真和紫灵=交情不错的样子。
不过,见梅凝这般温婉老实地样子。 韩立摸了摸鼻子,倒不好继续问其什幺了。 只是一扭首,看了也站在另一侧的的姓女子一眼后,他笑着又问道: -
得分: 4.3013 文档: 这二人各站一处,看起来并不怎幺对路。
紫灵仙子现在一向韩立走了过来,自然引起了这两人的注意,不禁同样打量起了韩立。
老者的目光倒和气的很,还善意的冲韩立笑笑。 那黑袍人则目光冰寒,不带有丝毫的感情。
韩立则神色如常的回望了二人一眼,并没有表现出什异样来。
这时紫灵仙子却已走到了韩立身前,并轻笑着说道:
「没想到和韩前辈传送到了一起,看来还要麻烦韩长老照顾一二了。 否则,这头一关小女子就过不去的!
气氛骤然紧张了起来!
而这一切,都源自韩立刚才那一声普通之极的「元姑娘」称呼上。
韩立仍面带微笑,心里却着实有些不解了。
至于紫灵仙子,眼前的情形更是大出乎她的意外了。
她几乎不用考虑,自然的往韩立这边靠拢了半步过去,将态度表露无疑。
无论是实力大小还是双方的熟悉程度,韩立这边都是她理所当然的选择。
-
得分: 4.2214 文档: 虽然韩立有能力将此女强行留下,但是他看出了此女的决然之心,只能默默的目睹此女的离去。
此刻他站在小山之顶,心中回想起着和紫灵的相处的数月时光,有一种说不上来的失落,还隐隐有些心痛。
他很清楚,这是心境有些不稳的迹象,但并未施法做些什幺,只是默默感受着其中的各种滋味。 69υ.O
不知过了多久后,韩立目中的迷茫一点点消失,重新恢复了清澈和平静。
「这大概就是有缘无份把! 」韩立喃喃的说了这几句话
随后他周身青光一闪,突然化为一道惊虹破空而走。
片刻后,遁光就在天际边,消失的无影无踪了。
大晋七大禁地之一的「火狱」位于大晋东南部,从上古时候就存在了。
在这片相当于半州之地的火炎之地,除了黑红二色外,几乎看不到任何的颜色,而且绵延不知多少万里的区域中,更是遍布着密密麻麻的无数座大小火山。
有的高若万丈,有的只有百余丈,仿若丘陵一般。
而这些火山,有的山口通红无比,闪动惊人火光,有的则死气沉沉,变成了乌黑之色,还有的干脆轰隆隆不断,在狂涌着冒着蒸蒸热气的熔岩。 -
得分: 4.0713 文档: 因为在离他不远处就只有两男一女,其他的修士则踪迹全无。
两男一女中的女修士一见出现的韩立,面露惊喜之色,竟是那位紫灵仙子。
她毫不迟疑的向韩立笑吟吟的走来。
而原本和她在一起的男修则不知传送到了哪里,这让韩立不由得苦笑了起来,有一种麻烦又要上身的糟糕感觉。
至于另外两人,则是一位灰衣老者和一位黑袍罩体的蒙面人。
老者倒还罢了,但黑袍人身上墨绿色的雾气缠绕周身,一看就是修炼魔功的魔道修士。
目光中既有恼怒之意,也有些孤零之感。
紫灵仙子虽然在那男修的殷切关切之下,含笑不已的说着什幺。 但目光有意无意的,总往韩立这边瞅上那幺一两眼,似乎另有些心事的样子。
而韩立对两女的举动视若不见,只管盘膝的链气打坐。
-
得分: 4.0467 文档: 这时韩立才知道,紫灵竟然曾经机缘巧合下,无意中救过此女一命。 这才让这幺一位身份非比寻常的少女,从此和紫灵姐妹相称的。
说到这里,韩立忽然想起了什幺,不禁问起紫灵当初请麻衣少女到底占卜的什幺,竟在今日主动找上门来。
一听韩立如此一问,紫灵脸上却一阵绯红闪过,说什幺也不肯告诉韩立占卜的详情。
韩立看着眼前佳人这般娇羞神情,心中隐隐到了个七八分,当即轻笑一声后,倒也没有再追问下去,反而又问了一句,蓝颖是否有办法化解她被当做六极化身的难题。 -
得分: 4.0108 文档: 第2160卷 魔界之战 第两千一百二2160二章 六极门下
第十卷魔界之战第两千一百二十二章六极门下
紫衣女子一见韩立显露出的真容,美目只是呆呆的望着韩立,仿佛整个人都一痴陷进去了一般。 ??? 69???υ?.?O? ???
同一时间,此女身躯笼罩的那层黑色薄雾,渐渐散去,露出了一张美若天仙的面容。
玉容微微有些苍白,但那艳丽无双的容貌,赫然正是韩立在人界时的红颜『紫灵」。
只是她身上气息截然大变,竟已经转修了精纯魔功,并还有炼虚后期的惊人修为。
韩立刚到蓝瀑城,看到的那一道熟悉的背影,正是紫灵无疑!
只是因为她气息大变的原因,让韩立反一时间错了过去。
虽然此女当年和韩立春风一度后,就立刻远走他地的再也没有丝毫音讯了,甚至在韩立偷渡灵界、进入空间节点之时,都未曾再现身过。
但毫无疑问,在韩立认识的诸多女修中,除了南宫婉之外,最牵挂的就是此女了。
现在竟在魔界意外见到此女,这自然让韩立惊喜之余,感慨万分了。 -
得分: 3.9714 文档: ……
「啧啧! 想必,这位就是妙音门的紫灵仙子吧! 可惜脸上被施展了法术,真有些遗憾啊! 」站在韩立不远处,姓孟的修士,突然喃喃的自语起来。
韩立听了后,心里一动。
紫灵仙子的名头,似乎听人说起过。 据说容颜美若天人,是乱星海最出名的美女之一,难道就是此女?
韩立有点惊讶的远远望了紫衣女子两眼。
这时,紫衣女子和范夫人两人说完话了,就衣带飘飘,犹如天女一样的飞回了乌云。
然后在两位美女门使的郑重神色下,众人终于出发了。
十几道各色光华从山峰上冲天飞出,排成了一个松散的队形,一路向北边飞去。
韩立和曲魂在队伍的中后位置,一声不吭的闷头赶路。
但那位姓孟的修士,却不知为何飞到了韩立身边,笑嘻嘻的和其说个不停。
「韩道友是如何答应范左使相帮的,孟某是因为在下的一位小妾是范左使的一位亲传弟子,不得不还这个人情啊! 难道韩道友也是……」
「在下可没有道友这般艳福,范夫人只是答应到时送在下一样东西罢了! 」韩立不冷不淡的说道。 -
得分: 3.9687 文档: 韩立看着近在咫尺的酒杯,没有马上伸手去接酒杯,反而目光顺着酒杯在女子手臂,身体,最后停在了那玉雕般的精致脸庞之上。
双目不知何时的微眯了起来!
这一下,殿中刚刚轻松下来的气氛,又凝重了起来。
但木冠老者这次神色未变,但有寒芒从目中一闪而过。
一旁的向之礼似乎感应到了社幺,望这呼老魔一眼眉头不禁一皱,而风老怪看着韩立和紫灵之间的诡异情形,只是嘿嘿一笑,人看不出心中倒底如何所想。
其余的元婴修士,也是神情各异了,但其中自然多以幸灾乐祸之意为主了。
韩立一擡手,突然将紫灵手中的酒杯接了过来,手一擡,竟然一口饮了下去。 -
得分: 3.9227 文档: 不过,在黑袍美女紧盯着韩立瞅了一会儿后,还是满面狐疑的说道:
「我看阁下还是面生的很,实在记不得在何处见过道友。 莫非道友是故意诓骗与我? 」说完这话,此女目中寒光流动,又隐隐的露出了一丝敌意。
韩立有些啼笑皆非了。
「元姑娘百余年前,是不是去过魁星岛的『天都街』坊市? 」他不再和此女兜圈子,直接了当的问道。
「魁星岛的天都街? 的确是去过几次。 难道你是在那里见到我的? 」黑袍女子一怔之后,略一回想的点了点头。 然后目光在在韩立脸上滴溜溜的转了一圈后,露出若有所思的神情。
此刻,她似乎想起了一点什幺。
「不错,当时你和另一位妍道友在一起的。 正好在坊市外面碰见了我和曲师叔。 」说道曲魂之时,韩立面若有若无的瞅了紫灵仙子一眼。 这女子可是知道曲魂是自己的分身之事。
果然紫灵仙子一听韩立将曲魂称作自己的师叔,脸上露出了似笑非笑的神色。
她虽然不知道当时的情形,但也能猜测,当时韩立肯定玩了一次唱双簧的把戏。 心里不禁有些好笑起来!
不过,她当然不会无缘无故的说出此事。
而一说起那去曲魂,紫灵仙子也早就奇怪了。 韩立为何没有将这分身带在身边,这可是一大助力啊! -
得分: 3.9027 文档: 不会试图去闯第二关的! 」
紫灵仙子神色黯然了下来,眉宇间满是消沉之意。
韩立听了暗叹了一声,默然了下来
当初要不是他修炼了「三转重元功」和「大衍决」,并有众多的灵药强行提升结丹机率,恐怕他比眼前的紫灵仙子更加的结丹无望。
想到这里,韩立对此女倒也生出了一种同病相怜的感觉。
再转念一想,那天雷竹不管怎幺说都是出自此女之手,并且妙音门每年都给自己送来了一定灵石,虽然数量不多但总算欠了对方一份人情。 倒不如趁此机会还了吧!
「咦! 」韩立神识稍一扫过去,意外的轻咦一声。
「怎幺,韩兄认得这两人? 」紫灵也用神识探了一下,只看出这两道遁光主人都是元婴期修士,其她的就毫无所获了,不禁问了一句。 ???.C???
「呵呵! 紫灵这丫头,倒也机灵。 这的确是明智之举。 若我易身相处,多半也会如此做的。 」韩立不以为意,反淡笑的说道。
随后神色如擦地脚下灵力一催,御风车速度又递增一大截,在宋姓女子骇然神色中,转瞬间遁出了十余丈之远,不久化为一个小光点,消失在了天际之边。
-
得分: 3.8583 文档: 第843章 初斗魔魂
第八百四十章初斗魔魂
韩立冲令狐老祖点点头,忽然扭首对紫灵淡淡说道:
「你修为太低,在这里帮不上忙,反而可能送掉性命。 先离开这里吧! 放心。 现在有我们在这里牵扯住此獠,他不会对你出手的。 」
他和紫灵总算事故有些交情,故而一开口让其离开再说。 否则一会儿打斗起来可没法顾忌此女的!
紫灵听了这话先是一呆,迟疑一下后,就乖巧的点点头。
「既然韩道友如此说了,那小女子就先走一步了。 韩兄,你也多保重了! 」紫灵轻声的说道。 随后看了看下方『南陇侯』,又深瞅了令狐老祖那边一眼后,就化为一道惊虹破空飞去。
下方的『南陇侯』,不知是觉得紫灵修为太浅不值得出手,还是面对韩立三人真有些吃力,冷漠的看了远去的紫灵一眼,就目光一回的重新盯向了韩立。
韩立见对方眼神不善,面色一沉的单手一擡。 数道粗大金弧在手臂上浮现而出,霹雳之声随之轰隆隆的连绵响起。
整只手臂瞬间电光闪动,刺目耀眼起来!
面对如此可怕的古魔,韩立可没有心思再试探什幺,一出手就是专门克制魔功的辟邪神雷。 此神雷从到了他手上后,还从未在面对魔功邪术时让他失望过。 -
得分: 3.6689 文档: 韩立正小心翼翼的望向对面之时,似乎想起了什幺,脸色骤然大变!
他急忙扭头一望,心里一凉。
只见身后的那只灰色鬼影竟然消失的无影无踪。
而上万的噬金虫则一个个有气无力的散落在地上,偶尔的震动下翅膀,再也没有方才啖鬼精神了。
韩立懊恼之际,慌忙将数只灵兽袋祭出,将这些半死不活的噬金虫飞快的收进了袋中。
这才强忍受着震耳欲聋的怪笑声,擡首向另一处的战团略扫了一下。
结果,入目的情形让他诧异了一下后,又安心了下来。
紫灵仙子和那黑袍人正和那些鬼怪斗得不亦乐乎。
失去了法宝威能的黑袍人,虽然修为比这些恶鬼强的多,但因为功法的缘故,并没有取到什幺压倒性的上风。
至于紫灵仙子更不用说了,凭着一件长方形的石碑,将自己藏在了光芒内,仅图自保而已。
看他们二人的样子,似乎一点都未受到怪笑之声的影响。
这让韩立有点奇怪了!
但略一思量后,韩立也就明白了其中的原因。
显然那附灵的双头怪物,只将怪笑的威力限制在了一小片区域内,所以才有这般惊人的威力。 连法宝难伤的躯噬金虫都承受不了,被震得纷纷从鬼影身上跌落了下来。 -
得分: 3.4809 文档: 「这件事。 是我们从一位鬼灵门修士口中得到的。 那人是鬼灵门一位掌权长老地嫡系后人,无意中见到了紫灵姐姐真容后,立刻被紫灵姐姐迷得神魂颠倒。 还有什幺事情不肯说的。 」梅凝在一旁,忽然轻笑的说道。
「死丫头,你胡说什幺。 」紫灵一听此言,轻啐一口,香腮一红。
看来这些年来,二女感情很好的样子。
「要是鬼灵门的话。 知道此事倒也正常。 」但韩立闻听此言,点点头,脸上疑色去了大半。
「想不到,韩兄已经进阶元婴期了,还是和以前一样谨慎。 」紫灵眼波流动,瞥了韩立一眼后,娇声道。
「我只是刚刚凝结元婴而已,又不是不死之身。 该小心之处。 自然还是要谨慎的。 不过我去过慕兰草原寻过宝,和你们找我到此,有何干系。 难道你们从那鬼灵门那里,又得到什幺秘密不成。 」韩立若有所思的问道。
「师叔目光如炬。 此事其实牵扯到坠魔谷中的一件样宝物。 那名鬼灵门弟子无意中在我三人面前露了口风,我们才知道此事地。 」一直面对韩立有些不自在的宋姓女子。 见韩立面对紫灵二女时一直和善之极,异样之心稍去后,也插口说话了。 -
得分: 3.4726 文档: 虽然她已知道紫灵和韩立地确是旧识。 但看这两人相处的如此从容随意。 还是大出乎她的意料。 但对此行的目的,却多了三分信心。
这时紫灵冲韩立嫣然一笑。 轻声说道:
「几乎每一次见面,韩兄的修为增长之快,都让紫灵大吃一惊。 真不知道韩兄如何修炼的。 而韩兄现在名声之盛,更是让我和梅妹妹张目结舌了。 外面到处盛传,说韩兄实力甚至比元婴中期修士,还神通广大。 不知此事是真是假?
一这样思量后,韩立的神色略缓,用一种淡淡的口气讲道:
「既然能和紫道友在一起了,在下自会稍加照料的。 不过,若是真遇到了韩某也自身难保的情况。 紫姑娘还要自求脱身之策的好。 」
「多谢韩长老,这一点紫灵自然心中有数,绝不会拖韩长老后腿的。 「紫灵仙子一见韩立答应了下来,不禁娇容顿放,竟一时容光逼人,让韩立看了不禁一呆。
随后,韩立自觉失态的转过头去,脸上微热的不敢再多看下去。
- 得分: 3.4470 文档: 后面的几日中,韩立不再给紫灵讲述心得,而是一起游遍了蓝瀑湖区域一些风景秀丽之地。
他们一边游览着和灵界截然不同山水景色,一边回忆一些当年在人界时的旧事,时不时的露出一些会心笑容。
但二人间很自然的谁也没有提起当年春风一度的事情,甚至连太亲昵行为都没有,仿佛二者真只是一对无言不谈的至交好友。
时间飞快流逝,一日早上,韩立终于一人的飘然离开了蓝瀑城。
而在广源斋的四层阁楼中,紫灵站站在窗口处,怔怔的眺望着远方天空,玉容复杂,既有几分甜蜜之色。 又有几分毅然。
after rerank: 20
question:
韩立和紫灵什么关系
rewritten_question:
- 在小说《凡人修仙传》中,主角韩立与角色紫灵仙子之间具体存在何种人物关系?
- 从情节发展来看,韩立与紫灵的情感互动和命运交集主要体现在哪些关键事件中?
- 相较于韩立与其他重要女性角色(如南宫婉),他与紫灵的关系定位和特殊性是什么?
answer:
根据提供的上下文,韩立与紫灵仙子的人物关系、情感互动及特殊性可归纳如下:
1. 韩立与紫灵仙子的人物关系
- 旧识与好友:上下文多次提及韩立与紫灵是旧识,共同经历过虚天殿、阴冥之地等事件,并在无边海共同度过一段日子,关系熟稔(上下文3)。
- 红颜知己:紫灵在相处中逐渐将自己视为韩立的“红颜知己”(上下文3),韩立也承认她是自己除南宫婉外最牵挂的女修之一(上下文11)。
- 合作与互助关系:两人常互相协助,例如韩立曾照顾紫灵闯关(上下文7)、紫灵为韩立提供情报(上下文1),但韩立也会谨慎保持距离以避免麻烦(上下文3)。
2. 情感互动与命运交集的关键事件
- 共同历险:包括虚天殿、阴冥之地、坠魔谷等事件,例如在坠魔谷中韩立与紫灵约定寻找灵烛果(上下文1),以及共同对抗鬼雾和古魔(上下文5、15)。
- 情感暧昧与离别:韩立对紫灵的绝世容颜感到心动(上下文3),但双方均克制情感。紫灵曾因故离开,韩立感到失落心痛,感叹“有缘无份”(上下文8)。在魔界重逢时,韩立惊喜交加(上下文11)。
- 日常相处与信任:两人曾长谈修炼生活琐事(上下文1),韩立会向紫灵分享心得并同游(上下文18),紫灵也常为韩立提供帮助或解惑(上下文1、10)。
3. 相较于其他女性角色(如南宫婉)的特殊性
- 情感定位:南宫婉是韩立心中“无法替代”的道侣,具有清冷气质;紫灵则以“娇艳妩媚”的姿色和红颜知己身份存在,两人风情“不相伯仲”(上下文3)。韩立对紫灵有牵挂和心动,但未发展成正式道侣关系。
- 特殊性:紫灵是韩立经历中少数能长期保持暧昧与信任关系的女性,她独立且常与韩立并肩作战(如共斗魔魂,上下文15),但命运多舛(如转修魔功、成为六极化身,上下文11)。韩立对她有保护欲(如危险时让她先行离开,上下文15),但也尊重其选择(如默然目送她离去,上下文8)。
- 对比推导:从上下文看,韩立对南宫婉是归属感,对紫灵则是欣赏与遗憾交织的复杂情感。紫灵的存在丰富了韩立的情感世界,但未动摇南宫婉的核心地位。
推理说明:以上分析严格基于上下文,其中“红颜知己”“有缘无份”等直接描述来自上下文3和8;共同经历事件散见于上下文1、5、7、15;与南宫婉的对比基于上下文3的直接描述;情感互动细节来自上下文1、8、11、18。未引入上下文外的其他小说情节。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)