view_chunks.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. """
  2. 查看RAG知识库内容工具
  3. 功能:查看分块结果、向量数据库内容、检索测试
  4. """
  5. import os
  6. from dotenv import load_dotenv
  7. from langchain_community.embeddings import DashScopeEmbeddings
  8. from langchain_community.vectorstores import Chroma
  9. # 加载环境变量
  10. load_dotenv()
  11. def view_vectorstore(persist_directory: str = "./car_info_knowledge_db"):
  12. """
  13. 查看向量数据库内容
  14. Args:
  15. persist_directory: 向量数据库路径
  16. """
  17. print("=" * 80)
  18. print(f"查看向量数据库: {persist_directory}")
  19. print("=" * 80)
  20. if not os.path.exists(persist_directory):
  21. print(f"❌ 数据库不存在: {persist_directory}")
  22. return
  23. # 初始化Embedding模型
  24. embedding_model = DashScopeEmbeddings(
  25. model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
  26. dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
  27. )
  28. # 加载向量数据库
  29. vectorstore = Chroma(
  30. persist_directory=persist_directory,
  31. embedding_function=embedding_model
  32. )
  33. # 获取所有文档
  34. try:
  35. # 使用get方法获取所有数据
  36. result = vectorstore.get()
  37. documents = result.get('documents', [])
  38. metadatas = result.get('metadatas', [])
  39. ids = result.get('ids', [])
  40. print(f"\n📊 数据库统计信息:")
  41. print(f" 总文档数: {len(documents)}")
  42. if len(documents) == 0:
  43. print("\n❌ 数据库为空")
  44. return
  45. # 统计信息
  46. total_chars = sum(len(doc) for doc in documents)
  47. avg_chars = total_chars / len(documents) if len(documents) > 0 else 0
  48. print(f" 总字符数: {total_chars}")
  49. print(f" 平均每块字符数: {avg_chars:.1f}")
  50. print(f" 最大块: {max(len(doc) for doc in documents)} 字符")
  51. print(f" 最小块: {min(len(doc) for doc in documents)} 字符")
  52. # 显示前N个块
  53. print(f"\n📄 前10个块的内容预览:")
  54. print("-" * 80)
  55. for i in range(min(10, len(documents))):
  56. doc = documents[i]
  57. metadata = metadatas[i] if i < len(metadatas) else {}
  58. print(f"\n块 #{i+1} (ID: {ids[i] if i < len(ids) else 'N/A'})")
  59. print(f"页码: {metadata.get('page', 'N/A')}")
  60. print(f"字符数: {len(doc)}")
  61. print(f"内容预览:")
  62. print(f" {doc[:200]}...")
  63. print("-" * 80)
  64. except Exception as e:
  65. print(f"❌ 读取数据库出错: {e}")
  66. import traceback
  67. traceback.print_exc()
  68. def test_search(persist_directory: str = "./car_info_knowledge_db", query: str = None):
  69. """
  70. 测试检索功能
  71. Args:
  72. persist_directory: 向量数据库路径
  73. query: 查询文本
  74. """
  75. print("\n" + "=" * 80)
  76. print("测试检索功能")
  77. print("=" * 80)
  78. if not os.path.exists(persist_directory):
  79. print(f"❌ 数据库不存在: {persist_directory}")
  80. return
  81. # 初始化Embedding模型
  82. embedding_model = DashScopeEmbeddings(
  83. model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
  84. dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
  85. )
  86. # 加载向量数据库
  87. vectorstore = Chroma(
  88. persist_directory=persist_directory,
  89. embedding_function=embedding_model
  90. )
  91. # 默认查询
  92. if not query:
  93. query = "HDC系统在什么速度下会激活?"
  94. print(f"\n🔍 查询: {query}")
  95. print("-" * 80)
  96. try:
  97. # 执行相似度搜索
  98. results = vectorstore.similarity_search_with_score(query, k=3)
  99. print(f"\n找到 {len(results)} 个相关结果:\n")
  100. for i, (doc, score) in enumerate(results):
  101. print(f"结果 #{i+1}")
  102. print(f"相似度分数: {score:.4f} (越小越相似)")
  103. print(f"页码: {doc.metadata.get('page', 'N/A')}")
  104. print(f"字符数: {len(doc.page_content)}")
  105. print(f"内容:")
  106. print(f" {doc.page_content[:300]}...")
  107. print("-" * 80)
  108. except Exception as e:
  109. print(f"❌ 检索出错: {e}")
  110. import traceback
  111. traceback.print_exc()
  112. def interactive_query(persist_directory: str = "./car_info_knowledge_db"):
  113. """
  114. 交互式查询模式
  115. """
  116. print("\n" + "=" * 80)
  117. print("交互式查询模式")
  118. print("=" * 80)
  119. print("输入问题进行检索,输入 'quit' 或 'exit' 退出\n")
  120. if not os.path.exists(persist_directory):
  121. print(f"❌ 数据库不存在: {persist_directory}")
  122. return
  123. # 初始化Embedding模型
  124. embedding_model = DashScopeEmbeddings(
  125. model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
  126. dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
  127. )
  128. # 加载向量数据库
  129. vectorstore = Chroma(
  130. persist_directory=persist_directory,
  131. embedding_function=embedding_model
  132. )
  133. while True:
  134. try:
  135. query = input("你的问题: ").strip()
  136. if query.lower() in ['quit', 'exit', 'q']:
  137. print("\n再见!")
  138. break
  139. if not query:
  140. continue
  141. # 执行检索
  142. results = vectorstore.similarity_search_with_score(query, k=3)
  143. print(f"\n找到 {len(results)} 个相关结果:\n")
  144. for i, (doc, score) in enumerate(results):
  145. print(f"结果 #{i+1} (相似度: {score:.4f})")
  146. print(f"内容: {doc.page_content[:200]}...")
  147. print("-" * 60)
  148. except KeyboardInterrupt:
  149. print("\n\n再见!")
  150. break
  151. except Exception as e:
  152. print(f"错误: {e}")
  153. def main():
  154. """主函数"""
  155. print("\n" + "=" * 80)
  156. print("RAG知识库内容查看工具")
  157. print("=" * 80)
  158. # 检查API Key
  159. if not os.getenv("DASHSCOPE_API_KEY"):
  160. print("❌ 请先配置 DASHSCOPE_API_KEY")
  161. return
  162. # 查看数据库
  163. db_path = "./car_info_knowledge_db"
  164. while True:
  165. print("\n请选择功能:")
  166. print("1. 查看向量数据库内容")
  167. print("2. 测试检索功能")
  168. print("3. 交互式查询")
  169. print("4. 更换数据库路径")
  170. print("0. 退出")
  171. choice = input("\n请输入选项 (0-4): ").strip()
  172. if choice == "1":
  173. view_vectorstore(db_path)
  174. elif choice == "2":
  175. query = input("输入查询内容 (直接回车使用默认查询): ").strip()
  176. test_search(db_path, query if query else None)
  177. elif choice == "3":
  178. interactive_query(db_path)
  179. elif choice == "4":
  180. new_path = input(f"输入数据库路径 (当前: {db_path}): ").strip()
  181. if new_path:
  182. db_path = new_path
  183. elif choice == "0":
  184. print("\n再见!")
  185. break
  186. else:
  187. print("无效选项")
  188. if __name__ == "__main__":
  189. main()