mirror of
				https://github.com/OpenSPG/KAG.git
				synced 2025-11-04 03:55:33 +00:00 
			
		
		
		
	* feat(kag): update to v0.7 (#456) * add think cost * update csv scanner * add final rerank * add reasoner * add iterative planner * fix dpr search * fix dpr search * add reference data * move odps import * update requirement.txt * update 2wiki * add missing file * fix markdown reader * add iterative planning * update version * update runner * update 2wiki example * update bridge * merge solver and solver_new * add cur day * writer delete * update multi process * add missing files * fix report * add chunk retrieved executor * update try in stream runner result * add path * add math executor * update hotpotqa example * remove log * fix python coder solver * update hotpotqa example * fix python coder solver * update config * fix bad * add log * remove unused code * commit with task thought * move kag model to common * add default chat llm * fix * use static planner * support chunk graph node * add args * support naive rag * llm client support tool calls * add default async * add openai * fix result * fix markdown reader * fix thinker * update asyncio interface * feat(solver): add mcp support (#444) * 上传mcp client相关代码 * 1、完成一套mcp client的调用,从pipeline到planner、executor 2、允许json中传入多个mcp_server,通过大模型进行调用并选择 3、调通baidu_map_mcp的使用 * 1、schema * bugfix:删减冗余代码 --------- Co-authored-by: wanxingyu.wxy <wanxingyu.wxy@antgroup.com> * fix affairqa after solver refactor * fix affairqa after solver refactor * fix readme * add params * update version * update mcp executor * update mcp executor * solver add mcp executor * add missing file * add mpc executor * add executor * x * update * fix requirement * fix main llm config * fix solver * bugfix:修复invoke函数调用逻辑 * chg eva * update example * add kag layer * add step task * support dot refresh * support dot refresh * support dot refresh * support dot refresh * add retrieved num * add retrieved num * add pipelineconf * update ppr * update musique prompts * update * add to_dict for BuilderComponentData * async build * add deduce prompt * add deduce prompt * add deduce prompt * fix reader * add deduce prompt * add page thinker report * modify prmpt * add step status * add self cognition * add self cognition * add memory graph storage * add now time * update memory config * add now time * chg graph loader * 添加prqa数据集和代码 * bugfix:prqa调用逻辑修复 * optimize:优化代码逻辑,生成答案规范化 * add retry py code * update memory graph * update memory graph * fix * fix ner * add with_out_refer generator prompt * fix * close ckpt * fix query * fix query * update version * add llm checker * add llm checker * 1、上传evalutor.py以及修改gold_answer.json格式 2、优化代码逻辑 3、修改README.md文件 * update exp * update exp * rerank support * add static rewrite query * recall more chunks * fix graph load * add static rewrite query * fix bugs * add finish check * add finish check * add finish check * add finish check * 1、上传evalutor.py的结果 2、优化代码逻辑,优化readme文件 * add lf retry * add memory graph api * fix reader api * add ner * add metrics * fix bug * remove ner * add reraise fo retry * add edge prop to memory graph * add memory graph * 1、评测数据集结果修正 2、优化evaluator.py代码 3、删除结果不存在而gold_answer中有答案的问题 * 删除评测结果文件 * fix knext host addr * async eva * add lf prompt * add lf prompt * add config * add retry * add unknown check * add rc result * add rc result * add rc result * add rc result * 依据kag pipeline格式修改代码逻辑并通过测试 * bugfix:删除冗余代码 * fix report prompt * bugfix:触发重试机制 * bugfix:中文符号错误 * fix rethinker prompt * update version to 0.6.2b78 * update version * 1、修改evaluator.py,通过大模型计算准确率,符合最新调用逻辑 2、修改prompt,让没有回答的结果重复测试 * update affairqa for evaluate * update affairqa for evaluate * bugfix:修正数据集 * bugfix:修正数据集 * bugfix:修正数据集 * fix name conflict * bugfix:删除错误问题 * bugfix:文件名命名错误导致evaluator失败 * update for affairqa eval * bugfix:修改代码保持evaluate逻辑一致 * x * update for affairqa readme * remove temp eval scripts * bugfix for math deduce * merge 0.6.2_dev * merge 0.6.2_dev * fix * update client addr * updated version * update for affairqa eval * evaUtils 支持中文 * fix affairqa eval: * remove unused example * update kag config * fix default value * update readme * fix init * 注释信息修改,并添加部分class说明 * update example config * Tc 0.7.0 (#459) * 提交affairQA 代码 * fix affairqa eval --------- Co-authored-by: zhengke.gzk <zhengke.gzk@antgroup.com> * fix all examples * reformat --------- Co-authored-by: peilong <peilong.zpl@antgroup.com> Co-authored-by: 锦呈 <zhangxinhong.zxh@antgroup.com> Co-authored-by: wanxingyu.wxy <wanxingyu.wxy@antgroup.com> Co-authored-by: zhengke.gzk <zhengke.gzk@antgroup.com> * update chunk metadata * update chunk metadata * add debug reporter * update table text * add server * fix math executor * update api-key for openai vec * update * fix naive rag bug * format code * fix --------- Co-authored-by: zhuzhongshu123 <152354526+zhuzhongshu123@users.noreply.github.com> Co-authored-by: 锦呈 <zhangxinhong.zxh@antgroup.com> Co-authored-by: wanxingyu.wxy <wanxingyu.wxy@antgroup.com> Co-authored-by: zhengke.gzk <zhengke.gzk@antgroup.com>
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						||
from typing import Optional
 | 
						||
 | 
						||
from pydantic import BaseModel, model_validator, field_serializer
 | 
						||
 | 
						||
 | 
						||
class ReqBody(BaseModel):
 | 
						||
    """Request body model containing query parameters"""
 | 
						||
 | 
						||
    query: str = ""
 | 
						||
    report: bool = True
 | 
						||
    host_addr: str = ""
 | 
						||
 | 
						||
 | 
						||
class TaskReq(BaseModel):
 | 
						||
    """Task request model with validation logic"""
 | 
						||
 | 
						||
    app_id: int = ""
 | 
						||
    project_id: int = 0
 | 
						||
    req_id: str = ""
 | 
						||
    cmd: str = ""
 | 
						||
    mode: str = ""
 | 
						||
    req: str = None
 | 
						||
    config: str = "{}"
 | 
						||
 | 
						||
    @model_validator(mode="after")
 | 
						||
    def parse_req_to_req_body(self):
 | 
						||
        """Parse req string to ReqBody object and process config field"""
 | 
						||
        try:
 | 
						||
            import json
 | 
						||
 | 
						||
            if isinstance(self.req, str):
 | 
						||
                req_body_dict = json.loads(self.req)
 | 
						||
                self.req = ReqBody(**req_body_dict)
 | 
						||
            if isinstance(self.config, str) and self.config:
 | 
						||
                config_dict = json.loads(self.config)
 | 
						||
                self.config = config_dict
 | 
						||
        except Exception as e:
 | 
						||
            raise ValueError(f"Failed to parse 'req' field to ReqBody: {e}")
 | 
						||
        return self
 | 
						||
 | 
						||
    @field_serializer("req")
 | 
						||
    def serialize_req(self, value: object) -> object:
 | 
						||
        """Serialize ReqBody back to JSON string"""
 | 
						||
        if isinstance(value, ReqBody):
 | 
						||
            return value.model_dump_json()
 | 
						||
        return value  # Return as-is if already a string
 | 
						||
 | 
						||
 | 
						||
# Request model with TaskReq parsing capability
 | 
						||
class Request(BaseModel):
 | 
						||
    """Container model for task request data"""
 | 
						||
 | 
						||
    in_string: str
 | 
						||
    task_req: Optional[TaskReq] = None
 | 
						||
 | 
						||
    @model_validator(mode="after")
 | 
						||
    def parse_in_string_to_task_req(self):
 | 
						||
        """Convert in_string JSON string to TaskReq object"""
 | 
						||
        try:
 | 
						||
            import json
 | 
						||
 | 
						||
            task_req_dict = json.loads(self.in_string)
 | 
						||
            self.task_req = TaskReq(**task_req_dict)
 | 
						||
        except Exception as e:
 | 
						||
            raise ValueError(f"Invalid TaskReq JSON string: {e}")
 | 
						||
        return self
 | 
						||
 | 
						||
 | 
						||
class FeatureRequest(BaseModel):
 | 
						||
    """Top-level request wrapper with features container"""
 | 
						||
 | 
						||
    features: Request
 | 
						||
 | 
						||
 | 
						||
if __name__ == "__main__":
 | 
						||
 | 
						||
    def feature_request_parsing():
 | 
						||
        """Demonstrate nested model parsing workflow"""
 | 
						||
        # Build innermost ReqBody JSON string
 | 
						||
        req_body = ReqBody(
 | 
						||
            query="阿里巴巴财报中,2024年-截至9月30日止六个月的收入是多少?其中云智能集团收入是多少?占比是多少",
 | 
						||
            report=True,
 | 
						||
            host_addr="https://spg.alipay.com",
 | 
						||
        )
 | 
						||
        req_body_json = json.dumps(req_body.model_dump())
 | 
						||
 | 
						||
        # Build TaskReq dictionary and serialize to string
 | 
						||
        task_req = TaskReq(
 | 
						||
            req_id="9400110",
 | 
						||
            cmd="submit",
 | 
						||
            mode="async",
 | 
						||
            req=req_body_json,
 | 
						||
            app_id="app_id",
 | 
						||
            project_id=4200050,
 | 
						||
            config={"timeout": 10},
 | 
						||
        )
 | 
						||
        task_req_json = json.dumps(task_req.model_dump())
 | 
						||
 | 
						||
        # Construct final FeatureRequest JSON string
 | 
						||
        input_data = {"features": {"in_string": task_req_json}}
 | 
						||
 | 
						||
        # Deserialize to FeatureRequest model
 | 
						||
        feature_request = FeatureRequest(**input_data)
 | 
						||
 | 
						||
        # Validate in_string parsed to TaskReq
 | 
						||
        assert isinstance(feature_request.features.task_req, TaskReq)
 | 
						||
        assert feature_request.features.task_req.req_id == "abc123"
 | 
						||
        assert feature_request.features.task_req.cmd == "run"
 | 
						||
        assert feature_request.features.task_req.mode == "sync"
 | 
						||
        assert feature_request.features.task_req.config == {"timeout": 10}
 | 
						||
 | 
						||
        # Validate TaskReq.req parsed to ReqBody
 | 
						||
        req_body_parsed = feature_request.features.task_req.req
 | 
						||
        assert isinstance(req_body_parsed, ReqBody)
 | 
						||
        assert req_body_parsed.query == "What is AI?"
 | 
						||
        assert req_body_parsed.report is True
 | 
						||
        assert req_body_parsed.host_addr == "localhost"
 | 
						||
 | 
						||
        print("✅ All assertions passed!")
 | 
						||
 | 
						||
    feature_request_parsing()
 |