这个演示程序展示了如何使用LocalByzerStorageCache来创建、管理和查询代码库的缓存。Byzer Storage是一个高性能的向量数据库,非常适合用于语义搜索。
LocalByzerStorageCache是一个用于存储和检索代码文件的缓存管理器,它具有以下功能:
- 自动扫描目录中的代码文件
- 使用Byzer Storage存储代码文件的内容和向量嵌入
- 支持基于语义向量搜索和文本搜索查询相关代码
- 支持多查询合并策略
- 自动检测和更新已修改的文件
在运行此演示前,您需要安装以下依赖项:
pip install autocoder loguru byzerllm tokenizers另外,您需要启动Byzer Storage服务。默认情况下,服务运行在127.0.0.1:33333。
这个演示程序执行以下操作:
- 创建示例代码文件(计算器类、字符串处理类和数据处理类)
- 初始化Byzer Storage缓存管理器
- 构建代码库索引
- 执行单个语义查询并展示结果
- 执行多查询合并测试
- 更新一个代码文件并测试缓存自动更新功能
- 查询新添加的代码功能
- 演示混合搜索功能(同时使用向量搜索和文本搜索)
python demo_byzer_storage_cache.py演示程序运行时会输出详细的日志,包括:
- 缓存初始化过程
- 索引构建进度
- 查询结果
- 文件更新检测
- 缓存更新过程
相比于LocalDuckDBStorageCache,Byzer Storage缓存有以下特点:
- 需要单独运行的存储服务
- 支持更复杂的查询合并策略
- 同时支持向量搜索和文本搜索
- 更适合大规模代码库的索引和查询
如果您想在自己的项目中使用LocalByzerStorageCache,可以参考以下步骤:
-
初始化LLM(用于生成向量嵌入)
from autocoder.utils.llms import get_single_llm llm = get_single_llm("v3_chat", product_mode="lite") emb_llm = get_single_llm("emb2", product_mode="lite") # 用于生成向量嵌入
-
配置参数
from autocoder.common import AutoCoderArgs args = AutoCoderArgs( source_dir="your_code_dir", rag_build_name="your_index_name", # Byzer Storage需要的索引名称 hybrid_index_max_output_tokens=10000 # 最大输出token数 )
-
初始化缓存管理器
from autocoder.rag.cache.local_byzer_storage_cache import LocalByzerStorageCache cache_manager = LocalByzerStorageCache( path="your_code_dir", # 代码目录 ignore_spec=None, # 忽略规则,类似.gitignore required_exts=[".py", ".js"], # 要索引的文件扩展名 extra_params=args, emb_llm=emb_llm, host="127.0.0.1", # Byzer Storage服务地址 port=33333 # Byzer Storage服务端口 )
-
构建缓存
cache_manager.build_cache()
-
执行单个查询
results = cache_manager.get_cache({ "queries": ["如何计算平均值"], "enable_vector_search": True, "enable_text_search": True # 同时启用文本搜索 })
-
执行多查询合并
results = cache_manager.get_cache({ "queries": ["计算平均值", "字符串处理"], "merge_strategy": "WEIGHTED_RANK", # 使用加权排名策略合并结果 "max_results": 5 # 限制返回结果数量 })
-
处理查询结果
for file_path, file_info in results.items(): print(f"文件: {file_path}") for doc in file_info['content']: print(f"代码: {doc['source_code']}")
LocalByzerStorageCache支持多种结果合并策略:
WEIGHTED_RANK: 根据每个文档在各查询中的排名进行加权合并MAX_SCORE: 使用每个文档在所有查询中的最高分数FIRST_QUERY_PRIORITY: 优先考虑第一个查询的结果UNION: 简单合并所有查询结果
- 确保Byzer Storage服务已经启动并可访问
- 第一次构建缓存可能需要较长时间,特别是对于大型代码库
- 向量搜索需要较多的内存资源
- 多查询功能可以帮助处理复杂的代码查询需求