步骤 2:语义搜索¶
构建可搜索的知识库。
目标¶
在提取的知识上启用语义搜索,以找到相关概念和章节。
为什么使用语义搜索?¶
与关键词搜索不同,语义搜索: - 理解上下文和含义 - 即使使用不同词汇也能找到相关内容 - 处理同义词和相关概念
使用 CLI¶
基本搜索¶
自然语言查询¶
获取更多结果¶
使用 Python¶
脚本¶
"""步骤 2:知识库语义搜索。"""
from dotenv import load_dotenv
load_dotenv()
from hyperextract import Template
KB_DIR = "./paper_kb/"
def main():
# 加载知识库
print("加载知识库...")
ka = Template.create("general/concept_graph", language="zh")
ka.load(KB_DIR)
# 确保索引已构建
print("构建搜索索引...")
ka.build_index()
# 交互式搜索循环
print("\n" + "="*50)
print("语义搜索界面")
print("="*50)
print("输入查询(或 'quit' 退出)\n")
while True:
query = input("搜索: ").strip()
if query.lower() in ['quit', 'exit', 'q']:
break
if not query:
continue
# 搜索
results = ka.search(query, top_k=5)
# 显示结果
print(f"\n找到 {len(results)} 个结果:\n")
for i, item in enumerate(results, 1):
if hasattr(item, 'name'): # 实体
print(f"{i}. [{item.type}] {item.name}")
if hasattr(item, 'description'):
print(f" {item.description[:100]}...")
elif hasattr(item, 'source'): # 关系
print(f"{i}. {item.source} --{item.type}--> {item.target}")
print()
print("-" * 50)
print("\n✓ 步骤 2 完成!")
print("下一步: 运行 'python step3_chat.py'")
if __name__ == "__main__":
main()
运行¶
示例会话:
搜索: transformer architecture
找到 3 个结果:
1. [model] Transformer
基于注意力机制的神经网络架构...
2. [concept] Self-Attention
允许模型权衡输入 token 的机制...
3. [concept] Multi-Head Attention
并行运行的多个注意力头...
--------------------------------------------------
搜索: quit
搜索技巧¶
有效查询¶
| 查询类型 | 示例 | 使用时机 |
|---|---|---|
| 概念 | "注意力机制" | 查找特定概念 |
| 问题 | "主要贡献是什么?" | 广泛探索 |
| 比较 | "Transformer 与 RNN 的比较" | 查找比较 |
| 结果 | "BLEU 分数结果" | 查找特定数据 |
改进结果¶
- 具体化: "Transformer 编码器" vs "Transformer"
- 使用自然语言: "注意力机制如何工作?"
- 尝试同义词: "注意力" → "自注意力" → "查询-键-值"
- 增加 top_k:
top_k=10以获得更广泛的结果
将搜索集成到您的应用¶
class ResearchSearch:
def __init__(self, ka_path):
self.ka = Template.create("general/concept_graph", "zh")
self.ka.load(ka_path)
self.ka.build_index()
def find_concepts(self, query, n=5):
"""查找与查询相关的概念。"""
results = self.ka.search(query, top_k=n)
return [r for r in results if hasattr(r, 'name')]
def find_relationships(self, concept):
"""查找概念的关系。"""
return [
r for r in self.ka.data.relations
if r.source == concept or r.target == concept
]
# 使用
search = ResearchSearch("./paper_kb/")
concepts = search.find_concepts("注意力", n=10)