| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- """
- 查看RAG知识库内容工具
- 功能:查看分块结果、向量数据库内容、检索测试
- """
- import os
- from dotenv import load_dotenv
- from langchain_community.embeddings import DashScopeEmbeddings
- from langchain_community.vectorstores import Chroma
- # 加载环境变量
- load_dotenv()
- def view_vectorstore(persist_directory: str = "./car_info_knowledge_db"):
- """
- 查看向量数据库内容
-
- Args:
- persist_directory: 向量数据库路径
- """
- print("=" * 80)
- print(f"查看向量数据库: {persist_directory}")
- print("=" * 80)
-
- if not os.path.exists(persist_directory):
- print(f"❌ 数据库不存在: {persist_directory}")
- return
-
- # 初始化Embedding模型
- embedding_model = DashScopeEmbeddings(
- model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
- dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
- )
-
- # 加载向量数据库
- vectorstore = Chroma(
- persist_directory=persist_directory,
- embedding_function=embedding_model
- )
-
- # 获取所有文档
- try:
- # 使用get方法获取所有数据
- result = vectorstore.get()
-
- documents = result.get('documents', [])
- metadatas = result.get('metadatas', [])
- ids = result.get('ids', [])
-
- print(f"\n📊 数据库统计信息:")
- print(f" 总文档数: {len(documents)}")
-
- if len(documents) == 0:
- print("\n❌ 数据库为空")
- return
-
- # 统计信息
- total_chars = sum(len(doc) for doc in documents)
- avg_chars = total_chars / len(documents) if len(documents) > 0 else 0
-
- print(f" 总字符数: {total_chars}")
- print(f" 平均每块字符数: {avg_chars:.1f}")
- print(f" 最大块: {max(len(doc) for doc in documents)} 字符")
- print(f" 最小块: {min(len(doc) for doc in documents)} 字符")
-
- # 显示前N个块
- print(f"\n📄 前10个块的内容预览:")
- print("-" * 80)
-
- for i in range(min(10, len(documents))):
- doc = documents[i]
- metadata = metadatas[i] if i < len(metadatas) else {}
-
- print(f"\n块 #{i+1} (ID: {ids[i] if i < len(ids) else 'N/A'})")
- print(f"页码: {metadata.get('page', 'N/A')}")
- print(f"字符数: {len(doc)}")
- print(f"内容预览:")
- print(f" {doc[:200]}...")
- print("-" * 80)
-
- except Exception as e:
- print(f"❌ 读取数据库出错: {e}")
- import traceback
- traceback.print_exc()
- def test_search(persist_directory: str = "./car_info_knowledge_db", query: str = None):
- """
- 测试检索功能
-
- Args:
- persist_directory: 向量数据库路径
- query: 查询文本
- """
- print("\n" + "=" * 80)
- print("测试检索功能")
- print("=" * 80)
-
- if not os.path.exists(persist_directory):
- print(f"❌ 数据库不存在: {persist_directory}")
- return
-
- # 初始化Embedding模型
- embedding_model = DashScopeEmbeddings(
- model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
- dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
- )
-
- # 加载向量数据库
- vectorstore = Chroma(
- persist_directory=persist_directory,
- embedding_function=embedding_model
- )
-
- # 默认查询
- if not query:
- query = "HDC系统在什么速度下会激活?"
-
- print(f"\n🔍 查询: {query}")
- print("-" * 80)
-
- try:
- # 执行相似度搜索
- results = vectorstore.similarity_search_with_score(query, k=3)
-
- print(f"\n找到 {len(results)} 个相关结果:\n")
-
- for i, (doc, score) in enumerate(results):
- print(f"结果 #{i+1}")
- print(f"相似度分数: {score:.4f} (越小越相似)")
- print(f"页码: {doc.metadata.get('page', 'N/A')}")
- print(f"字符数: {len(doc.page_content)}")
- print(f"内容:")
- print(f" {doc.page_content[:300]}...")
- print("-" * 80)
-
- except Exception as e:
- print(f"❌ 检索出错: {e}")
- import traceback
- traceback.print_exc()
- def interactive_query(persist_directory: str = "./car_info_knowledge_db"):
- """
- 交互式查询模式
- """
- print("\n" + "=" * 80)
- print("交互式查询模式")
- print("=" * 80)
- print("输入问题进行检索,输入 'quit' 或 'exit' 退出\n")
-
- if not os.path.exists(persist_directory):
- print(f"❌ 数据库不存在: {persist_directory}")
- return
-
- # 初始化Embedding模型
- embedding_model = DashScopeEmbeddings(
- model=os.getenv("EMBEDDING_MODEL", "text-embedding-v3"),
- dashscope_api_key=os.getenv("DASHSCOPE_API_KEY", "")
- )
-
- # 加载向量数据库
- vectorstore = Chroma(
- persist_directory=persist_directory,
- embedding_function=embedding_model
- )
-
- while True:
- try:
- query = input("你的问题: ").strip()
-
- if query.lower() in ['quit', 'exit', 'q']:
- print("\n再见!")
- break
-
- if not query:
- continue
-
- # 执行检索
- results = vectorstore.similarity_search_with_score(query, k=3)
-
- print(f"\n找到 {len(results)} 个相关结果:\n")
-
- for i, (doc, score) in enumerate(results):
- print(f"结果 #{i+1} (相似度: {score:.4f})")
- print(f"内容: {doc.page_content[:200]}...")
- print("-" * 60)
-
- except KeyboardInterrupt:
- print("\n\n再见!")
- break
- except Exception as e:
- print(f"错误: {e}")
- def main():
- """主函数"""
- print("\n" + "=" * 80)
- print("RAG知识库内容查看工具")
- print("=" * 80)
-
- # 检查API Key
- if not os.getenv("DASHSCOPE_API_KEY"):
- print("❌ 请先配置 DASHSCOPE_API_KEY")
- return
-
- # 查看数据库
- db_path = "./car_info_knowledge_db"
-
- while True:
- print("\n请选择功能:")
- print("1. 查看向量数据库内容")
- print("2. 测试检索功能")
- print("3. 交互式查询")
- print("4. 更换数据库路径")
- print("0. 退出")
-
- choice = input("\n请输入选项 (0-4): ").strip()
-
- if choice == "1":
- view_vectorstore(db_path)
- elif choice == "2":
- query = input("输入查询内容 (直接回车使用默认查询): ").strip()
- test_search(db_path, query if query else None)
- elif choice == "3":
- interactive_query(db_path)
- elif choice == "4":
- new_path = input(f"输入数据库路径 (当前: {db_path}): ").strip()
- if new_path:
- db_path = new_path
- elif choice == "0":
- print("\n再见!")
- break
- else:
- print("无效选项")
- if __name__ == "__main__":
- main()
|