Skip to content

Commit a28857c

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent ab8f0b5 commit a28857c

25 files changed

Lines changed: 278 additions & 186 deletions

EdgeCraftRAG/docs/Agentic_RAG_Guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,4 @@ While DeepSearch agent is working, it will make plans on its own and execute the
6464
![alt text](../assets/img/agent_deepsearch_plan.png)
6565

6666
When all planned steps completed, DeepSearch agent will generate the final answer.
67-
![alt text](../assets/img/agent_deepsearch_answer.png)
67+
![alt text](../assets/img/agent_deepsearch_answer.png)

EdgeCraftRAG/docs/Experience_Guide.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
This guide explains how to enable, configure, and use Experience capabilities within EdgeCraftRAG (EC-RAG). It covers the creation and management of experience to enhance the answer quality
44

55
## Overview
6+
67
Experience refers to the knowledge and skills acquired through practical involvement, trial, and reflection, serving as a key foundation for solving real-world problems. In EC-RAG we now provide abilities to add such experience for the reference of your Chat.
78

8-
Befor use Experience, please make sure Milvus VectorDB is enabled and below env is set:
9+
Before use Experience, please make sure Milvus VectorDB is enabled and below env is set:
10+
911
```bash
1012
export METADATA_DATABASE_URL="http://${HOST_IP}:19530"
1113
```
1214

1315
## Creating An Experience
16+
1417
Upon successful deployment of EC-RAG, we may navigate to `Knowledge Base` tab from the left panel:
1518
![alt text](../assets/img/experience_access.png)
1619

@@ -35,10 +38,11 @@ In the `Create Experience` window, we could add experience and its corresponding
3538

3639
### View and Edit Experiences
3740

38-
After experience added, they will be shown in list under `Experience` tab. We could toggle the `+` sign to show experience content details. Use the three dots next to `Experience` to activate or deactive a Experience Base:
41+
After experience added, they will be shown in list under `Experience` tab. We could toggle the `+` sign to show experience content details. Use the three dots next to `Experience` to activate or deactivate a Experience Base:
3942
![alt text](../assets/img/experience_management_4.png)
4043

4144
## Examples
45+
4246
Here's a comparison with experience activated and not activated:
4347

4448
Without experience:

EdgeCraftRAG/docs/Experience_Guide_Zh.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
Experience(经验)是指个人或团队在实践过程中积累的知识和技能,通常通过实际操作、试错和反思获得,是解决实际问题的重要依据。EC-RAG 现已支持添加此类Experience,为您的对话提供更多参考。
88
使用Experience之前,请确保Mivlus服务已经启动,并且请指定如下的环境变量:
9+
910
```bash
1011
export METADATA_DATABASE_URL="http://${HOST_IP}:19530"
1112
```
@@ -27,13 +28,15 @@ export METADATA_DATABASE_URL="http://${HOST_IP}:19530"
2728
![alt text](../assets/img/experience_management_1_zh.png)
2829

2930
### 添加 Experience
31+
3032
当您需要添加新 Experience 时,请从右侧面板选择`新建经验`
3133
![alt text](../assets/img/experience_management_2_zh.png)
3234

3335
`新建经验`窗口中,您可以根据需要添加经验及其对应的内容,EC-RAG 支持创建多个经验条目:
3436
![alt text](../assets/img/experience_management_3_zh.png)
3537

3638
### 查看与修改
39+
3740
添加经验后,它们将以列表形式显示在`经验`选项卡下。您可以点击`+`号展开查看 Experience 内容的详细信息。使用左侧面板里`Experience`旁边的三个点可以激活或停用某个 Experience 库:
3841
![alt text](../assets/img/experience_management_4_zh.png)
3942

EdgeCraftRAG/edgecraftrag/api/v1/agent.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import os
66
import time
77

8-
from edgecraftrag.api_schema import AgentCreateIn
98
from edgecraftrag.api.v1.knowledge_base import Synchronizing_vector_data
9+
from edgecraftrag.api_schema import AgentCreateIn
1010
from edgecraftrag.base import AgentType
1111
from edgecraftrag.config_repository import MilvusConfigRepository, save_agent_configurations
1212
from edgecraftrag.context import ctx
@@ -188,4 +188,4 @@ async def manage_agent_bound_pipeline(bound_pl_idx, request):
188188

189189
cur_active_pipeline = pl_manager.get_active_pipeline()
190190
if prev_active_pipeline and cur_active_pipeline and prev_active_pipeline.idx != cur_active_pipeline.idx:
191-
await Synchronizing_vector_data(prev_active_pipeline, cur_active_pipeline)
191+
await Synchronizing_vector_data(prev_active_pipeline, cur_active_pipeline)

EdgeCraftRAG/edgecraftrag/api/v1/chatqna.py

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,13 @@ async def retrieval(request: ChatCompletionRequest):
3131
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
3232
detail="Retrieval needs to have an active knowledgebase",
3333
)
34-
contexts = await ctx.get_pipeline_mgr().run_retrieve_postprocess(
35-
chat_request=request
36-
)
34+
contexts = await ctx.get_pipeline_mgr().run_retrieve_postprocess(chat_request=request)
3735
serialized_contexts = serialize_contexts(contexts)
3836

39-
ragout = RagOut(
40-
query=request.messages, contexts=serialized_contexts, response=""
41-
)
37+
ragout = RagOut(query=request.messages, contexts=serialized_contexts, response="")
4238
return ragout
4339
except Exception as e:
44-
raise HTTPException(
45-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)
46-
)
40+
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
4741

4842

4943
# ChatQnA
@@ -62,9 +56,7 @@ async def chatqna(request: ChatCompletionRequest):
6256
generator = active_pl.get_generator(GeneratorType.CHATQNA)
6357
inference_type = generator.inference_type if generator else "local"
6458

65-
request.input = ctx.get_session_mgr().concat_history(
66-
sessionid, inference_type, request.messages
67-
)
59+
request.input = ctx.get_session_mgr().concat_history(sessionid, inference_type, request.messages)
6860

6961
# Run agent if activated, otherwise, run pipeline
7062
if ctx.get_agent_mgr().get_active_agent():
@@ -74,9 +66,7 @@ async def chatqna(request: ChatCompletionRequest):
7466
else:
7567
generator = active_pl.get_generator(GeneratorType.CHATQNA)
7668
if not generator:
77-
raise Exception(
78-
"code:0000Please make sure chatqna generator is available in pipeline."
79-
)
69+
raise Exception("code:0000Please make sure chatqna generator is available in pipeline.")
8070
request.model = generator.model_id
8171

8272
if request.stream:
@@ -110,9 +100,7 @@ async def ragqna(request: ChatCompletionRequest):
110100
if generator:
111101
request.model = generator.model_id
112102
if request.stream:
113-
res_gen, contexts = await ctx.get_pipeline_mgr().run_pipeline(
114-
chat_request=request
115-
)
103+
res_gen, contexts = await ctx.get_pipeline_mgr().run_pipeline(chat_request=request)
116104

117105
# Escape newlines for json format as value
118106
async def res_gen_json():
@@ -125,26 +113,18 @@ async def res_gen_json():
125113
s_contexts = json.dumps(serialize_contexts(contexts))
126114
context_gen = stream_generator('"contexts":' + s_contexts + ',"response":"')
127115
final_gen = stream_generator('"}')
128-
output_gen = chain_async_generators(
129-
[query_gen, context_gen, res_gen_json(), final_gen]
130-
)
116+
output_gen = chain_async_generators([query_gen, context_gen, res_gen_json(), final_gen])
131117

132118
return StreamingResponse(output_gen, media_type="text/plain")
133119
else:
134-
ret, contexts = await ctx.get_pipeline_mgr().run_pipeline(
135-
chat_request=request
136-
)
120+
ret, contexts = await ctx.get_pipeline_mgr().run_pipeline(chat_request=request)
137121
serialized_contexts = serialize_contexts(contexts)
138122

139-
ragout = RagOut(
140-
query=request.messages, contexts=serialized_contexts, response=str(ret)
141-
)
123+
ragout = RagOut(query=request.messages, contexts=serialized_contexts, response=str(ret))
142124
return ragout
143125

144126
except Exception as e:
145-
raise HTTPException(
146-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e)
147-
)
127+
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
148128

149129

150130
# Detecting if vllm is connected

EdgeCraftRAG/edgecraftrag/api/v1/pipeline.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ async def get_pipeline_benchmark():
8181
async def get_pipeline_benchmarks(name):
8282
pl = ctx.get_pipeline_mgr().get_pipeline_by_name_or_id(name)
8383
if pl and pl.benchmark:
84-
bench_res = {'pipeline_bench': pl.benchmark.benchmark_data_list, 'llm_bench': pl.benchmark.llm_data_list}
84+
bench_res = {"pipeline_bench": pl.benchmark.benchmark_data_list, "llm_bench": pl.benchmark.llm_data_list}
8585
return bench_res
8686

8787

@@ -314,10 +314,14 @@ async def update_pipeline_handler(pl, req):
314314
# Use weakref to achieve model deletion and memory release
315315
model_ref = weakref.ref(model)
316316
if gen.generator_type == GeneratorType.CHATQNA:
317-
pl.generator.append(QnAGenerator(model_ref, gen.prompt_path, gen.inference_type, gen.vllm_endpoint, gen.prompt_content))
317+
pl.generator.append(
318+
QnAGenerator(
319+
model_ref, gen.prompt_path, gen.inference_type, gen.vllm_endpoint, gen.prompt_content
320+
)
321+
)
318322
elif gen.generator_type == GeneratorType.FREECHAT:
319323
pl.generator.append(FreeChatGenerator(model_ref, gen.inference_type, gen.vllm_endpoint))
320-
324+
321325
if pl.enable_benchmark:
322326
if "tokenizer" not in locals() or tokenizer is None:
323327
_, tokenizer, bench_hook = ctx.get_model_mgr().load_model_ben(gen.model)

EdgeCraftRAG/edgecraftrag/components/agent.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ async def run_pipeline_chatqna(self, request):
7272
async def _run_pipeline_generate(self, request):
7373
pl = self.get_bound_pipeline()
7474
if pl is not None:
75-
return await pl.run(cbtype=CallbackType.GENERATE, chat_request=request, generator_type=GeneratorType.FREECHAT)
75+
return await pl.run(
76+
cbtype=CallbackType.GENERATE, chat_request=request, generator_type=GeneratorType.FREECHAT
77+
)
7678

7779
async def run_pipeline_retrieve_and_rerank(self, request):
7880
pl = self.get_bound_pipeline()

EdgeCraftRAG/edgecraftrag/components/benchmark.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from typing import Any, List, Optional
77

88
import requests
9-
from edgecraftrag.base import BaseComponent, CompType, InferenceType, BenchType
9+
from edgecraftrag.base import BaseComponent, BenchType, CompType, InferenceType
1010
from prometheus_client.parser import text_string_to_metric_families
1111
from pydantic import BaseModel, Field, model_serializer
1212

EdgeCraftRAG/edgecraftrag/components/generator.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import asyncio
55
import json
6-
import time
76
import os
7+
import time
88
import urllib.request
99
from concurrent.futures import ThreadPoolExecutor
1010
from urllib.parse import urlparse
@@ -123,6 +123,7 @@ async def stream_generator(llm, prompt_str, unstructured_str, benchmark=None, be
123123
result_error = str(e)[start_idx:]
124124
yield f"code:0000{result_error}"
125125

126+
126127
def clone_generator(src_generator: BaseComponent, dst_generator_cfg: dict = None):
127128
if not dst_generator_cfg:
128129
# If no config is provided, do a pure clone.
@@ -148,16 +149,19 @@ def clone_generator(src_generator: BaseComponent, dst_generator_cfg: dict = None
148149
return None
149150
# For QnAGenerator, we also need prompt-related info
150151
qna_args = shared_args.copy()
151-
qna_args.update({
152-
"prompt_template_file": src_generator.prompt_template_file,
153-
"prompt_content": src_generator.prompt_content,
154-
})
152+
qna_args.update(
153+
{
154+
"prompt_template_file": src_generator.prompt_template_file,
155+
"prompt_content": src_generator.prompt_content,
156+
}
157+
)
155158
new_generator = QnAGenerator(**qna_args)
156159
elif generator_type == GeneratorType.FREECHAT:
157160
new_generator = FreeChatGenerator(**shared_args)
158161

159162
return new_generator
160163

164+
161165
class QnAGenerator(BaseComponent):
162166

163167
def __init__(self, llm_model, prompt_template_file, inference_type, vllm_endpoint, prompt_content, **kwargs):

EdgeCraftRAG/edgecraftrag/components/model.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ def ser_model(self):
4848

4949
class OpenAIEmbeddingModel(BaseModelComponent, OpenAIEmbedding):
5050
def __init__(self, model_id, api_base, **kwargs):
51-
api_base = api_base+"/v1" if api_base and not api_base.endswith("/v1") else api_base
51+
api_base = api_base + "/v1" if api_base and not api_base.endswith("/v1") else api_base
5252
super().__init__(
5353
model_id=model_id,
5454
api_base=api_base,
5555
**kwargs,
5656
)
57-
OpenAIEmbedding.__init__(self, model_id_or_path=model_id, model_name=model_id, api_base=api_base, api_key="unused")
57+
OpenAIEmbedding.__init__(
58+
self, model_id_or_path=model_id, model_name=model_id, api_base=api_base, api_key="unused"
59+
)
5860
self.comp_type = CompType.MODEL
5961
self.comp_subtype = ModelType.VLLM_EMBEDDING
6062
self.model_id = model_id

0 commit comments

Comments
 (0)