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.run(input)
60
- chatbot.append((input, response))
61
  return chatbot, ""
62
 
63
 
64
- def generateEmbeddings():
65
- customerEmbedding.calculateBusinessContextEmbedding()
66
- customerEmbedding.calculateNotionEmbedding()
 
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
- Last edited time: April 23, 2023 3:59 PM
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.document_loaders import TextLoader, NotionDirectoryLoader
2
- from langchain.text_splitter import SpacyTextSplitter
 
3
  from langchain.embeddings import HuggingFaceEmbeddings
4
  from langchain.vectorstores import FAISS
5
  from langchain.chains import RetrievalQA
6
- from langchain.document_loaders import TextLoader, NotionDirectoryLoader
7
- from langchain.vectorstores.base import VectorStoreRetriever
 
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=256, pipeline="zh_core_web_sm", chunk_overlap=200)
 
 
 
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
- faq_chain = RetrievalQA.from_llm(
31
- llm=llm, retriever=retriever, verbose=True)
32
- return faq_chain
 
 
 
 
 
 
 
 
 
 
 
 
 
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