peichao.dong
commited on
Commit
•
cbbcc75
1
Parent(s):
6ee4cc4
update embedding
Browse files
README.md
CHANGED
@@ -19,6 +19,7 @@ python3
|
|
19 |
|
20 |
```shell
|
21 |
pip install -r requirments
|
|
|
22 |
```
|
23 |
|
24 |
## 运行命令
|
|
|
19 |
|
20 |
```shell
|
21 |
pip install -r requirments
|
22 |
+
python -m spacy download zh_core_web_sm
|
23 |
```
|
24 |
|
25 |
## 运行命令
|
app.py
CHANGED
@@ -56,14 +56,15 @@ faqChain = customerEmbedding.getFAQChain()
|
|
56 |
|
57 |
code_agent_executor = code_agent_executor()
|
58 |
def faqFromLocal(input, chatbot=[]):
|
59 |
-
response = faqChain
|
60 |
-
chatbot.append((input, response))
|
61 |
return chatbot, ""
|
62 |
|
63 |
|
64 |
-
def generateEmbeddings():
|
65 |
-
customerEmbedding.
|
66 |
-
|
|
|
67 |
|
68 |
|
69 |
def generateCode(input: str, chatbot=[], returnCode=False):
|
@@ -120,9 +121,6 @@ with gr.Blocks() as demo:
|
|
120 |
with gr.Row():
|
121 |
gr.Button("Save Context").click(saveContext, [context], [])
|
122 |
|
123 |
-
|
124 |
-
# with gr.Row():
|
125 |
-
# generateEmbedding = gr.Button("Generate embedding")
|
126 |
with gr.Tab("Tech"):
|
127 |
with gr.Row():
|
128 |
with gr.Column(min_width="50%"):
|
@@ -148,6 +146,8 @@ with gr.Blocks() as demo:
|
|
148 |
with gr.Row():
|
149 |
faq = gr.Textbox(show_label=False, placeholder="Enter text and press enter").style(
|
150 |
container=False)
|
|
|
|
|
151 |
|
152 |
|
153 |
txt.submit(sendMessage, [chatbot, txt], [chatbot]).then(
|
@@ -157,7 +157,6 @@ with gr.Blocks() as demo:
|
|
157 |
generateCode, [code, code_chatbot], [code_chatbot, code])
|
158 |
|
159 |
faq.submit(faqFromLocal, [faq, faq_chatbot], [faq_chatbot, faq])
|
160 |
-
# generateEmbedding.click(generateEmbeddings)
|
161 |
|
162 |
demo.load(loadContext, [], [context])
|
163 |
demo.launch()
|
|
|
56 |
|
57 |
code_agent_executor = code_agent_executor()
|
58 |
def faqFromLocal(input, chatbot=[]):
|
59 |
+
response = faqChain({"question": f"{input}"})
|
60 |
+
chatbot.append((input, response["answer"]))
|
61 |
return chatbot, ""
|
62 |
|
63 |
|
64 |
+
def generateEmbeddings(chatbot=[]):
|
65 |
+
response = customerEmbedding.calculateEmbedding()
|
66 |
+
chatbot.append((None, response))
|
67 |
+
return chatbot
|
68 |
|
69 |
|
70 |
def generateCode(input: str, chatbot=[], returnCode=False):
|
|
|
121 |
with gr.Row():
|
122 |
gr.Button("Save Context").click(saveContext, [context], [])
|
123 |
|
|
|
|
|
|
|
124 |
with gr.Tab("Tech"):
|
125 |
with gr.Row():
|
126 |
with gr.Column(min_width="50%"):
|
|
|
146 |
with gr.Row():
|
147 |
faq = gr.Textbox(show_label=False, placeholder="Enter text and press enter").style(
|
148 |
container=False)
|
149 |
+
with gr.Row():
|
150 |
+
gr.Button("Regenerate embedding").click(generateEmbeddings,[faq_chatbot], [faq_chatbot])
|
151 |
|
152 |
|
153 |
txt.submit(sendMessage, [chatbot, txt], [chatbot]).then(
|
|
|
157 |
generateCode, [code, code_chatbot], [code_chatbot, code])
|
158 |
|
159 |
faq.submit(faqFromLocal, [faq, faq_chatbot], [faq_chatbot, faq])
|
|
|
160 |
|
161 |
demo.load(loadContext, [], [context])
|
162 |
demo.launch()
|
documents/bussiness_context/NOTION_DB/Engineering Wiki 2402f5396a3244fdb3f1d135bdb0f3d6/Smart Domain 3b0daf8bb0d740439426cfab214f1fa6.md
CHANGED
@@ -1,69 +1,13 @@
|
|
1 |
# Smart Domain
|
2 |
|
3 |
-
|
4 |
-
Owner: Anonymous
|
5 |
-
Tags: Architecture, DDD
|
6 |
-
|
7 |
-
[Smart Domain](https://github.com/Re-engineering-Domain-Driven-Design/Accounting/blob/main/public/Smart%20Domain%20Pattern.pdf?raw=true)是一种新的软件架构模式,主要用于实现领域驱动设计(DDD)。相较于传统的分层架构,Smart Domain更加注重从业务领域的角度去划分层次,并在每一层次上都使用领域专家和开发人员共同理解的通用语言进行交流,从而建立起完整的领域模型。与此同时,Smart Domain还摒弃了服务层的概念,将原本在服务层实现的逻辑下沉到领域模型中,从而让领域模型更加丰满和清晰。
|
8 |
|
9 |
总之,Smart Domain是一种新的软件架构模式,通过从业务领域的角度去划分层次和使用通用语言建立领域模型,以及将服务层逻辑下沉到领域模型中,提高了领域驱动设计的实现效果。
|
10 |
|
11 |
-
[https://github.com/Re-engineering-Domain-Driven-Design/Accounting](https://github.com/Re-engineering-Domain-Driven-Design/Accounting)
|
12 |
-
|
13 |
-
[直播加餐02|如何使用Smart Domain实现DDD?-极客时间](https://time.geekbang.org/column/article/556440)
|
14 |
-
|
15 |
## SmartDomain 分层
|
16 |
-
|
17 |
1. Domain层
|
18 |
Domain层是整个系统的核心,主要定义业务相关的实体(Entity)和表示实体之间关联关系的关联对象。该层定义的实体和关联对象是业务模型的核心,反映了整个系统的业务规则和逻辑。同时,该层仅提供接口或抽象类定义,不包含具体实现。这样做可以避免业务逻辑和实现细节的混淆,也方便后续的扩展和维护。
|
19 |
2. 集成层
|
20 |
集成层主要负责Domain层中关系对象的实现,该层会依赖数据库、Http接口访问进行功能实现。该层的职责是将Domain层的抽象定义转换成具体实现,包括数据持久化、网络通信等。该层还可以处理一些跨域访问和数据加密解密等底层功能。
|
21 |
3. API层
|
22 |
-
API层是整个系统的入口,基于Domain层的Entity或关联对象提供的能力,提供外部访问的RestFul接口。该层负责处理外部请求,将请求参数转换成业务对象并调用Domain层的业务逻辑实现,返回结果给客户端。该层还可以对请求参数进行验证、安全过滤等操作,保证系统的安全性和可靠性。
|
23 |
-
|
24 |
-
- chat prompt
|
25 |
-
|
26 |
-
Smart Domain 架构模式,将系统架构分为三层:
|
27 |
-
|
28 |
-
1. Domain层 - 定义与业务相关的实体(Entity),表示业务概念和实体之间的关联关系的关联对象。关联对象通常是一个集合概念,表示实体的集合。关联对象仅提供接口或抽象类的定义,不包含具体实现。Domain层没有Repository、Service等技术型组件。
|
29 |
-
2. 集成层 - 提供Domain层中关联对象的实现。该层会依赖数据库、Http接口等进行功能实现。
|
30 |
-
3. API层 - 基于Domain层的实体或关联对象提供的能力,提供外部访问的RestFul接口。
|
31 |
-
|
32 |
-
## 构建项目脚手架
|
33 |
-
|
34 |
-
使用 Smart Domain 架构模式,本系统采用 Spring Boot 3.X、Java 17、Spring WebFlux、Spring Data reactive CouchBase、WebClient、Spring RSocket 等技术栈,并通过多模块实现分层管理。
|
35 |
-
|
36 |
-
创建脚手架项目步骤:
|
37 |
-
|
38 |
-
> 请给出脚手架项目搭建总体步骤,先不用给出具体操作
|
39 |
-
>
|
40 |
-
- 创建 Gradle 多模块项目
|
41 |
-
|
42 |
-
> 请仅给出创建 Gradle 多模块项目时root project的创建步骤
|
43 |
-
>
|
44 |
-
- 创建root project
|
45 |
-
1. 创建 Gradle 多模块项目(如果未安装 Gradle,需要先安装)
|
46 |
-
1. 打开Intellij IDEA,选择"Create New Project"。
|
47 |
-
2. 在新建项目向导中,选择"Gradle"。
|
48 |
-
3. 选择"Create New Project"并点击"Next"。
|
49 |
-
4. 在"Project SDK"下拉菜单中选择您想要使用的Java JDK版本,并点击"Next"。
|
50 |
-
5. 输入项目名称和项目路径,并点击"Finish"。
|
51 |
-
6. 删除src目录
|
52 |
-
- 创建sub module
|
53 |
-
|
54 |
-
创建sub module的步骤为:
|
55 |
-
|
56 |
-
1. 在root project的根目录下,使用命令行或终端创建一个新的子目录。
|
57 |
-
2. 进入子目录,并在其中创建一个新的Gradle项目。
|
58 |
-
3. 在root project的settings.gradle文件中,添加新的sub module。
|
59 |
-
4. 在root project的build.gradle文件中,定义新的sub module���依赖关系和构建任务。
|
60 |
-
|
61 |
-
- 创建root project
|
62 |
-
1. 创建 Gradle 多模块项目(如果未安装 Gradle,需要先安装)
|
63 |
-
1. 打开Intellij IDEA,选择"Create New Project"。
|
64 |
-
2. 在新建项目向导中,选择"Gradle"。
|
65 |
-
3. 选择"Create New Project"并点击"Next"。
|
66 |
-
4. 在"Project SDK"下拉菜单中选择您想要使用的Java JDK版本,并点击"Next"。
|
67 |
-
5. 输入项目名称和项目路径,并点击"Finish"。
|
68 |
-
6. 删除src目录
|
69 |
-
- 创建sub module
|
|
|
1 |
# Smart Domain
|
2 |
|
3 |
+
Smart Domain是一种新的软件架构模式,主要用于实现领域驱动设计(DDD)。相较于传统的分层架构,Smart Domain更加注重从业务领域的角度去划分层次,并在每一层次上都使用领域专家和开发人员共同理解的通用语言进行交流,从而建立起完整的领域模型。与此同时,Smart Domain还摒弃了服务层的概念,将原本在服务层实现的逻辑下沉到领域模型中,从而让领域模型更加丰满和清晰。
|
|
|
|
|
|
|
|
|
4 |
|
5 |
总之,Smart Domain是一种新的软件架构模式,通过从业务领域的角度去划分层次和使用通用语言建立领域模型,以及将服务层逻辑下沉到领域模型中,提高了领域驱动设计的实现效果。
|
6 |
|
|
|
|
|
|
|
|
|
7 |
## SmartDomain 分层
|
|
|
8 |
1. Domain层
|
9 |
Domain层是整个系统的核心,主要定义业务相关的实体(Entity)和表示实体之间关联关系的关联对象。该层定义的实体和关联对象是业务模型的核心,反映了整个系统的业务规则和逻辑。同时,该层仅提供接口或抽象类定义,不包含具体实现。这样做可以避免业务逻辑和实现细节的混淆,也方便后续的扩展和维护。
|
10 |
2. 集成层
|
11 |
集成层主要负责Domain层中关系对象的实现,该层会依赖数据库、Http接口访问进行功能实现。该层的职责是将Domain层的抽象定义转换成具体实现,包括数据持久化、网络通信等。该层还可以处理一些跨域访问和数据加密解密等底层功能。
|
12 |
3. API层
|
13 |
+
API层是整个系统的入口,基于Domain层的Entity或关联对象提供的能力,提供外部访问的RestFul接口。该层负责处理外部请求,将请求参数转换成业务对象并调用Domain层的业务逻辑实现,返回结果给客户端。该层还可以对请求参数进行验证、安全过滤等操作,保证系统的安全性和可靠性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
embedding.py
CHANGED
@@ -1,11 +1,15 @@
|
|
1 |
-
from langchain
|
2 |
-
from langchain.
|
|
|
3 |
from langchain.embeddings import HuggingFaceEmbeddings
|
4 |
from langchain.vectorstores import FAISS
|
5 |
from langchain.chains import RetrievalQA
|
6 |
-
from langchain.
|
7 |
-
|
|
|
8 |
from langchain.llms import OpenAI
|
|
|
|
|
9 |
|
10 |
|
11 |
class CustomEmbedding:
|
@@ -16,20 +20,39 @@ class CustomEmbedding:
|
|
16 |
def calculateEmbedding(self):
|
17 |
documents = self.notionDirectoryLoader.load()
|
18 |
text_splitter = SpacyTextSplitter(
|
19 |
-
chunk_size=
|
|
|
|
|
|
|
20 |
texts = text_splitter.split_documents(documents)
|
21 |
|
22 |
docsearch = FAISS.from_documents(texts, self.embeddings)
|
23 |
docsearch.save_local(
|
24 |
folder_path="./documents/business_context.faiss")
|
25 |
|
|
|
|
|
26 |
def getFAQChain(self, llm=OpenAI(temperature=0.7)):
|
|
|
27 |
docsearch = FAISS.load_local(
|
28 |
"./documents/business_context.faiss", self.embeddings)
|
29 |
-
retriever = VectorStoreRetriever(vectorstore=docsearch)
|
30 |
-
|
31 |
-
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
|
35 |
# customerEmbedding = CustomEmbedding()
|
|
|
1 |
+
from langchain import LLMChain, PromptTemplate
|
2 |
+
from langchain.document_loaders import NotionDirectoryLoader
|
3 |
+
from langchain.text_splitter import MarkdownTextSplitter, SpacyTextSplitter
|
4 |
from langchain.embeddings import HuggingFaceEmbeddings
|
5 |
from langchain.vectorstores import FAISS
|
6 |
from langchain.chains import RetrievalQA
|
7 |
+
from langchain.chains.question_answering import load_qa_chain
|
8 |
+
|
9 |
+
from langchain.document_loaders import NotionDirectoryLoader
|
10 |
from langchain.llms import OpenAI
|
11 |
+
from langchain.memory import ConversationBufferMemory
|
12 |
+
from langchain.chains import ConversationalRetrievalChain
|
13 |
|
14 |
|
15 |
class CustomEmbedding:
|
|
|
20 |
def calculateEmbedding(self):
|
21 |
documents = self.notionDirectoryLoader.load()
|
22 |
text_splitter = SpacyTextSplitter(
|
23 |
+
chunk_size=2048, pipeline="zh_core_web_sm", chunk_overlap=0)
|
24 |
+
|
25 |
+
# text_splitter = MarkdownTextSplitter(
|
26 |
+
# chunk_size=4000, chunk_overlap=0)
|
27 |
texts = text_splitter.split_documents(documents)
|
28 |
|
29 |
docsearch = FAISS.from_documents(texts, self.embeddings)
|
30 |
docsearch.save_local(
|
31 |
folder_path="./documents/business_context.faiss")
|
32 |
|
33 |
+
|
34 |
+
|
35 |
def getFAQChain(self, llm=OpenAI(temperature=0.7)):
|
36 |
+
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
|
37 |
docsearch = FAISS.load_local(
|
38 |
"./documents/business_context.faiss", self.embeddings)
|
39 |
+
# retriever = VectorStoreRetriever(vectorstore=docsearch)
|
40 |
+
llm = OpenAI(temperature=0)
|
41 |
+
_template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question in chinese.
|
42 |
+
|
43 |
+
Chat History:
|
44 |
+
{chat_history}
|
45 |
+
Follow Up Input: {question}
|
46 |
+
Standalone question:"""
|
47 |
+
CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
|
48 |
+
question_generator = LLMChain(llm=llm, prompt=CONDENSE_QUESTION_PROMPT)
|
49 |
+
|
50 |
+
doc_chain = load_qa_chain(llm, chain_type="map_reduce")
|
51 |
+
qa = ConversationalRetrievalChain( retriever= docsearch.as_retriever(),
|
52 |
+
question_generator=question_generator,
|
53 |
+
combine_docs_chain=doc_chain,
|
54 |
+
memory=memory)
|
55 |
+
return qa
|
56 |
|
57 |
|
58 |
# customerEmbedding = CustomEmbedding()
|
requirements.txt
CHANGED
@@ -4,4 +4,5 @@ langchain==0.0.162
|
|
4 |
spacy
|
5 |
sentence_transformers
|
6 |
gradio_tools
|
7 |
-
faiss-cpu
|
|
|
|
4 |
spacy
|
5 |
sentence_transformers
|
6 |
gradio_tools
|
7 |
+
faiss-cpu
|
8 |
+
tiktoken
|