ESP32固件双分区OTA自动回滚实战:从刷废到稳定升级
2026/10/30 7:42:20
本文基于仓库https://github.com/freemandealer/apache-doris-rag,梳理 Apache Doris 在 RAG 流程中的核心实现与关键代码。覆盖向量入库、查询增强、检索、生成、服务端与 CLI,以及知识图谱实验模块。
conf.ini): Doris 连接、Embedding/LLM 选择、文档路径、界面语言。index_md_to_doris.py): 扫描 markdown → 清洗切分 → 生成向量 →doris_vector_search入库并建 HNSW 索引。rag_lib.py): 基于查询向量检索 Doris,拼上下文后调用 LLM 生成回答,可选查询增强。rag_service.py): FastAPI 提供/api/chat与简易 Web UI,返回答案与引用源。rag_cli.py): 终端交互版。build_knowledge_graph.py): 以向量搜索实体 + SQL 取关系的混合方式在 Doris 中管理图数据。conf.ini.template)host/query_port/http_port/user/password/db_name/table_name,还包含图模式表名。type=ollama|openai,模型名、base_url或api_key。type=openai协议兼容,模型/api_key/base_url/temperature。doc_root。language=zh|en。核心流程在index_md_to_doris.py:
# 1) 收集与清洗文档files=collect_markdown_files(DOC_ROOT)cleaned=clean_text(raw)# 去掉 frontmatter 并修剪行尾chunks=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=100).split_text(cleaned)# 2) 构造记录{"id":cur_id,"path":rel_path,"title":title,"content":chunk,}# 3) 生成向量vectors=embeddings.embed_documents(texts)# 4) 写入 Doris 并建索引index_options=IndexOptions(index_type="hnsw",metric_type="inner_product")table=client.create_table(table_name,df,index_options=index_options)要点:
doris_vector_search.DorisVectorClient;若表存在则open_table().insert(df)。id/path/title/content/embedding,索引类型 HNSW,metric 为inner_product。rag_lib.py:
defretrieve_context(query:str,top_k:int=5)->pd.DataFrame:query_vec=get_embedding_model().embed_query(query)table=DorisVectorClient(db,auth).open_table(table_name)returntable.search(query_vec).limit(top_k).select(["id","path","title","content"]).to_pandas()defquery_augment(query,history=None):# 使用 LLM 做历史消歧/关键词补全,提示词在 i18n 文本中prompt=get_message(...)returnget_llm().invoke(prompt).content.strip()rag_service.py)@app.post("/api/chat")asyncdefchat(req:ChatRequest):augmented_query=query_augment(req.query,req.history)context_df=retrieve_context(augmented_query,top_k=5)context_text="\n\n---\n\n".join([...])prompt=template.format(history=...,context=context_text,question=req.query)answer=get_llm().invoke(prompt).contentreturnChatResponse(answer=answer,sources=sources)/api/chat,展示答案与来源path/title。rag_cli.py)query_augment→retrieve_context→llm.invoke(prompt)。build_knowledge_graph.py)llm_adapters.get_async_chat_llm) 抽取实体/关系为三元组,解析后构图。graph_chunks(DUPLICATE KEY,含向量索引INDEX idx_embedding (embedding) USING ANN ... dim=1024)doc_status(UNIQUE KEY,用于文档增量状态)table.add()。search_entities用向量检索实体;get_relations通过 SQL 查询相关边;组合重建子图。i18n.py)language决定使用中/英提示词,包括查询增强、对话模板、前端文案。conf.ini且 Doris 就绪)# 1) 安装依赖(示例)pipinstall"doris-vector-search>=0.0.5"langchain langchain-community langchain-text-splitters langchain-openai fastapi uvicorn pydantic pandas# 2) 构建向量索引python index_md_to_doris.py# 3) 启动服务uvicorn rag_service:app --host0.0.0.0 --port8000访问http://localhost:8000体验 Web 端,或运行python rag_cli.py在终端测试。
IndexOptions、dim及 metric;必要时尝试混合检索(向量 + keyword 过滤)。