mirror of
https://github.com/OpenSPG/KAG.git
synced 2026-01-07 04:44:53 +00:00
* 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>
224 lines
8.0 KiB
Python
224 lines
8.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
# Copyright 2023 OpenSPG Authors
|
||
#
|
||
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
||
# in compliance with the License. You may obtain a copy of the License at
|
||
#
|
||
# http://www.apache.org/licenses/LICENSE-2.0
|
||
#
|
||
# Unless required by applicable law or agreed to in writing, software distributed under the License
|
||
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
||
# or implied.
|
||
|
||
from kag.interface import ExecutorABC, Task, Context, LLMClient
|
||
|
||
|
||
@ExecutorABC.register("mock_retriever_executor")
|
||
class MockRetrieverExecutor(ExecutorABC):
|
||
@property
|
||
def category(self):
|
||
return "Retriever"
|
||
|
||
def invoke(self, query: str, task: Task, context: Context, **kwargs):
|
||
"""Retrieval of user query from a knowledge base.
|
||
|
||
Args:
|
||
query: User query triggering the retrieval
|
||
task: Task instance containing execution parameters
|
||
context: Pipeline execution context with dependency tracking
|
||
**kwargs: Additional execution parameters
|
||
|
||
Returns:
|
||
List of strings containing mock financial data entries
|
||
"""
|
||
result = [
|
||
"截至2025年3月12日,余额宝的七日年化收益率为1.39%。这一收益率在过去几年中经历了显著下降。例如,2024年初时余额宝的7日年化收益率可能在2%左右,但随后逐步下降,到2025年1月12日首次跌破1.2%,创下成立以来的最低值。",
|
||
"余额宝的收益率波动主要受市场利率环境的影响。货币基金的收益率通常与市场利率紧密相关,而市场利率的变化受多种经济因素影响,包括货币政策、市场流动性和经济周期等。因此,投资者在选择理财产品时,需要关注这些因素的变化,以判断收益率的未来趋势",
|
||
]
|
||
task.result = result
|
||
return result
|
||
|
||
async def ainvoke(self, query: str, task: Task, context: Context, **kwargs):
|
||
"""Asynchronous retrieval of user query from a knowledge base.
|
||
|
||
Args:
|
||
query: User query triggering the retrieval
|
||
task: Task instance containing execution parameters
|
||
context: Pipeline execution context with dependency tracking
|
||
**kwargs: Additional execution parameters
|
||
|
||
Returns:
|
||
List of strings containing mock financial data entries
|
||
"""
|
||
|
||
return self.invoke(query, task, context, **kwargs)
|
||
|
||
def schema(self):
|
||
return {
|
||
"name": "Retriever",
|
||
"description": "Retrieve relevant knowledge from the local knowledge base.",
|
||
"parameters": {
|
||
"query": {
|
||
"type": "string",
|
||
"description": "User-provided query for retrieval.",
|
||
"optional": False,
|
||
},
|
||
},
|
||
}
|
||
|
||
|
||
@ExecutorABC.register("mock_math_executor")
|
||
class MockMathExecutor(ExecutorABC):
|
||
"""Given a mathematical expression that conforms to Python syntax, perform the mathematical calculation."""
|
||
|
||
def __init__(self, llm: LLMClient):
|
||
self.llm = llm
|
||
self.prompt = """
|
||
根据问题生成可执行Python代码(需要import所有的依赖包),最后一行用`print`输出结果。代码需简洁无注释,仅返回代码,不要其他内容。
|
||
|
||
|
||
**示例说明:**
|
||
用户问题:计算1到100的和。
|
||
模型返回:
|
||
```python
|
||
s = sum(range(1, 101))
|
||
print(s)
|
||
```
|
||
|
||
用户问题:
|
||
|
||
"""
|
||
|
||
@property
|
||
def category(self):
|
||
return "Math"
|
||
|
||
async def gen_py_code(self, query: str):
|
||
prompt = f"{self.prompt}\n{query}"
|
||
out = await self.llm.acall(prompt)
|
||
return out.lstrip("```python").rstrip("```")
|
||
|
||
def run_py_code(self, code):
|
||
import io
|
||
from contextlib import redirect_stdout
|
||
|
||
f = io.StringIO()
|
||
with redirect_stdout(f):
|
||
exec(code)
|
||
output = f.getvalue().strip()
|
||
return output
|
||
|
||
async def ainvoke(self, query: str, task: Task, context: Context, **kwargs):
|
||
"""Asynchronous wrapper for synchronous invocation (runs in default threadpool).
|
||
|
||
Args:
|
||
query: Original mathematical query
|
||
task: Task containing the mathematical expression
|
||
context: Execution context
|
||
**kwargs: Additional execution parameters
|
||
|
||
Returns:
|
||
Result from synchronous invocation
|
||
"""
|
||
try:
|
||
math_expr = task.arguments["query"]
|
||
result = eval(math_expr.replace("%", "/100"))
|
||
task.result = result
|
||
return result
|
||
except:
|
||
py_code = await self.gen_py_code(task.arguments["query"])
|
||
print(f"py_code = {py_code}")
|
||
result = self.run_py_code(py_code)
|
||
task.result = result
|
||
|
||
def schema(self):
|
||
return {
|
||
"name": "Math",
|
||
"description": "Perform mathematical calculations based on user input and return the result. The user input can be a valid mathematical expression or a problem described in natural language.",
|
||
"parameters": {
|
||
"query": {
|
||
"type": "string",
|
||
"description": "The user inputs a string, which will be executed directly if it is a valid Python expression; otherwise, it will be translated into Python code before execution.",
|
||
"optional": False,
|
||
}
|
||
},
|
||
}
|
||
|
||
|
||
@ExecutorABC.register("mock_code_executor")
|
||
class MockCodeExecutor(ExecutorABC):
|
||
"""Given a mathematical expression that conforms to Python syntax, perform the mathematical calculation."""
|
||
|
||
def __init__(self, llm: LLMClient):
|
||
self.llm = llm
|
||
self.prompt = """
|
||
根据问题生成可执行Python代码(需要import所有的依赖包),最后一行用`print`输出结果。代码需简洁无注释,仅返回代码,不要其他内容。
|
||
|
||
|
||
**示例说明:**
|
||
用户问题:计算1到100的和。
|
||
模型返回:
|
||
```python
|
||
s = sum(range(1, 101))
|
||
print(s)
|
||
```
|
||
|
||
用户问题:
|
||
|
||
"""
|
||
|
||
@property
|
||
def category(self):
|
||
return "Code"
|
||
|
||
async def gen_py_code(self, query: str):
|
||
prompt = f"{self.prompt}\n{query}"
|
||
out = await self.llm.acall(prompt)
|
||
return out.lstrip("```python").rstrip("```")
|
||
|
||
def run_py_code(self, code):
|
||
import io
|
||
from contextlib import redirect_stdout
|
||
|
||
f = io.StringIO()
|
||
with redirect_stdout(f):
|
||
exec(code)
|
||
output = f.getvalue().strip()
|
||
return output
|
||
|
||
async def ainvoke(self, query: str, task: Task, context: Context, **kwargs):
|
||
"""Asynchronous wrapper for synchronous invocation (runs in default threadpool).
|
||
|
||
Args:
|
||
query: Original mathematical query
|
||
task: Task containing the mathematical expression
|
||
context: Execution context
|
||
**kwargs: Additional execution parameters
|
||
|
||
Returns:
|
||
Result from synchronous invocation
|
||
"""
|
||
try:
|
||
math_expr = task.arguments["query"]
|
||
result = eval(math_expr.replace("%", "/100"))
|
||
task.result = result
|
||
return result
|
||
except:
|
||
py_code = await self.gen_py_code(task.arguments["query"])
|
||
print(f"py_code = {py_code}")
|
||
result = self.run_py_code(py_code)
|
||
task.result = result
|
||
|
||
def schema(self):
|
||
return {
|
||
"name": "Code",
|
||
"description": "Perform mathematical calculations based on user input and return the result. The user input can be a valid mathematical expression or a problem described in natural language.",
|
||
"parameters": {
|
||
"query": {
|
||
"type": "string",
|
||
"description": "The user inputs a string, which will be executed directly if it is a valid Python expression; otherwise, it will be translated into Python code before execution.",
|
||
"optional": False,
|
||
}
|
||
},
|
||
}
|