Files
rag_agent/RAG-TEST-TOOLS/__pycache__/feature_retriever.cpython-313.pyc

209 lines
32 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><><EFBFBD>i<EFBFBD>o<00><00><><00>SSKrSSKrSSKrSSKJrJrJr SSKrSSKrSSK r
SSK J r J r JrJrJr SSKJrJr \R("\5r"SS5r"SS5rg) <09>N)<03>Dict<63>List<73>Optional)<05>TOP_K<5F> METADATA_PATH<54>VECTOR_DB_PATH<54>KNOWLEDGE_GRAPH_PATH<54>MIN_SIMILARITY_THRESHOLD)<02> call_qwen_max<61>get_qwen_embeddingc<00><><00>\rSrSrSrS\4SjrS\\\\44Sjr S\\\\44Sjr
S\\\44Sjr S \S\ \4S
jr S \S\4S jrSS\S\S\4SjjrSrg )<13>KnowledgeGraphAnalyzer<65>u$知识图谱分析器简化版<E78988>
graph_datac<00><00>URS/5Vs0sHo"SU_M
snUlURS/5UlUR5UlUR 5UlUR5Ulgs snf)u初始化图谱分析器<E69E90>nodes<65>id<69>edgesN) <09>getrr<00>_build_calls_graph<70> calls_graph<70>_build_reverse_calls_graph<70>reverse_calls_graph<70>_build_name_mapping<6E>
name_to_id)<03>selfr<00>nodes <20>.\feature_retriever.py<70>__init__<5F>KnowledgeGraphAnalyzer.__init__sz<00><00>3=<3D>><3E>><3E>'<27>2<EFBFBD>3N<33>O<>3N<33>4<EFBFBD>4<EFBFBD>j<EFBFBD>$<24>&<26>3N<33>O<><04>
<EFBFBD><1F>^<5E>^<5E>G<EFBFBD>R<EFBFBD>0<><04>
<EFBFBD> <20>2<>2<>4<><04><18>#'<27>#B<>#B<>#D<><04> <20><1F>2<>2<>4<><04><0F><>Ps<00>B<04>returnc<00><><00>0nURH4nUSS:XdMUSnUSnX1;a/X'XRU5 M6 U$)u构建函数调用图<E794A8>type<70>CALLS<4C> source_id<69> target_id<69>r<00>append)rr<00>edger%r&s rr<00>)KnowledgeGraphAnalyzer._build_calls_graphs\<00><00><18> <0B><18>J<EFBFBD>J<EFBFBD>D<EFBFBD><13>F<EFBFBD>|<7C>w<EFBFBD>&<26> <20><1B>-<2D> <09> <20><1B>-<2D> <09><1C>/<2F>-/<2F>K<EFBFBD>*<2A><1B>&<26>-<2D>-<2D>i<EFBFBD>8<> <1F><1B><1A>c<00><><00>0nURH4nUSS:XdMUSnUSnXA;a/X'XRU5 M6 U$)u构建反向调用图r#r$r%r&r')r<00> reverse_graphr)r%r&s rr<00>1KnowledgeGraphAnalyzer._build_reverse_calls_graph*s\<00><00><1A> <0A><18>J<EFBFBD>J<EFBFBD>D<EFBFBD><13>F<EFBFBD>|<7C>w<EFBFBD>&<26> <20><1B>-<2D> <09> <20><1B>-<2D> <09><1C>1<>/1<>M<EFBFBD>,<2C><1D>(<28>/<2F>/<2F> <09>:<3A> <1F><1D>r+c<00>t<00>0nURR5Hup#USS:XdMX!US'M U$)u#构建函数名到节点ID的映射r#<00>Function<6F>name)r<00>items)rr<00>node_idrs rr<00>*KnowledgeGraphAnalyzer._build_name_mapping6s@<00><00><17>
<EFBFBD>!<21>Z<EFBFBD>Z<EFBFBD>-<2D>-<2D>/<2F>M<EFBFBD>G<EFBFBD><13>F<EFBFBD>|<7C>z<EFBFBD>)<29>+2<>4<EFBFBD><06><<3C>(<28>0<><1A>r+<00> function_namec<00>~<00>URRU5nU(aURRU5$g)u根据函数名查找节点N)rrr)rr5r3s r<00>find_function_by_name<6D>,KnowledgeGraphAnalyzer.find_function_by_name>s/<00><00><16>/<2F>/<2F>%<25>%<25>m<EFBFBD>4<><07> <12><17>:<3A>:<3A>><3E>><3E>'<27>*<2A> *<2A>r+<00> function_idc<00><><00>XR;aSSU30$URU//SS.nXR;aHURUH5nX0R;dMUSRURU5 M7 XR;aHURUH5nX@R;dMUSRURU5 M7 UR U5US'U$)u6分析函数的上下文调用者和被调用者<E88085>erroru未找到函数节点: r)<04> function_info<66>callers<72>callees<65>
call_depthr=r>r?)rrr(r<00>_calculate_max_depth)rr9<00>result<6C> caller_id<69> callee_ids r<00>analyze_function_context<78>/KnowledgeGraphAnalyzer.analyze_function_contextEs<><00><00> <16>j<EFBFBD>j<EFBFBD> (<28><1B>6<>{<7B>m<EFBFBD>D<>E<> E<>"<22>Z<EFBFBD>Z<EFBFBD> <0B>4<><19><19><1B> 
<EFBFBD><06> <17>2<>2<> 2<>!<21>5<>5<>k<EFBFBD>B<> <09><1C>
<EFBFBD>
<EFBFBD>*<2A><1A>9<EFBFBD>%<25>,<2C>,<2C>T<EFBFBD>Z<EFBFBD>Z<EFBFBD> <09>-B<>C<>C<01>
<17>*<2A>*<2A> *<2A>!<21>-<2D>-<2D>k<EFBFBD>:<3A> <09><1C>
<EFBFBD>
<EFBFBD>*<2A><1A>9<EFBFBD>%<25>,<2C>,<2C>T<EFBFBD>Z<EFBFBD>Z<EFBFBD> <09>-B<>C<>;<3B>
$<24>8<>8<><1B>E<><06>|<7C><1C><15> r+N<>func_id<69>visitedc<00><00>Uc
[5nX;dXR;agURU5 SnURRU/5H0nSUR XBR 55-n[ X55nM2 U$)u!计算函数的最大调用深度r<00>)<07>setr<00>addrr@<00>copy<70>max)rrFrG<00> max_depthrC<00>depths rr@<00>+KnowledgeGraphAnalyzer._calculate_max_depthbs}<00><00> <12>?<3F><19>e<EFBFBD>G<EFBFBD> <12> <1D><17>0@<40>0@<40>!@<40><14><0F> <0B> <0B>G<EFBFBD><1C><15> <09><1D>)<29>)<29>-<2D>-<2D>g<EFBFBD>r<EFBFBD>:<3A>I<EFBFBD><15><04>1<>1<>)<29>\<5C>\<5C>^<5E>L<>L<>E<EFBFBD><1B>I<EFBFBD>-<2D>I<EFBFBD>;<3B><19>r+)rrrrr<00>N)<13>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>__doc__rr<00>strrrrrrr7rDrJ<00>intr@<00>__static_attributes__<5F>r+rrrs<><00><00>.<2E>
5<>4<EFBFBD>
5<>
<1B>D<EFBFBD><13>d<EFBFBD>3<EFBFBD>i<EFBFBD><1E>$8<>
<1B>
<1D>D<EFBFBD><13>d<EFBFBD>3<EFBFBD>i<EFBFBD><1E>,@<40>
<1D><1A>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E><1A><14>3<EFBFBD><14>8<EFBFBD>D<EFBFBD>><3E><14><16>C<EFBFBD><16>D<EFBFBD><16>:<19>C<EFBFBD><19>#<23><19><13><19>r+rc<00>><00>\rSrSrSrSS\\4SjjrS\4Sjr S\S\4S jr
S\S\ \4S
jr S \S\4S jr S \S \S\4SjrS\S\\4SjrS\4SjrS\S\ \S\4SjrSS\\4SjjrS\4Sjr\4S \S\S\ \4SjjrS\S\4SjrS\S\4SjrSrg)<1F>FeatureRetriever<65>ru*功能需求检索器主类简化版N<EFBC89>configc<00>.<00>UR5Ulg)<02>初始化检索器N)<02>_get_judgment_prompt_template<74>llm_judgment_prompt_template<74>rr^s rr<00>FeatureRetriever.__init__us<00><00>,0<>,N<>,N<>,P<><04>)r+r!c<00><00>g)u'返回用于LLM推理的提示词模板u
你是一个资深的软件架构师和代码评审专家。你需要根据用户提出的功能需求,结合给定的代码知识库分析结果,判断该需求在项目中是否已被实现。
# 任务
请严格遵循以下步骤和约束条件进行分析,并给出最终裁决。
# 输入信息
1. **用户需求** “{user_query}”
2. **候选函数分析档案**
{analysis_dossiers}
# 你必须遵循的推理约束(知识图谱约束)
请基于以下四个约束条件,对每个候选函数进行分析,并综合判断需求实现状态:
**约束1功能完整性约束**
- 检查候选函数的调用链callers & callees是否能完整实现用户需求所隐含的所有子步骤或业务流程。
- 关键问题:是否存在逻辑断点?调用链是否覆盖了需求中“输入-处理-输出”的全过程?
**约束2架构/设计模式契合度约束**
- 识别候选函数所体现的设计模式(如工厂、策略、观察者、责任链、模板方法等)。
- 判断该模式是否与用户需求所描述的系统行为模式、扩展性要求或解耦意图相匹配。
**约束3模块协调性约束**
- 分析候选函数与其相关函数(调用者/被调用者)是否共同构成了一个高内聚、低耦合的功能模块。
- 关键问题:相关函数是否在语义上属于同一业务领域?它们之间的数据流是否清晰合理?
**约束4语义覆盖深度约束**
- 超越简单的文本相似度,深入分析函数在代码上下文中的**实际语义**。
- 关键问题:函数的名称、摘要、调用关系所体现的核心功能,是否精准地**覆盖**了用户需求的**核心意图**?是否存在语义偏差或功能泛化/缩窄?
你的输出**必须且只能**是一个完全符合 RFC 8259 标准的 JSON 对象。该 JSON 必须能被 Python 的 `json.loads()` 函数**直接解析**,无需任何预处理。
为了确保这一点,你必须严格遵守以下规则:
1. **禁用反引号**:在整个 JSON 对象的任何字符串值中,**绝对不允许**使用反引号 (\`)。所有需要引用标识符(如函数名、文件名)的地方,应直接将其作为字符串的一部分,**无需用任何特殊字符包围**。例如,应写成 `StarCheckGyro`,而非 \`StarCheckGyro\`。
2. **正确转义双引号**:如果在字符串内部**必须**使用双引号("),则必须使用反斜杠进行转义,写作 `\"`。例如,描述“主函数”的字符串应写作 `"主函数"`,若需在内部提及带引号的文本,应写作 `"他说:\\"你好\\""`。
3. **正确的布尔值和空值**:布尔值必须使用小写的 `true` 或 `false`。空值必须使用小写的 `null`。禁止使用 Python 的 `True`, `False`, `None` 或大写的 `Null`。
4. **无注释**JSON 对象中不允许包含任何形式的注释(`//`, `/* */`)。
5. **无尾随逗号**:在对象或数组的最后一个元素后,不允许有逗号。
违反以上任何一条规则,都将导致你的输出无法被解析,任务失败。
# 输出格式
你必须以以下JSON格式输出且仅输出此JSON对象
{{
"verdict": "完整实现 | 部分实现 | 未实现",
"confidence": 0.0到1.0之间的一个浮点数,
"primary_reasoning": "一段文字综合阐述依据约束1-4得出的主要判断理由。",
"constraint_analysis": {{
"functional_completeness": {{
"status": "满足 | 部分满足 | 不满足",
"reason": "基于约束1的分析说明。"
}},
"architectural_fit": {{
"status": "匹配 | 部分匹配 | 不匹配",
"reason": "基于约束2的分析说明。"
}},
"module_coordination": {{
"status": "协调 | 部分协调 | 不协调",
"reason": "基于约束3的分析说明。"
}},
"semantic_coverage": {{
"status": "覆盖 | 部分覆盖 | 未覆盖",
"reason": "基于约束4的分析说明。"
}}
}},
"call_chain_analysis": {{
"description": "对实现需求的核心调用链的详细文字描述。包括起点函数、关键处理函数、终点函数,以及数据流或控制流的简要说明。",
"chain": ["函数名1", "函数名2", "...", "函数名N"] # 按调用顺序列出关键函数名
}},
"design_pattern_analysis": {{
"identified_patterns": ["模式1", "模式2", ...], # 识别出的设计模式列表
"explanation": "对识别出的设计模式进行解释,说明其在代码中如何体现,以及为何适用于当前需求。"
}},
"most_relevant_functions": [
{{
"name": "函数名",
"role": "此函数在满足需求中扮演的角色(如:主入口、关键计算、数据提供者、校验器、协调者等)",
"supporting_evidence": "来自分析档案的简要证据"
}}
],
"gap_analysis": "如果 verdict 不是 '完整实现',请详细说明缺失的功能组件、断裂的调用链或语义偏差。否则为空字符串。"
}}
现在,请开始你的分析。
rZ<00>rs rra<00>.FeatureRetriever._get_judgment_prompt_templateys<00><00>Rr+<00> func_infoc <00><><00>/nURSURSS535 URS[RR URSS5535 URSURSS5S 35 URS
URS S 535 URS5nS nUR
(Ga<>U(Ga<>UR
R U5nU(GalUR
RUS5nURSURSS535 URS[URS/55S35 URS/5SSH'nURSURSS535 M) URS[URS/55S35 URS/5SSH'nURSURSS535 M) SURSS5S[URS/55S[URS/55S3nURU5n URSU (aSRU 5OS 35 URS!5 S"RU5$)#u6为单个候选函数生成详细的文本分析档案u ## 函数: r1zN/Au- **文件**: <20>fileu- **语义相似度**: <20>
similarityrz.3fu- **功能摘要**: <20>summaryu无u) (知识图谱未加载,无法分析)ru- **调用深度**: r?u$- **被以下函数调用 (Callers, r=u个)**:N<>z - u!- **调用以下函数 (Callees, r><00>u 深度u u个调用者, u个被调用者。u*- **识别的设计模式/架构特征**: z, u未识别到明显模式<E6A8A1><00>
) r(r<00>os<6F>path<74>basename<6D> kg_analyzerr7rD<00>len<65>_analyze_design_pattern<72>join)
rrh<00> dossier_lines<65> func_name<6D>call_chain_infor<00>ctx<74>caller<65>callee<65> pattern_infos
r<00>_generate_analysis_dossier<65>+FeatureRetriever._generate_analysis_dossier<65>s<><00><00><1A> <0A> <16><1C><1C>{<7B>9<EFBFBD>=<3D>=<3D><16><15>+G<>*H<>I<>J<><15><1C><1C>~<7E>b<EFBFBD>g<EFBFBD>g<EFBFBD>.><3E>.><3E>y<EFBFBD>}<7D>}<7D>V<EFBFBD>UZ<55>?[<5B>.\<5C>-]<5D>^<5E>_<><15><1C><1C>6<>y<EFBFBD>}<7D>}<7D>\<5C>ST<53>7U<37>VY<56>6Z<36>[<5B>\<5C><15><1C><1C>3<>I<EFBFBD>M<EFBFBD>M<EFBFBD>)<29>U<EFBFBD>4S<34>3T<33>U<>V<><1E>M<EFBFBD>M<EFBFBD>&<26>)<29> <09>E<><0F> <0F> <1B> <1B> <1B> <09><17>#<23>#<23>9<>9<>)<29>D<>D<EFBFBD><13><1A>&<26>&<26>?<3F>?<3F><04>T<EFBFBD>
<EFBFBD>K<><03><1D>$<24>$<24>';<3B>C<EFBFBD>G<EFBFBD>G<EFBFBD>L<EFBFBD>RS<52><T<>;U<>%V<>W<><1D>$<24>$<24>'K<>C<EFBFBD>PS<50>PW<50>PW<50>Xa<58>ce<63>Pf<50>Lg<4C>Kh<4B>ho<68>%p<>q<>!<21>g<EFBFBD>g<EFBFBD>i<EFBFBD><12>4<>R<EFBFBD>a<EFBFBD>8<>F<EFBFBD>!<21>(<28>(<28>6<EFBFBD>&<26>*<2A>*<2A>V<EFBFBD>U<EFBFBD>2K<32>1L<31>)M<>N<>9<><1D>$<24>$<24>'H<><13>S<EFBFBD>W<EFBFBD>W<EFBFBD>U^<5E>`b<>Mc<4D>Id<49>He<48>el<65>%m<>n<>!<21>g<EFBFBD>g<EFBFBD>i<EFBFBD><12>4<>R<EFBFBD>a<EFBFBD>8<>F<EFBFBD>!<21>(<28>(<28>6<EFBFBD>&<26>*<2A>*<2A>V<EFBFBD>U<EFBFBD>2K<32>1L<31>)M<>N<>9<>$-<2D>c<EFBFBD>g<EFBFBD>g<EFBFBD>l<EFBFBD>A<EFBFBD>.F<>-G<>t<EFBFBD>C<EFBFBD>PS<50>PW<50>PW<50>Xa<58>ce<63>Pf<50>Lg<4C>Kh<4B>hx<68>y|<7C>~A<02>~E<02>~E<02>FO<02>QS<02>~T<02>zU<02>yV<02>Vh<02>#i<02><0F><1C>3<>3<>I<EFBFBD>><3E> <0C><15><1C><1C>I<>eq<65>$<24>)<29>)<29>T`<60>Ja<4A>xR<02>JS<02>T<02> U<02><15><1C><1C>R<EFBFBD> <20><13>y<EFBFBD>y<EFBFBD><1D>'<27>'r+c<00><><00>/nURSS5nUR(dU$URRU5nU(dU$URRUS5nURS/5nURS/5n[ U5n[ U5n US:XaU S:<3A>aUR S5 OYUS:<3A>aU S:XaUR S 5 O;US
:XaU S
:<3A>aUR S 5 OUS
:<3A>aU S
:<3A>aUR S 5 URS S5S:<3A>aUR S5 UR 5n
SU
;d SU
;dSU
;aUR S5 SU
;d SU
;dSU
;aUR S5 SU
;dSU
;aUR S5 [[U55$)u<增强的设计模式分析返回识别出的模式列表r1rorr=r>r<00>uB“工厂方法”或“构建器” (可能是对象创建入口)u>“观察者”的通知方法 或 “策略”的接口实现rIuA“模板方法”中的步骤定义 或 “外观”模式接口u6“协调者”或“中介者” (复杂逻辑协调)r?rmu-“责任链”或“管道” (多级处理)<29>factory<72>create<74>buildu$函数名暗示“创建型”模式<E6A8A1>handler<65> processor<6F>serviceu$函数名暗示“行为型”模式<E6A8A1>adapter<65>wrapperu$函数名暗示“结构型”模式) rrtr7rDrur(<00>lower<65>listrJ) rrh<00>patternsryrr{r=r><00> callers_cnt<6E> callees_cnt<6E>
name_lowers rrv<00>(FeatureRetriever._analyze_design_pattern<72>s<><00><00><15><08><1D>M<EFBFBD>M<EFBFBD>&<26>"<22>-<2D> <09><13><1F><1F><1B>O<EFBFBD><14><1F><1F>5<>5<>i<EFBFBD>@<40><04><13><1B>O<EFBFBD><13><1E><1E>7<>7<><04>T<EFBFBD>
<EFBFBD>C<><03><15>'<27>'<27>)<29>R<EFBFBD>(<28><07><15>'<27>'<27>)<29>R<EFBFBD>(<28><07><19>'<27>l<EFBFBD> <0B><19>'<27>l<EFBFBD> <0B> <17>!<21> <1B> <0B>a<EFBFBD><0F> <14>O<EFBFBD>O<EFBFBD>`<60> a<> <18>1<EFBFBD>_<EFBFBD><1B><01>!1<> <14>O<EFBFBD>O<EFBFBD>\<5C> ]<5D> <18>A<EFBFBD> <1D>+<2B><01>/<2F> <14>O<EFBFBD>O<EFBFBD>_<> `<60> <18>1<EFBFBD>_<EFBFBD><1B>q<EFBFBD><1F> <14>O<EFBFBD>O<EFBFBD>T<> U<> <0E>7<EFBFBD>7<EFBFBD><<3C><11> #<23>q<EFBFBD> (<28> <14>O<EFBFBD>O<EFBFBD>K<> L<><1F>_<EFBFBD>_<EFBFBD>&<26>
<EFBFBD> <14>
<EFBFBD> "<22>h<EFBFBD>*<2A>&<<3C><07>:<3A>@U<> <14>O<EFBFBD>O<EFBFBD>B<> C<> <14>
<EFBFBD> "<22>k<EFBFBD>Z<EFBFBD>&?<3F>9<EFBFBD>PZ<50>CZ<43> <14>O<EFBFBD>O<EFBFBD>B<> C<> <14>
<EFBFBD> "<22>i<EFBFBD>:<3A>&=<3D> <14>O<EFBFBD>O<EFBFBD>B<> C<><13>C<EFBFBD><08>M<EFBFBD>"<22>"r+<00>queryc<00>`<00>UR(d[RS5 SS0$URU[S9nU(dSSSSS S
.$/nUH%nUR U5nUR U5 M' S RU5nURX5nURXr5nU$) u<>
基于多推理约束分析需求实现状态 (新版)
流程1. 语义检索 -> 2. 为每个结果生成分析档案 -> 3. LLM基于约束推理
<EFBFBD>知识库未加载r;u知识库未完全加载)<01>top_kFu?在代码库中未找到语义相似度足够高的相关函数皙<E695B0><E79A99><EFBFBD><EFBFBD><EFBFBD>?<3F>semantic_search_onlyu语义检索未命中。)<05> implemented<65>reason<6F>
confidence<EFBFBD>analysis_method<6F>detailsz
---
)
<EFBFBD> faiss_index<65>loggerr;<00>search_by_semanticrrr(rw<00>_make_llm_judgment<6E>_format_final_result) rr<><00>relevant_functions<6E>analysis_dossiersrh<00> dossier_text<78>combined_dossiers<72>llm_judgment_result<6C> final_results r<00>!analyze_with_multiple_constraints<74>2FeatureRetriever.analyze_with_multiple_constraintss<><00><00>
<14><1F><1F> <12>L<EFBFBD>L<EFBFBD>-<2D> .<2E><1B>7<>8<> 8<>"<22>4<>4<>U<EFBFBD>%<25>4<>H<><1A>!<21>$<24>[<5B>!<21>#9<>5<> <0E> <0E><1F><19>+<2B>I<EFBFBD><1F>:<3A>:<3A>9<EFBFBD>E<>L<EFBFBD> <1D> $<24> $<24>\<5C> 2<>,<2C>&<26>N<EFBFBD>N<EFBFBD>+<<3C>=<3D><19>#<23>5<>5<>e<EFBFBD>O<><1B><1C>0<>0<>1D<31>Y<> <0C><1B>r+r<>c<00>N<00>URRUUS9n[USS9nSSKnUR U5nUbU$[
R SU35 UR5$![a2n[
R SU35 UR5sSnA$SnAff=f)uH核心调用LLM强制其在知识图谱约束下进行推理评判)<02>
user_queryr<EFBFBD>r<>)<01> temperaturerNu6LLM响应JSON修复后解析仍失败。原始响应:
uLLM推理过程出错: ) rb<00>formatr <00>json<6F>_robust_json_parser<65>r;<00>_get_fallback_judgment<6E> Exception)rr<>r<><00>prompt<70>llm_response_textr<74><00> judgment_data<74>es rr<><00>#FeatureRetriever._make_llm_judgment?s<><00><00> 1<><19>6<>6<>=<3D>=<3D> <20>"3<>><3E><0E>F<EFBFBD> !.<2E>f<EFBFBD>#<23> F<> <1D> <18> <20>3<>3<>4E<34>F<>M<EFBFBD><1C>(<28>$<24>$<24><17> <0C> <0C>V<>Wh<57>Vi<56>j<>k<><1B>2<>2<>4<>4<><34><18> 1<> <12>L<EFBFBD>L<EFBFBD>2<>1<EFBFBD>#<23>6<> 7<><17>.<2E>.<2E>0<> 0<><30> 1<>s#<00>=A(<00>'A(<00>(
B$<03>2'B<03>B$<03>B$<03>raw_textc <00> <00>SSKnSSKnUR5nURS5(a4UR SS5n[ U5S:<3A>aUSR5nUR S5(aUSSR5nURS5nURS5nUS :Xd US :XdXg:<3A>a[RS
5 gXFUS-nUR"U5$!URa<>n [RS U RS U R35 [SU RS -
5n
[![ U5U RS -5n [R#SX<>U S35 Sn A OSn A ff=fUn Sn SnUR$"X<>U 5n U R5n UR$"SSU 5n UR$"SSU 5n UR$"SSX<>R&S9n UR$"SSU 5n UR"U 5$!URaWn[R)SURSU [SURS-
5URS-S35 SnAgSnAff=f)u<>
尝试从原始文本中稳健地解析JSON。
步骤1. 提取JSON块。 2. 清理常见问题。 3. 尝试解析。 4. 如失败,尝试修复常见问题后重试。
rNz```rprI<00><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>}<7D><><EFBFBD><EFBFBD><EFBFBD>u.在LLM响应中未找到有效的JSON结构。u首次JSON解析失败 (位置 u$),尝试清理和修复。错误: <20>u错误位置附近文本: ...z...z(?<!\\)"(\w+)"c<00>0<00>SURS5-S-$)Nz\"rI)<01>group)<01>matchs r<00>replace_inner_quotes<65>AFeatureRetriever._robust_json_parse.<locals>.replace_inner_quotes<65>s<00><00><18>5<EFBFBD>;<3B>;<3B>q<EFBFBD>><3E>)<29>E<EFBFBD>1<> 1r+z
:\s*True\bz: truez :\s*False\bz: falsez
:\s*Null\bz: null)<01>flagsz
:\s*None\bu(修复后JSON解析仍然失败 (位置 u)。修复后文本片段:
...<2E>2)r<><00>re<72>strip<69>
startswith<EFBFBD>splitru<00>endswith<74>find<6E>rfindr<64><00>warning<6E>loads<64>JSONDecodeError<6F>pos<6F>msgrM<00>min<69>debug<75>sub<75>
IGNORECASEr;)rr<>r<>r<><00>text<78>lines<65>start<72>end<6E>json_strr<72><00> snippet_start<72> snippet_end<6E> repaired_json<6F>patternr<6E><00>e2s rr<><00>#FeatureRetriever._robust_json_parseYs<><00><00>
<14><11><18>~<7E>~<7E><1F><04> <0F>?<3F>?<3F>5<EFBFBD> !<21> !<21><18>J<EFBFBD>J<EFBFBD>t<EFBFBD>Q<EFBFBD>'<27>E<EFBFBD><12>5<EFBFBD>z<EFBFBD>A<EFBFBD>~<7E><1C>Q<EFBFBD>x<EFBFBD>~<7E>~<7E>'<27><04> <0F>=<3D>=<3D><15> <1F> <1F><17><03><12>9<EFBFBD>?<3F>?<3F>$<24>D<EFBFBD><15> <09> <09>#<23><0E><05><12>j<EFBFBD>j<EFBFBD><13>o<EFBFBD><03> <10>B<EFBFBD>;<3B>#<23><12>)<29>u<EFBFBD>|<7C> <12>N<EFBFBD>N<EFBFBD>K<> M<><17><17>c<EFBFBD>A<EFBFBD>g<EFBFBD>&<26><08> c<01><17>:<3A>:<3A>h<EFBFBD>'<27> '<27><><13>#<23>#<23> c<01> <12>N<EFBFBD>N<EFBFBD><<3C>Q<EFBFBD>U<EFBFBD>U<EFBFBD>G<EFBFBD>Cg<43>hi<68>hm<68>hm<68>gn<67>o<> p<><1F><01>1<EFBFBD>5<EFBFBD>5<EFBFBD>2<EFBFBD>:<3A>.<2E>M<EFBFBD><1D>c<EFBFBD>(<28>m<EFBFBD>Q<EFBFBD>U<EFBFBD>U<EFBFBD>R<EFBFBD>Z<EFBFBD>8<>K<EFBFBD> <12>L<EFBFBD>L<EFBFBD>8<><18>P[<5B>9\<5C>8]<5D>]`<60>a<> b<> b<><62>  c<01><>!<21> <0A>#<23><07> 2<><1B><06><06>w<EFBFBD>m<EFBFBD>L<> <0A>&<26>+<2B>+<2B>-<2D> <0A><1B><06><06>}<7D>h<EFBFBD> <0A>F<> <0A><1A><06><06>~<7E>y<EFBFBD>-<2D>H<> <0A><1A><06><06>}<7D>h<EFBFBD> <0A>]<5D>]<5D>[<5B> <0A><1A><06><06>}<7D>h<EFBFBD> <0A>F<> <0A> <18><17>:<3A>:<3A>m<EFBFBD>,<2C> ,<2C><><13>#<23>#<23> <18> <12>L<EFBFBD>L<EFBFBD>C<>B<EFBFBD>F<EFBFBD>F<EFBFBD>8<EFBFBD>Kj<4B>kx<6B>y|<7C>}~<7E>AC<02>AG<02>AG<02>HJ<02>AJ<02>zK<02>LN<02>LR<02>LR<02>SU<02>LU<02>lV<02>kW<02>WZ<02>[<02> \<02><17><> <18>s2<00>C/<00>/F<03>?BF <03> F<03>H&<00>&J <03>6A J<03>J c <00>6<00>SSSSSS.SSS.SSS.SSS.S./SS.$) u!LLM调用失败时的回退方案<E696B9>未知<E69CAA>u3LLM推理过程发生错误使用回退逻辑。u错误)<02>statusr<73>)<04>functional_completeness<73>architectural_fit<69>module_coordination<6F>semantic_coverageu系统内部错误。)<06>verdictr<74><00>primary_reasoning<6E>constraint_analysis<69>most_relevant_functions<6E> gap_analysisrZrfs rr<><00>'FeatureRetriever._get_fallback_judgment<6E>sD<00><00> <20><1D>!V<>6><3E>(<28>+S<>08<30>H<EFBFBD>%M<>2:<3A>h<EFBFBD>'O<>08<30>H<EFBFBD>%M<> $<0E> (*<2A>3<> 
<EFBFBD>
r+<00> llm_judgmentr<74>c<00>R<00>SSSSS.nURURSS5S5n0nURS05nUR5HRupxSSSSSSSSS S S S S S
. n U RURS S5S 5n
U
U
S:<3A>URS S 5S.XW'MT Sn U(aX[USS9n U S[RR U RSS55U SU RSS5SSS.n UURSS5URSS 5URSS 5[ SUR555[U5UU [U5URSS5URSS 5URS/5S .S!S". n U $)#u?将LLM的评判结果格式化为兼容原接口的最终输出TF)u 完整实现u 部分实现u 未实现r<E78EB0>r<>r<>r<>g<00>?<3F><00>?r<>) u满足u匹配u协调u覆盖u 部分满足u 部分匹配u 部分协调u 部分覆盖u 不满足u 不匹配u 不协调u 未覆盖r<E79B96>r<>r<>ro)<03>score<72>passedr<64>Nc<00> <00>US$)NrkrZ)<01>xs r<00><lambda><3E>7FeatureRetriever._format_final_result.<locals>.<lambda><3E>s<00><00>a<EFBFBD> <0C>or+)<01>keyr1rj<00> 未知文件rkrl<00> 无摘要<E69198>d)r1rjrkrlr<>u无理由提供r<E4BE9B>c3<00>V# <00>UHoRSS5(dMSv<00> M! g7f)r<>FrIN)r)<02>.0<EFBFBD>css r<00> <genexpr><3E>8FeatureRetriever._format_final_result.<locals>.<genexpr><3E>s#<00><00><00>%h<>2L<32>B<EFBFBD>PV<50>PV<50>W_<57>af<61>Pg<50>a<EFBFBD>a<EFBFBD>2L<32>s<00>)<01> )r<>r<>)r<>r<><00>most_relevant_functions_roles<65>llm_constraint_reasoning) r<>r<>r<><00> total_score<72>passed_constraints<74>total_constraints<74>constraint_scores<65>most_relevant_function<6F>relevant_functions_countr<74>r<>) rr2rMrqrrrs<00>sum<75>valuesru)rr<>r<><00> verdict_mapr<70>r<00>constraint_status<75> cons_name<6D> cons_info<66>status_score_mapr<70><00> most_relevant<6E> best_funcr<63>s rr<><00>%FeatureRetriever._format_final_result<6C>s<><00><00>!<21> <20><1E><1B> 
<EFBFBD> <0B>"<22>o<EFBFBD>o<EFBFBD>l<EFBFBD>&6<>&6<>y<EFBFBD>(<28>&K<>U<EFBFBD>S<> <0B><1F><19>(<28>,<2C>,<2C>-B<>B<EFBFBD>G<><19>$5<>$;<3B>$;<3B>$=<3D> <20>I<EFBFBD>*-<2D><13><03>WZ<57>/2<>C<EFBFBD>Y\<5C>nq<6E>,/<2F>c<EFBFBD>PS<50>be<62>),<2C> .<2E> <1C>%<25>(<28>(<28><19><1D><1D>x<EFBFBD><18>)J<>C<EFBFBD>P<>E<EFBFBD><1E><1F>3<EFBFBD>,<2C>$<24>=<3D>=<3D><18>2<EFBFBD>6<>,<0E> <1D> (<28> %><3E><1D> <0A> <1D><1B>.<2E>4M<34>N<>I<EFBFBD>!<21>&<26>)<29><1A><07><07>(<28>(<28><19><1D><1D>v<EFBFBD>~<7E>)N<>O<>'<27> <0C>5<>$<24>=<3D>=<3D><19>K<EFBFBD>@<40><14>#<23>F<> <0E>M<EFBFBD>'<27>"<22>&<26>&<26>':<3A><M<>N<>&<26>*<2A>*<2A><<3C><13>=<3D>'<27>+<2B>+<2B>L<EFBFBD>#<23>><3E>"%<25>%h<>2C<32>2J<32>2J<32>2L<32>%h<>"h<>!$<24>%6<>!7<>!2<>&3<>(+<2B>,><3E>(?<3F>(<28>+<2B>+<2B>I<EFBFBD>x<EFBFBD>@<40> ,<2C> 0<> 0<><1E><12> D<>1=<3D>1A<31>1A<31>B[<5B>]_<>1`<60><0E>
:<3A>!
<EFBFBD> <0C>&<1C>r+c<00>6<00>U=(d 0UlSUlSUlSUlSUlSUlUR S[5UlUR S[5Ul
UR S[5Ul UR5Ulg)r`N<>vector_db_path<74> metadata_path<74>knowledge_graph_path)r^r<><00>contexts<74> metadatas<61>knowledge_graphrtrrrrrr rrarbrcs rrrd<00>s<><00><00><1C>l<EFBFBD><02><04> <0B><1F><04><18><1C><04> <0A><1D><04><0E>#<23><04><1C><1F><04><18>%<25>j<EFBFBD>j<EFBFBD>)9<>><3E>J<><04><1B>#<23>Z<EFBFBD>Z<EFBFBD><0F><1D>G<><04><1A>$*<2A>J<EFBFBD>J<EFBFBD>/E<>G[<5B>$\<5C><04>!<21>-1<>,N<>,N<>,P<><04>)r+c<00><><00>[RS5 [RR UR
5(d#[R SUR
35 g[R"UR
5Ul [RR UR5(d#[R SUR35 g[URSSS9n[R"U5UlSSS5 [RR UR5(aT[URSSS9n[R"U5UlSSS5 [#UR 5UlO0[R'S UR35 SUlSUl/UlURH|nUR+S
S 5nUR+S S 5nUR+SS5nSUS[RR-U5SU3nUR(R/U5 M~ [RS[1UR5S35 g!,(df  GN<>=f!,(df  GN,=f![2a"n[R SU35 SnAgSnAff=f)u加载知识库文件u正在加载知识库...u 向量数据库文件不存在: Fu元数据文件不存在: <20>rzutf-8)<01>encodingNu知识图谱文件不存在: r1<00> 未知函数rjr<>rlr<>u【函数名】u
【所在文件】u
【功能摘要】u知识库加载成功: u
个函数Tu加载知识库失败: )r<><00>inforqrr<00>existsrr;<00>faiss<73>
read_indexr<EFBFBD>r<00>openr<6E><00>loadrrrrrtr<>rrrsr(rur<>)r<00>f<>metary<00> file_pathrl<00> context_strr<72>s r<00>load_knowledge_base<73>$FeatureRetriever.load_knowledge_base<73>sA<00><00>/ <19> <12>K<EFBFBD>K<EFBFBD>2<> 3<><16>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24>"5<>"5<>6<>6<><16> <0C> <0C>?<3F><04>@S<>@S<>?T<>U<>V<><1C>$<24>/<2F>/<2F><04>0C<30>0C<30>D<>D<EFBFBD> <1C><16>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24>"4<>"4<>5<>5<><16> <0C> <0C>9<>$<24>:L<>:L<>9M<39>N<>O<><1C><15>d<EFBFBD>(<28>(<28>#<23><07>@<40>A<EFBFBD>!%<25><19><19>1<EFBFBD><1C><04><0E>A<01><12>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>7<>7<>8<>8<><19>$<24>3<>3<>S<EFBFBD>7<EFBFBD>K<>q<EFBFBD>+/<2F>9<EFBFBD>9<EFBFBD>Q<EFBFBD><<3C>D<EFBFBD>(<28>L<01>$:<3A>$<24>:N<>:N<>#O<><04> <20><16><0E><0E>!><3E>t<EFBFBD>?X<>?X<>>Y<>Z<>[<5B>'+<2B><04>$<24>#'<27><04> <20><1F>D<EFBFBD>M<EFBFBD><1C><0E><0E><04> <20>H<EFBFBD>H<EFBFBD>V<EFBFBD>^<5E><<3C> <09> <20>H<EFBFBD>H<EFBFBD>V<EFBFBD>^<5E><<3C> <09><1E>(<28>(<28>9<EFBFBD>k<EFBFBD>:<3A><07>&<26>i<EFBFBD>[<5B>1)<29>)+<2B><17><17>)9<>)9<>)<29>)D<>(E<>F)<29>)0<> <09>3<><1C>
<15> <0A> <0A>$<24>$<24>[<5B>1<>'<27> <13>K<EFBFBD>K<EFBFBD>1<>#<23>d<EFBFBD>n<EFBFBD>n<EFBFBD>2E<32>1F<31>j<EFBFBD>Q<> R<><17>=A<01>@<40><>
L<01>K<><4B>6<19> <19> <12>L<EFBFBD>L<EFBFBD>2<>1<EFBFBD>#<23>6<> 7<><18><> <19>sW<00>A%J-<00>(A5J-<00>J-<00>3J <03>A J-<00>J<03>6DJ-<00>
J<07>J-<00>
J*<07>%J-<00>-
K<03>7K<03>Kr<>c<00><><00>UR(aUR(d[RS5 /$[ U5n[
R "USS9R[
R5nURRX25upE/n[US5HuupxSS[USU5--
n U [:<3A>dM([U5U URUS.n
U
RURU55 UR!U
5 Mw U$!["a$n [RSU 35 /sSn A $Sn A ff=f) u6语义搜索基于向量相似度查找相关函数r<E695B0>r)<01>axisrIr<>)<03>indexrk<00>contextu语义搜索失败: N)r<>rr<>r;r <00>np<6E> expand_dims<6D>astype<70>float32<33>search<63> enumerate<74>floatr
rX<00>update<74>_get_function_metadatar(r<>) rr<>r<><00> query_vec<65> distances<65>indicesr<73><00>i<>idxrkrhr<>s rr<><00>#FeatureRetriever.search_by_semantic+s%<00><00><13><1F><1F>t<EFBFBD>}<7D>}<7D> <12>L<EFBFBD>L<EFBFBD>-<2D> .<2E><15>I<EFBFBD> <16>*<2A>5<EFBFBD>1<>I<EFBFBD><1A><0E><0E>y<EFBFBD>q<EFBFBD>9<>@<40>@<40><12><1A><1A>L<>I<EFBFBD>"&<26>!1<>!1<>!8<>!8<><19>!J<> <1E>I<EFBFBD>"$<24> <1E>#<23>G<EFBFBD>A<EFBFBD>J<EFBFBD>/<2F><06><01><1E><13>u<EFBFBD>Y<EFBFBD>q<EFBFBD>\<5C>!<21>_<EFBFBD>'=<3D>!=<3D>=<3D>
<EFBFBD><1D>!9<>9<>!$<24>S<EFBFBD><18>&0<>#'<27>=<3D>=<3D><13>#5<>!<16>I<EFBFBD> <1E>$<24>$<24>T<EFBFBD>%@<40>%@<40><13>%E<>F<>&<26>-<2D>-<2D>i<EFBFBD>8<>0<>&<26> %<25><><18> <16> <12>L<EFBFBD>L<EFBFBD>/<2F><01>s<EFBFBD>3<> 4<><15>I<EFBFBD><49> <16>s%<00>BD <00> AD <00>
E<03>*E <03>E<03> Er+c<00><00>US:dU[UR5:<3A>a0$URUnURSS5nURSS5nUUURSS5URS/5URS /5S
.$) u获取函数的元数据rr1rrjr<>rlr<><00>calls<6C> called_by)r1rjrlr=r>)rurr)rr+r$ryr%s rr5<00>'FeatureRetriever._get_function_metadataMs<><00><00> <10>1<EFBFBD>9<EFBFBD><05><13>T<EFBFBD>^<5E>^<5E>!4<>4<><15>I<EFBFBD><13>~<7E>~<7E>e<EFBFBD>$<24><04><18>H<EFBFBD>H<EFBFBD>V<EFBFBD>^<5E>4<> <09><18>H<EFBFBD>H<EFBFBD>V<EFBFBD>^<5E>4<> <09><1E><1D><1B>x<EFBFBD>x<EFBFBD> <09>;<3B>7<><19>X<EFBFBD>X<EFBFBD>g<EFBFBD>r<EFBFBD>*<2A><1D><18><18>+<2B>r<EFBFBD>2<> 
<EFBFBD>
r+r,c<00>~<00>[R"SU5nU(aURS5R5$g)u$从上下文文本中提取函数名u【函数名】(.*)rIr)r<>r1r<>r<>)rr,r<>s r<00>_extract_function_name<6D>'FeatureRetriever._extract_function_name^s0<00><00><12> <09> <09>0<>'<27>:<3A><05> <10><18>;<3B>;<3B>q<EFBFBD>><3E>'<27>'<27>)<29> )<29>r+)
r^rr<>rtrrrbrrrrQ)rRrSrTrUrVrrrrWrarrrvr<>r<>r<>r<>r<><00>boolr'rrXr<>r5rArYrZr+rr\r\rs/<00><00>4<>Q<01>x<EFBFBD><04>~<7E>Q<01>T<08>s<EFBFBD>T<08>l(<28>D<EFBFBD>(<28>S<EFBFBD>(<28>D)#<23><14>)#<23>$<24>s<EFBFBD>)<29>)#<23>V!<1C>s<EFBFBD>!<1C>t<EFBFBD>!<1C>F1<><03>1<><03>1<><04>1<>4?<18>3<EFBFBD>?<18>8<EFBFBD>D<EFBFBD>><3E>?<18>B
<EFBFBD><04>
<EFBFBD> ;<1C><14>;<1C>4<EFBFBD>PT<50>:<3A>;<1C>Z^<5E>;<1C>zQ<01>x<EFBFBD><04>~<7E>Q<01>"1<19>T<EFBFBD>1<19>f;@<01> <16><03> <16>C<EFBFBD> <16>D<EFBFBD><14>J<EFBFBD> <16>D
<EFBFBD>C<EFBFBD>
<EFBFBD>D<EFBFBD>
<EFBFBD>"<1E>c<EFBFBD><1E>c<EFBFBD>r+r\)r<>rqr<><00>typingrrr<00>loggingr<00>numpyr-r^rrrr r
<00> llm_processorr r <00> getLoggerrRr<>rr\rZr+r<00><module>rIsO<00><01> <0B> <09> <09>'<27>'<27><0E> <0C><12>g<>g<>;<3B> <10> <1A> <1A>8<EFBFBD> $<24><06>b<19>b<19>Fq<1E>qr+