From 69e5da4e7afb272b5b64383cb9644a3e75d23f9c Mon Sep 17 00:00:00 2001 From: zR <2448370773@qq.com> Date: Wed, 18 Oct 2023 15:19:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=97=E4=BA=AC=E9=BB=91=E5=AE=A2=E6=9D=BE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20(#1785)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 北京黑客松更新 知识库支持: 支持zilliz数据库 Agent支持: 支持以下工具调用 1. 支持互联网Agent调用 2. 支持知识库Agent调用 3. 支持旅游助手工具(未上传) 知识库更新 1. 支持知识库简介,用于Agent选择 2. UI对应知识库简介 提示词选择 1. UI 和模板支持提示词模板更换选择 --- configs/kb_config.py.example | 21 +- configs/prompt_config.py.example | 178 ++++++----- .../samples/vector_store/index.faiss | Bin 221229 -> 0 bytes knowledge_base/samples/vector_store/index.pkl | Bin 46892 -> 0 bytes requirements.txt | 4 +- server/agent/__init__.py | 4 + server/agent/callbacks.py | 22 +- server/agent/custom_template.py | 8 +- server/agent/model_contain.py | 8 + server/agent/search_knowledge.py | 37 --- server/agent/tools/__init__.py | 11 + server/agent/{math.py => tools/calculate.py} | 12 +- .../agent/tools/search_all_knowledge_more.py | 296 ++++++++++++++++++ .../agent/tools/search_all_knowledge_once.py | 234 ++++++++++++++ server/agent/{ => tools}/search_internet.py | 26 +- server/agent/tools/search_knowledge_simple.py | 38 +++ server/agent/{ => tools}/shell.py | 0 server/agent/{ => tools}/translator.py | 17 +- server/agent/{ => tools}/weather.py | 21 +- server/agent/{tools.py => tools_select.py} | 23 +- server/api.py | 7 +- server/chat/agent_chat.py | 97 +++--- server/chat/chat.py | 7 +- server/chat/knowledge_base_chat.py | 11 +- server/chat/search_engine_chat.py | 7 +- server/db/models/knowledge_base_model.py | 3 +- .../repository/knowledge_base_repository.py | 8 +- server/knowledge_base/kb_doc_api.py | 14 + server/knowledge_base/kb_service/base.py | 17 +- .../kb_service/zilliz_kb_service.py | 98 ++++++ server/knowledge_base/migrate.py | 3 +- server/llm_api.py | 1 - server/utils.py | 8 +- tests/api/test_kb_api.py | 8 + webui_pages/dialogue/dialogue.py | 70 +++-- webui_pages/knowledge_base/knowledge_base.py | 17 +- webui_pages/utils.py | 27 +- 37 files changed, 1070 insertions(+), 293 deletions(-) delete mode 100644 knowledge_base/samples/vector_store/index.faiss delete mode 100644 knowledge_base/samples/vector_store/index.pkl create mode 100644 server/agent/__init__.py create mode 100644 server/agent/model_contain.py delete mode 100644 server/agent/search_knowledge.py create mode 100644 server/agent/tools/__init__.py rename server/agent/{math.py => tools/calculate.py} (84%) create mode 100644 server/agent/tools/search_all_knowledge_more.py create mode 100644 server/agent/tools/search_all_knowledge_once.py rename server/agent/{ => tools}/search_internet.py (54%) create mode 100644 server/agent/tools/search_knowledge_simple.py rename server/agent/{ => tools}/shell.py (100%) rename server/agent/{ => tools}/translator.py (71%) rename server/agent/{ => tools}/weather.py (96%) rename server/agent/{tools.py => tools_select.py} (56%) create mode 100644 server/knowledge_base/kb_service/zilliz_kb_service.py diff --git a/configs/kb_config.py.example b/configs/kb_config.py.example index af68a74d..a857e80b 100644 --- a/configs/kb_config.py.example +++ b/configs/kb_config.py.example @@ -1,7 +1,7 @@ import os -# 默认向量库类型。可选:faiss, milvus, pg. +# 默认向量库类型。可选:faiss, milvus(离线) & zilliz(在线), pg. DEFAULT_VS_TYPE = "faiss" # 缓存向量库数量(针对FAISS) @@ -42,13 +42,17 @@ BING_SUBSCRIPTION_KEY = "" ZH_TITLE_ENHANCE = False -# 通常情况下不需要更改以下内容 +# 每个知识库的初始化介绍,用于在初始化知识库时显示和Agent调用,没写则没有介绍,不会被Agent调用。 +KB_INFO = { + "知识库名称": "知识库介绍", + "samples": "关于本项目issue的解答", +} +# 通常情况下不需要更改以下内容 # 知识库默认存储路径 KB_ROOT_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "knowledge_base") if not os.path.exists(KB_ROOT_PATH): os.mkdir(KB_ROOT_PATH) - # 数据库默认存储路径。 # 如果使用sqlite,可以直接修改DB_ROOT_PATH;如果使用其它数据库,请直接修改SQLALCHEMY_DATABASE_URI。 DB_ROOT_PATH = os.path.join(KB_ROOT_PATH, "info.db") @@ -65,6 +69,13 @@ kbs_config = { "password": "", "secure": False, }, + "zilliz": { + "host": "in01-a7ce524e41e3935.ali-cn-hangzhou.vectordb.zilliz.com.cn", + "port": "19530", + "user": "", + "password": "", + "secure": True, + }, "pg": { "connection_uri": "postgresql://postgres:postgres@127.0.0.1:5432/langchain_chatchat", } @@ -74,11 +85,11 @@ kbs_config = { text_splitter_dict = { "ChineseRecursiveTextSplitter": { "source": "huggingface", ## 选择tiktoken则使用openai的方法 - "tokenizer_name_or_path": "gpt2", + "tokenizer_name_or_path": "", }, "SpacyTextSplitter": { "source": "huggingface", - "tokenizer_name_or_path": "", + "tokenizer_name_or_path": "gpt2", }, "RecursiveCharacterTextSplitter": { "source": "tiktoken", diff --git a/configs/prompt_config.py.example b/configs/prompt_config.py.example index 6446ce2e..a52b1f70 100644 --- a/configs/prompt_config.py.example +++ b/configs/prompt_config.py.example @@ -9,98 +9,106 @@ # - context: 从检索结果拼接的知识文本 # - question: 用户提出的问题 +# Agent对话支持的变量: -PROMPT_TEMPLATES = { - # LLM对话模板 - "llm_chat": "{{ input }}", +# - tools: 可用的工具列表 +# - tool_names: 可用的工具名称列表 +# - history: 用户和Agent的对话历史 +# - input: 用户输入内容 +# - agent_scratchpad: Agent的思维记录 - # 基于本地知识问答的提示词模板 - "knowledge_base_chat": +PROMPT_TEMPLATES = {} + +PROMPT_TEMPLATES["llm_chat"] = { + "default": "{{ input }}", + + "py": """ - <指令>根据已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,不允许在答案中添加编造成分,答案请使用中文。 - <已知信息>{{ context }}、 - <问题>{{ question }}""", - - # 基于agent的提示词模板 - "agent_chat": + 你是一个聪明的代码助手,请你给我写出简单的py代码。 \n + {{ input }} """ - Answer the following questions as best you can. You have access to the following tools: - - {tools} - Use the following format: - - Question: the input question you must answer - Thought: you should always think about what to do - Action: the action to take, should be one of [{tool_names}] - Action Input: the input to the action - Observation: the result of the action - ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) - Thought: I now know the final answer - Final Answer: the final answer to the original input question - - Begin! - - history: - {history} - - Question: {input} - Thought: {agent_scratchpad} -""" + , } +PROMPT_TEMPLATES["knowledge_base_chat"] = { + "default": + """ + <指令>根据已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,不允许在答案中添加编造成分,答案请使用中文。 + <已知信息>{{ context }}、 + <问题>{{ question }} + """, + "text": + """ + <指令>根据已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,答案请使用中文。 + <已知信息>{{ context }}、 + <问题>{{ question }} + """, +} +PROMPT_TEMPLATES["search_engine_chat"] = { + "default": + """ + <指令>这是我搜索到的互联网信息,请你根据这些信息进行提取并有调理,简洁的回答问题。如果无法从中得到答案,请说 “无法搜索到能回答问题的内容”。 + <已知信息>{{ context }}、 + <问题>{{ question }} + """, -## GPT或Qwen 的Prompt -# """ -# Answer the following questions as best you can. You have access to the following tools: -# -# {tools} -# -# Please note that the "知识库查询工具" is information about the "西交利物浦大学" ,and if a question is asked about it, you must answer with the knowledge base -# -# Use the following format: -# -# Question: the input question you must answer -# Thought: you should always think about what to do -# Action: the action to take, should be one of [{tool_names}] -# Action Input: the input to the action -# Observation: the result of the action -# ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) -# Thought: I now know the final answer -# Final Answer: the final answer to the original input question -# -# Begin! -# -# history: -# {history} -# -# Question: {input} -# Thought: {agent_scratchpad} -# """ + "search": + """ + <指令>根据已知信息,简洁和专业的来回答问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题”,答案请使用中文。 + <已知信息>{{ context }}、 + <问题>{{ question }} + """, +} +PROMPT_TEMPLATES["agent_chat"] = { + "default": + """ + Answer the following questions as best you can. If it is in order, you can use some tools appropriately.You have access to the following tools: + + {tools} + + Please note that the "知识库查询工具" is information about the "西交利物浦大学" ,and if a question is asked about it, you must answer with the knowledge base, + Please note that the "天气查询工具" can only be used once since Question begin. + + Use the following format: + Question: the input question you must answer1 + Thought: you should always think about what to do and what tools to use. + Action: the action to take, should be one of [{tool_names}] + Action Input: the input to the action + Observation: the result of the action + ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) + Thought: I now know the final answer + Final Answer: the final answer to the original input question -## ChatGLM-Pro的Prompt + Begin! + history: + {history} + Question: {input} + Thought: {agent_scratchpad} + """, + "ChatGLM": + """ + 请请严格按照提供的思维方式来思考。你的知识不一定正确,所以你一定要用提供的工具来思考,并给出用户答案。 + 你有以下工具可以使用: + {tools} + ``` + Question: 用户的提问或者观察到的信息, + Thought: 你应该思考该做什么,是根据工具的结果来回答问题,还是决定使用什么工具。 + Action: 需要使用的工具,应该是在[{tool_names}]中的一个。 + Action Input: 传入工具的内容 + Observation: 工具给出的答案(不是你生成的) + ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) + Thought: 通过工具给出的答案,你是否能回答Question。 + Final Answer是你的答案 -# """ -# 请请严格按照提供的思维方式来思考。你的知识不一定正确,所以你一定要用提供的工具来思考,并给出用户答案。 -# 你有以下工具可以使用: -# {tools} -# ``` -# Question: 用户的提问或者观察到的信息, -# Thought: 你应该思考该做什么,是根据工具的结果来回答问题,还是决定使用什么工具。 -# Action: 需要使用的工具,应该是在[{tool_names}]中的一个。 -# Action Input: 传入工具的内容 -# Observation: 工具给出的答案(不是你生成的) -# ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) -# Thought: 通过工具给出的答案,你是否能回答Question。 -# Final Answer是你的答案 -# -# 现在,我们开始! -# 你和用户的历史记录: -# History: -# {history} -# -# 用户开始以提问: -# Question: {input} -# Thought: {agent_scratchpad} -# -# """ + 现在,我们开始! + 你和用户的历史记录: + History: + {history} + + 用户开始以提问: + Question: {input} + Thought: {agent_scratchpad} + + """, +} diff --git a/knowledge_base/samples/vector_store/index.faiss b/knowledge_base/samples/vector_store/index.faiss deleted file mode 100644 index 2404c993346b1fe675f82d1470321dc0ff1e811f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221229 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≥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.0.314 +langchain-experimental>=0.0.30 fschat[model_worker]==0.2.30 openai sentence_transformers diff --git a/server/agent/__init__.py b/server/agent/__init__.py new file mode 100644 index 00000000..0de21612 --- /dev/null +++ b/server/agent/__init__.py @@ -0,0 +1,4 @@ +from .model_contain import * +from .callbacks import * +from .custom_template import * +from .tools import * \ No newline at end of file diff --git a/server/agent/callbacks.py b/server/agent/callbacks.py index 3d143605..3a82b9c7 100644 --- a/server/agent/callbacks.py +++ b/server/agent/callbacks.py @@ -29,6 +29,7 @@ class CustomAsyncIteratorCallbackHandler(AsyncIteratorCallbackHandler): self.queue = asyncio.Queue() self.done = asyncio.Event() self.cur_tool = {} + self.out = True async def on_tool_start(self, serialized: Dict[str, Any], input_str: str, *, run_id: UUID, parent_run_id: UUID | None = None, tags: List[str] | None = None, @@ -57,6 +58,7 @@ class CustomAsyncIteratorCallbackHandler(AsyncIteratorCallbackHandler): async def on_tool_end(self, output: str, *, run_id: UUID, parent_run_id: UUID | None = None, tags: List[str] | None = None, **kwargs: Any) -> None: + self.out = True ## 重置输出 self.cur_tool.update( status=Status.tool_finish, output_str=output.replace("Answer:", ""), @@ -72,7 +74,17 @@ class CustomAsyncIteratorCallbackHandler(AsyncIteratorCallbackHandler): self.queue.put_nowait(dumps(self.cur_tool)) async def on_llm_new_token(self, token: str, **kwargs: Any) -> None: - if token: + if "Action" in token: ## 减少重复输出 + before_action = token.split("Action")[0] + self.cur_tool.update( + status=Status.running, + llm_token=before_action + "\n", + ) + self.queue.put_nowait(dumps(self.cur_tool)) + + self.out = False + + if token and self.out: self.cur_tool.update( status=Status.running, llm_token=token, @@ -86,6 +98,14 @@ class CustomAsyncIteratorCallbackHandler(AsyncIteratorCallbackHandler): ) self.queue.put_nowait(dumps(self.cur_tool)) + async def on_chat_model_start(self,serialized: Dict[str, Any], **kwargs: Any, + ) -> None: + self.cur_tool.update( + status=Status.start, + llm_token="", + ) + self.queue.put_nowait(dumps(self.cur_tool)) + async def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: self.cur_tool.update( status=Status.complete, diff --git a/server/agent/custom_template.py b/server/agent/custom_template.py index aaa2bfe4..22469c6b 100644 --- a/server/agent/custom_template.py +++ b/server/agent/custom_template.py @@ -1,11 +1,9 @@ from __future__ import annotations from langchain.agents import Tool, AgentOutputParser from langchain.prompts import StringPromptTemplate -from typing import List, Union, Tuple, Dict +from typing import List from langchain.schema import AgentAction, AgentFinish -import re -from configs.model_config import LLM_MODEL, TEMPERATURE, HISTORY_LEN - +from server.agent import model_container begin = False class CustomPromptTemplate(StringPromptTemplate): # The template to use @@ -41,7 +39,7 @@ class CustomOutputParser(AgentOutputParser): def parse(self, llm_output: str) -> AgentFinish | tuple[dict[str, str], str] | AgentAction: # Check if agent should finish support_agent = ["gpt","Qwen","qwen-api","baichuan-api"] - if not any(agent in LLM_MODEL for agent in support_agent) and self.begin: + if not any(agent in model_container.MODEL for agent in support_agent) and self.begin: self.begin = False stop_words = ["Observation:"] min_index = len(llm_output) diff --git a/server/agent/model_contain.py b/server/agent/model_contain.py new file mode 100644 index 00000000..1927c88f --- /dev/null +++ b/server/agent/model_contain.py @@ -0,0 +1,8 @@ + +## 由于工具类无法传参,所以使用全局变量来传递模型和对应的知识库介绍 +class ModelContainer: + def __init__(self): + self.MODEL = None + self.DATABASE = None + +model_container = ModelContainer() diff --git a/server/agent/search_knowledge.py b/server/agent/search_knowledge.py deleted file mode 100644 index bdf7f4c0..00000000 --- a/server/agent/search_knowledge.py +++ /dev/null @@ -1,37 +0,0 @@ -## 单独运行的时候需要添加 -import sys -import os -import json - -sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) -from server.chat.knowledge_base_chat import knowledge_base_chat -from configs import LLM_MODEL, TEMPERATURE, VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD - -import asyncio - - -async def search_knowledge_base_iter(query: str): - response = await knowledge_base_chat(query=query, - knowledge_base_name="tcqa", - model_name=LLM_MODEL, - temperature=TEMPERATURE, - history=[], - top_k = VECTOR_SEARCH_TOP_K, - prompt_name = "knowledge_base_chat", - score_threshold = SCORE_THRESHOLD, - stream=False) - - contents = "" - async for data in response.body_iterator: # 这里的data是一个json字符串 - data = json.loads(data) - contents = data["answer"] - docs = data["docs"] - return contents - -def search_knowledge(query: str): - return asyncio.run(search_knowledge_base_iter(query)) - - -if __name__ == "__main__": - result = search_knowledge("大数据男女比例") - print("答案:",result) diff --git a/server/agent/tools/__init__.py b/server/agent/tools/__init__.py new file mode 100644 index 00000000..8bb5cac6 --- /dev/null +++ b/server/agent/tools/__init__.py @@ -0,0 +1,11 @@ +## 导入所有的工具类 +from .search_knowledge_simple import knowledge_search_simple +from .search_all_knowledge_once import knowledge_search_once +from .search_all_knowledge_more import knowledge_search_more +from .travel_assistant import travel_assistant +from .calculate import calculate +from .translator import translate +from .weather import weathercheck +from .shell import shell +from .search_internet import search_internet + diff --git a/server/agent/math.py b/server/agent/tools/calculate.py similarity index 84% rename from server/agent/math.py rename to server/agent/tools/calculate.py index b4056d07..2d963ae8 100644 --- a/server/agent/math.py +++ b/server/agent/tools/calculate.py @@ -1,12 +1,12 @@ ## 单独运行的时候需要添加 import sys import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) from langchain.prompts import PromptTemplate from langchain.chains import LLMMathChain -from server.utils import get_ChatOpenAI -from configs.model_config import LLM_MODEL, TEMPERATURE +from server.agent import model_container + _PROMPT_TEMPLATE = """ 将数学问题翻译成可以使用Python的numexpr库执行的表达式。使用运行此代码的输出来回答问题。 问题: ${{包含数学问题的问题。}} @@ -63,11 +63,7 @@ PROMPT = PromptTemplate( def calculate(query: str): - model = get_ChatOpenAI( - streaming=False, - model_name=LLM_MODEL, - temperature=TEMPERATURE, - ) + model = model_container.MODEL llm_math = LLMMathChain.from_llm(model, verbose=True, prompt=PROMPT) ans = llm_math.run(query) return ans diff --git a/server/agent/tools/search_all_knowledge_more.py b/server/agent/tools/search_all_knowledge_more.py new file mode 100644 index 00000000..fe70171c --- /dev/null +++ b/server/agent/tools/search_all_knowledge_more.py @@ -0,0 +1,296 @@ +## 单独运行的时候需要添加 +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) + +import json +import re +import warnings +from typing import Dict +from langchain.callbacks.manager import AsyncCallbackManagerForChainRun, CallbackManagerForChainRun +from langchain.chains.llm import LLMChain +from langchain.pydantic_v1 import Extra, root_validator +from langchain.schema import BasePromptTemplate +from langchain.schema.language_model import BaseLanguageModel +from typing import List, Any, Optional +from langchain.prompts import PromptTemplate +from server.chat.knowledge_base_chat import knowledge_base_chat +from configs import VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD +import asyncio +from server.agent import model_container + + +async def search_knowledge_base_iter(database: str, query: str) -> str: + response = await knowledge_base_chat(query=query, + knowledge_base_name=database, + model_name=model_container.MODEL.model_name, + temperature=0.01, + history=[], + top_k=VECTOR_SEARCH_TOP_K, + max_tokens=None, + prompt_name="default", + score_threshold=SCORE_THRESHOLD, + stream=False) + + contents = "" + async for data in response.body_iterator: # 这里的data是一个json字符串 + data = json.loads(data) + contents += data["answer"] + docs = data["docs"] + return contents + + +async def search_knowledge_multiple(queries) -> List[str]: + # queries 应该是一个包含多个 (database, query) 元组的列表 + tasks = [search_knowledge_base_iter(database, query) for database, query in queries] + results = await asyncio.gather(*tasks) + # 结合每个查询结果,并在每个查询结果前添加一个自定义的消息 + combined_results = [] + for (database, _), result in zip(queries, results): + message = f"\n查询到 {database} 知识库的相关信息:\n{result}" + combined_results.append(message) + + return combined_results + + +def search_knowledge(queries) -> str: + responses = asyncio.run(search_knowledge_multiple(queries)) + # 输出每个整合的查询结果 + contents = "" + for response in responses: + contents += response + "\n\n" + return contents + + +_PROMPT_TEMPLATE = """ +用户会提出一个需要你查询知识库的问题,你应该对问题进行理解和拆解,并在知识库中查询相关的内容。 + +对于每个知识库,你输出的内容应该是一个一行的字符串,这行字符串包含知识库名称和查询内容,中间用逗号隔开,不要有多余的文字和符号。你可以同时查询多个知识库,下面这个例子就是同时查询两个知识库的内容。 + +例子: + +robotic,机器人男女比例是多少 +bigdata,大数据的就业情况如何 + + +这些数据库是你能访问的,冒号之前是他们的名字,冒号之后是他们的功能,你应该参考他们的功能来帮助你思考 + +{database_names} + +你的回答格式应该按照下面的内容,请注意```text 等标记都必须输出,这是我用来提取答案的标记。 + + +Question: ${{用户的问题}} + +```text +${{知识库名称,查询问题,不要带有任何除了,之外的符号}} + +```output +数据库查询的结果 + + + +这是一个完整的问题拆分和提问的例子: + + +问题: 分别对比机器人和大数据专业的就业情况并告诉我哪儿专业的就业情况更好? + +```text +robotic,机器人专业的就业情况 +bigdata,大数据专业的就业情况 + + + +现在,我们开始作答 +问题: {question} +""" + +PROMPT = PromptTemplate( + input_variables=["question", "database_names"], + template=_PROMPT_TEMPLATE, +) + + +class LLMKnowledgeChain(LLMChain): + llm_chain: LLMChain + llm: Optional[BaseLanguageModel] = None + """[Deprecated] LLM wrapper to use.""" + prompt: BasePromptTemplate = PROMPT + """[Deprecated] Prompt to use to translate to python if necessary.""" + database_names: Dict[str, str] = None + input_key: str = "question" #: :meta private: + output_key: str = "answer" #: :meta private: + + class Config: + """Configuration for this pydantic object.""" + + extra = Extra.forbid + arbitrary_types_allowed = True + + @root_validator(pre=True) + def raise_deprecation(cls, values: Dict) -> Dict: + if "llm" in values: + warnings.warn( + "Directly instantiating an LLMKnowledgeChain with an llm is deprecated. " + "Please instantiate with llm_chain argument or using the from_llm " + "class method." + ) + if "llm_chain" not in values and values["llm"] is not None: + prompt = values.get("prompt", PROMPT) + values["llm_chain"] = LLMChain(llm=values["llm"], prompt=prompt) + return values + + @property + def input_keys(self) -> List[str]: + """Expect input key. + + :meta private: + """ + return [self.input_key] + + @property + def output_keys(self) -> List[str]: + """Expect output key. + + :meta private: + """ + return [self.output_key] + + def _evaluate_expression(self, queries) -> str: + try: + output = search_knowledge(queries) + except Exception as e: + output = "输入的信息有误或不存在知识库,错误信息如下:\n" + return output + str(e) + return output + + def _process_llm_result( + self, + llm_output: str, + run_manager: CallbackManagerForChainRun + ) -> Dict[str, str]: + + run_manager.on_text(llm_output, color="green", verbose=self.verbose) + + llm_output = llm_output.strip() + # text_match = re.search(r"^```text(.*?)```", llm_output, re.DOTALL) + text_match = re.search(r"```text(.*)", llm_output, re.DOTALL) + if text_match: + expression = text_match.group(1).strip() + cleaned_input_str = (expression.replace("\"", "").replace("“", ""). + replace("”", "").replace("```", "").strip()) + lines = cleaned_input_str.split("\n") + # 使用逗号分割每一行,然后形成一个(数据库,查询)元组的列表 + + queries = [(line.split(",")[0].strip(), line.split(",")[1].strip()) for line in lines] + run_manager.on_text("知识库查询询内容:\n\n" + str(queries) + " \n\n", color="blue", verbose=self.verbose) + output = self._evaluate_expression(queries) + run_manager.on_text("\nAnswer: ", verbose=self.verbose) + run_manager.on_text(output, color="yellow", verbose=self.verbose) + answer = "Answer: " + output + elif llm_output.startswith("Answer:"): + answer = llm_output + elif "Answer:" in llm_output: + answer = llm_output.split("Answer:")[-1] + else: + return {self.output_key: f"输入的格式不对:\n {llm_output}"} + return {self.output_key: answer} + + async def _aprocess_llm_result( + self, + llm_output: str, + run_manager: AsyncCallbackManagerForChainRun, + ) -> Dict[str, str]: + await run_manager.on_text(llm_output, color="green", verbose=self.verbose) + llm_output = llm_output.strip() + text_match = re.search(r"```text(.*)", llm_output, re.DOTALL) + if text_match: + + expression = text_match.group(1).strip() + cleaned_input_str = ( + expression.replace("\"", "").replace("“", "").replace("”", "").replace("```", "").strip()) + lines = cleaned_input_str.split("\n") + queries = [(line.split(",")[0].strip(), line.split(",")[1].strip()) for line in lines] + await run_manager.on_text("知识库查询询内容:\n\n" + str(queries) + " \n\n", color="blue", + verbose=self.verbose) + + output = self._evaluate_expression(queries) + await run_manager.on_text("\nAnswer: ", verbose=self.verbose) + await run_manager.on_text(output, color="yellow", verbose=self.verbose) + answer = "Answer: " + output + elif llm_output.startswith("Answer:"): + answer = llm_output + elif "Answer:" in llm_output: + answer = "Answer: " + llm_output.split("Answer:")[-1] + else: + raise ValueError(f"unknown format from LLM: {llm_output}") + return {self.output_key: answer} + + def _call( + self, + inputs: Dict[str, str], + run_manager: Optional[CallbackManagerForChainRun] = None, + ) -> Dict[str, str]: + _run_manager = run_manager or CallbackManagerForChainRun.get_noop_manager() + _run_manager.on_text(inputs[self.input_key]) + self.database_names = model_container.DATABASE + data_formatted_str = ',\n'.join([f' "{k}":"{v}"' for k, v in self.database_names.items()]) + llm_output = self.llm_chain.predict( + database_names=data_formatted_str, + question=inputs[self.input_key], + stop=["```output"], + callbacks=_run_manager.get_child(), + ) + return self._process_llm_result(llm_output, _run_manager) + + async def _acall( + self, + inputs: Dict[str, str], + run_manager: Optional[AsyncCallbackManagerForChainRun] = None, + ) -> Dict[str, str]: + _run_manager = run_manager or AsyncCallbackManagerForChainRun.get_noop_manager() + await _run_manager.on_text(inputs[self.input_key]) + self.database_names = model_container.DATABASE + data_formatted_str = ',\n'.join([f' "{k}":"{v}"' for k, v in self.database_names.items()]) + llm_output = await self.llm_chain.apredict( + database_names=data_formatted_str, + question=inputs[self.input_key], + stop=["```output"], + callbacks=_run_manager.get_child(), + ) + return await self._aprocess_llm_result(llm_output, inputs[self.input_key], _run_manager) + + @property + def _chain_type(self) -> str: + return "llm_knowledge_chain" + + @classmethod + def from_llm( + cls, + llm: BaseLanguageModel, + prompt: BasePromptTemplate = PROMPT, + **kwargs: Any, + ): + llm_chain = LLMChain(llm=llm, prompt=prompt) + return cls(llm_chain=llm_chain, **kwargs) + + +def knowledge_search_more(query: str): + model = model_container.MODEL + llm_knowledge = LLMKnowledgeChain.from_llm(model, verbose=True, prompt=PROMPT) + ans = llm_knowledge.run(query) + return ans + + +if __name__ == "__main__": + result = knowledge_search_more("机器人和大数据在代码教学上有什么区别") + print(result) + +# 这是一个正常的切割 +# queries = [ +# ("bigdata", "大数据专业的男女比例"), +# ("robotic", "机器人专业的优势") +# ] +# result = search_knowledge(queries) +# print(result) diff --git a/server/agent/tools/search_all_knowledge_once.py b/server/agent/tools/search_all_knowledge_once.py new file mode 100644 index 00000000..7a10536f --- /dev/null +++ b/server/agent/tools/search_all_knowledge_once.py @@ -0,0 +1,234 @@ +## 单独运行的时候需要添加 +# import sys +# import os +# sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) + +import re +import warnings +from typing import Dict + +from langchain.callbacks.manager import ( + AsyncCallbackManagerForChainRun, + CallbackManagerForChainRun, +) +from langchain.chains.llm import LLMChain +from langchain.pydantic_v1 import Extra, root_validator +from langchain.schema import BasePromptTemplate +from langchain.schema.language_model import BaseLanguageModel +from typing import List, Any, Optional +from langchain.prompts import PromptTemplate +import sys +import os +import json + +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +from server.chat.knowledge_base_chat import knowledge_base_chat +from configs import VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD + +import asyncio +from server.agent import model_container + + +async def search_knowledge_base_iter(database: str, query: str): + response = await knowledge_base_chat(query=query, + knowledge_base_name=database, + model_name=model_container.MODEL.model_name, + temperature=0.01, + history=[], + top_k=VECTOR_SEARCH_TOP_K, + max_tokens=None, + prompt_name="knowledge_base_chat", + score_threshold=SCORE_THRESHOLD, + stream=False) + + contents = "" + async for data in response.body_iterator: # 这里的data是一个json字符串 + data = json.loads(data) + contents += data["answer"] + docs = data["docs"] + return contents + + +_PROMPT_TEMPLATE = """ +用户会提出一个需要你查询知识库的问题,你应该按照我提供的思想进行思考 +Question: ${{用户的问题}} +这些数据库是你能访问的,冒号之前是他们的名字,冒号之后是他们的功能: + +{database_names} + +你的回答格式应该按照下面的内容,请注意,格式内的```text 等标记都必须输出,这是我用来提取答案的标记。 +```text +${{知识库的名称}} +``` +```output +数据库查询的结果 +``` +答案: ${{答案}} + +现在,这是我的问题: +问题: {question} + +""" +PROMPT = PromptTemplate( + input_variables=["question", "database_names"], + template=_PROMPT_TEMPLATE, +) + + +class LLMKnowledgeChain(LLMChain): + llm_chain: LLMChain + llm: Optional[BaseLanguageModel] = None + """[Deprecated] LLM wrapper to use.""" + prompt: BasePromptTemplate = PROMPT + """[Deprecated] Prompt to use to translate to python if necessary.""" + database_names: Dict[str, str] = model_container.DATABASE + input_key: str = "question" #: :meta private: + output_key: str = "answer" #: :meta private: + + class Config: + """Configuration for this pydantic object.""" + + extra = Extra.forbid + arbitrary_types_allowed = True + + @root_validator(pre=True) + def raise_deprecation(cls, values: Dict) -> Dict: + if "llm" in values: + warnings.warn( + "Directly instantiating an LLMKnowledgeChain with an llm is deprecated. " + "Please instantiate with llm_chain argument or using the from_llm " + "class method." + ) + if "llm_chain" not in values and values["llm"] is not None: + prompt = values.get("prompt", PROMPT) + values["llm_chain"] = LLMChain(llm=values["llm"], prompt=prompt) + return values + + @property + def input_keys(self) -> List[str]: + """Expect input key. + + :meta private: + """ + return [self.input_key] + + @property + def output_keys(self) -> List[str]: + """Expect output key. + + :meta private: + """ + return [self.output_key] + + def _evaluate_expression(self, dataset, query) -> str: + try: + output = asyncio.run(search_knowledge_base_iter(dataset, query)) + except Exception as e: + output = "输入的信息有误或不存在知识库" + return output + return output + + def _process_llm_result( + self, + llm_output: str, + llm_input: str, + run_manager: CallbackManagerForChainRun + ) -> Dict[str, str]: + + run_manager.on_text(llm_output, color="green", verbose=self.verbose) + + llm_output = llm_output.strip() + text_match = re.search(r"^```text(.*?)```", llm_output, re.DOTALL) + if text_match: + database = text_match.group(1).strip() + output = self._evaluate_expression(database, llm_input) + run_manager.on_text("\nAnswer: ", verbose=self.verbose) + run_manager.on_text(output, color="yellow", verbose=self.verbose) + answer = "Answer: " + output + elif llm_output.startswith("Answer:"): + answer = llm_output + elif "Answer:" in llm_output: + answer = "Answer: " + llm_output.split("Answer:")[-1] + else: + return {self.output_key: f"输入的格式不对: {llm_output}"} + return {self.output_key: answer} + + async def _aprocess_llm_result( + self, + llm_output: str, + run_manager: AsyncCallbackManagerForChainRun, + ) -> Dict[str, str]: + await run_manager.on_text(llm_output, color="green", verbose=self.verbose) + llm_output = llm_output.strip() + text_match = re.search(r"^```text(.*?)```", llm_output, re.DOTALL) + if text_match: + expression = text_match.group(1) + output = self._evaluate_expression(expression) + await run_manager.on_text("\nAnswer: ", verbose=self.verbose) + await run_manager.on_text(output, color="yellow", verbose=self.verbose) + answer = "Answer: " + output + elif llm_output.startswith("Answer:"): + answer = llm_output + elif "Answer:" in llm_output: + answer = "Answer: " + llm_output.split("Answer:")[-1] + else: + raise ValueError(f"unknown format from LLM: {llm_output}") + return {self.output_key: answer} + + def _call( + self, + inputs: Dict[str, str], + run_manager: Optional[CallbackManagerForChainRun] = None, + ) -> Dict[str, str]: + _run_manager = run_manager or CallbackManagerForChainRun.get_noop_manager() + _run_manager.on_text(inputs[self.input_key]) + data_formatted_str = ',\n'.join([f' "{k}":"{v}"' for k, v in self.database_names.items()]) + llm_output = self.llm_chain.predict( + database_names=data_formatted_str, + question=inputs[self.input_key], + stop=["```output"], + callbacks=_run_manager.get_child(), + ) + return self._process_llm_result(llm_output, inputs[self.input_key], _run_manager) + + async def _acall( + self, + inputs: Dict[str, str], + run_manager: Optional[AsyncCallbackManagerForChainRun] = None, + ) -> Dict[str, str]: + _run_manager = run_manager or AsyncCallbackManagerForChainRun.get_noop_manager() + await _run_manager.on_text(inputs[self.input_key]) + data_formatted_str = ',\n'.join([f' "{k}":"{v}"' for k, v in self.database_names.items()]) + llm_output = await self.llm_chain.apredict( + database_names=data_formatted_str, + question=inputs[self.input_key], + stop=["```output"], + callbacks=_run_manager.get_child(), + ) + return await self._aprocess_llm_result(llm_output, inputs[self.input_key], _run_manager) + + @property + def _chain_type(self) -> str: + return "llm_knowledge_chain" + + @classmethod + def from_llm( + cls, + llm: BaseLanguageModel, + prompt: BasePromptTemplate = PROMPT, + **kwargs: Any, + ): + llm_chain = LLMChain(llm=llm, prompt=prompt) + return cls(llm_chain=llm_chain, **kwargs) + + +def knowledge_search_once(query: str): + model = model_container.MODEL + llm_knowledge = LLMKnowledgeChain.from_llm(model, verbose=True, prompt=PROMPT) + ans = llm_knowledge.run(query) + return ans + + +if __name__ == "__main__": + result = knowledge_search_once("大数据的男女比例") + print(result) diff --git a/server/agent/search_internet.py b/server/agent/tools/search_internet.py similarity index 54% rename from server/agent/search_internet.py rename to server/agent/tools/search_internet.py index 1ed39faf..6eec93e5 100644 --- a/server/agent/search_internet.py +++ b/server/agent/tools/search_internet.py @@ -1,35 +1,39 @@ ## 单独运行的时候需要添加 -import sys -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +# import sys +# import os +# sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) + import json from server.chat import search_engine_chat -from configs import LLM_MODEL, TEMPERATURE, VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD - +from configs import VECTOR_SEARCH_TOP_K import asyncio - +from server.agent import model_container async def search_engine_iter(query: str): response = await search_engine_chat(query=query, - search_engine_name="bing", - model_name=LLM_MODEL, - temperature=TEMPERATURE, + search_engine_name="bing", # 这里切换搜索引擎 + model_name=model_container.MODEL.model_name, + temperature=0.01, # Agent 搜索互联网的时候,温度设置为0.01 history=[], top_k = VECTOR_SEARCH_TOP_K, - prompt_name = "knowledge_base_chat", + max_tokens= None, # Agent 搜索互联网的时候,max_tokens设置为None + prompt_name = "default", stream=False) contents = "" + async for data in response.body_iterator: # 这里的data是一个json字符串 data = json.loads(data) contents = data["answer"] docs = data["docs"] + return contents def search_internet(query: str): + return asyncio.run(search_engine_iter(query)) if __name__ == "__main__": - result = search_internet("大数据男女比例") + result = search_internet("今天星期几") print("答案:",result) diff --git a/server/agent/tools/search_knowledge_simple.py b/server/agent/tools/search_knowledge_simple.py new file mode 100644 index 00000000..03f4da10 --- /dev/null +++ b/server/agent/tools/search_knowledge_simple.py @@ -0,0 +1,38 @@ +## 最简单的版本,只支持固定的知识库 + +# ## 单独运行的时候需要添加 +# import sys +# import os +# sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) + +from server.chat.knowledge_base_chat import knowledge_base_chat +from configs import VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD +import json +import asyncio +from server.agent import model_container + +async def search_knowledge_base_iter(database: str, query: str) -> str: + response = await knowledge_base_chat(query=query, + knowledge_base_name=database, + model_name=model_container.MODEL.model_name, + temperature=0.01, + history=[], + top_k=VECTOR_SEARCH_TOP_K, + prompt_name="knowledge_base_chat", + score_threshold=SCORE_THRESHOLD, + stream=False) + + contents = "" + async for data in response.body_iterator: # 这里的data是一个json字符串 + data = json.loads(data) + contents = data["answer"] + docs = data["docs"] + return contents + +def knowledge_search_simple(query: str): + return asyncio.run(search_knowledge_base_iter(query)) + + +if __name__ == "__main__": + result = knowledge_search_simple("大数据男女比例") + print("答案:",result) \ No newline at end of file diff --git a/server/agent/shell.py b/server/agent/tools/shell.py similarity index 100% rename from server/agent/shell.py rename to server/agent/tools/shell.py diff --git a/server/agent/translator.py b/server/agent/tools/translator.py similarity index 71% rename from server/agent/translator.py rename to server/agent/tools/translator.py index 96b4c8f8..62ffa33b 100644 --- a/server/agent/translator.py +++ b/server/agent/tools/translator.py @@ -1,12 +1,11 @@ ## 单独运行的时候需要添加 -import sys -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) +# import sys +# import os +# sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) + from langchain.prompts import PromptTemplate from langchain.chains import LLMChain -from server.utils import get_ChatOpenAI -from langchain.chains.llm_math.prompt import PROMPT -from configs.model_config import LLM_MODEL,TEMPERATURE +from server.agent import model_container _PROMPT_TEMPLATE = ''' # 指令 @@ -30,11 +29,7 @@ PROMPT = PromptTemplate( def translate(query: str): - model = get_ChatOpenAI( - streaming=False, - model_name=LLM_MODEL, - temperature=TEMPERATURE, - ) + model = model_container.MODEL llm_translate = LLMChain(llm=model, prompt=PROMPT) ans = llm_translate.run(query) return ans diff --git a/server/agent/weather.py b/server/agent/tools/weather.py similarity index 96% rename from server/agent/weather.py rename to server/agent/tools/weather.py index ad06d28c..d0dd58dc 100644 --- a/server/agent/weather.py +++ b/server/agent/tools/weather.py @@ -1,6 +1,5 @@ ## 使用和风天气API查询天气,这个模型仅仅对免费的API进行了适配 ## 这个模型的提示词非常复杂,我们推荐使用GPT4模型进行运行 - from __future__ import annotations ## 单独运行的时候需要添加 @@ -8,10 +7,6 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) - -from server.utils import get_ChatOpenAI - - import re import warnings from typing import Dict @@ -27,10 +22,9 @@ from langchain.schema import BasePromptTemplate from langchain.schema.language_model import BaseLanguageModel import requests from typing import List, Any, Optional -from configs.model_config import LLM_MODEL, TEMPERATURE from datetime import datetime from langchain.prompts import PromptTemplate - +from server.agent import model_container ## 使用和风天气API查询天气 KEY = "ac880e5a877042809ac7ffdd19d95b0d" @@ -237,9 +231,6 @@ class LLMWeatherChain(Chain): output = weather(expression) except Exception as e: output = "输入的信息有误,请再次尝试" - return {self.output_key: output} - raise ValueError(f"错误: {expression},输入的信息不对") - return output def _process_llm_result( @@ -262,7 +253,6 @@ class LLMWeatherChain(Chain): answer = "Answer: " + llm_output.split("Answer:")[-1] else: return {self.output_key: f"输入的格式不对: {llm_output},应该输入 (市 区)的组合"} - # raise ValueError(f"unknown format from LLM: {llm_output}") return {self.output_key: answer} async def _aprocess_llm_result( @@ -273,6 +263,7 @@ class LLMWeatherChain(Chain): await run_manager.on_text(llm_output, color="green", verbose=self.verbose) llm_output = llm_output.strip() text_match = re.search(r"^```text(.*?)```", llm_output, re.DOTALL) + if text_match: expression = text_match.group(1) output = self._evaluate_expression(expression) @@ -332,14 +323,10 @@ class LLMWeatherChain(Chain): def weathercheck(query: str): - model = get_ChatOpenAI( - streaming=False, - model_name=LLM_MODEL, - temperature=TEMPERATURE, - ) + model = model_container.MODEL llm_weather = LLMWeatherChain.from_llm(model, verbose=True, prompt=PROMPT) ans = llm_weather.run(query) return ans if __name__ == '__main__': - result = weathercheck("苏州工姑苏区今晚热不热?") \ No newline at end of file + result = weathercheck("苏州姑苏区今晚热不热?") \ No newline at end of file diff --git a/server/agent/tools.py b/server/agent/tools_select.py similarity index 56% rename from server/agent/tools.py rename to server/agent/tools_select.py index 0f94529f..40bb63fc 100644 --- a/server/agent/tools.py +++ b/server/agent/tools_select.py @@ -1,16 +1,5 @@ -import sys -import os - -sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) - -from server.agent.math import calculate -from server.agent.translator import translate -from server.agent.weather import weathercheck -from server.agent.shell import shell -from langchain.agents import Tool -from server.agent.search_knowledge import search_knowledge -from server.agent.search_internet import search_internet - +from langchain.tools import Tool +from server.agent.tools import * tools = [ Tool.from_function( func=calculate, @@ -25,7 +14,7 @@ tools = [ Tool.from_function( func=weathercheck, name="天气查询工具", - description="如果你无法访问互联网,并需要查询中国各地未来24小时的天气,你应该使用这个工具,每轮对话仅能使用一次", + description="无需访问互联网,使用这个工具查询中国各地未来24小时的天气", ), Tool.from_function( func=shell, @@ -33,15 +22,15 @@ tools = [ description="使用命令行工具输出", ), Tool.from_function( - func=search_knowledge, + func=knowledge_search_more, name="知识库查询工具", - description="访问知识库来获取答案", + description="优先访问知识库来获取答案", ), Tool.from_function( func=search_internet, name="互联网查询工具", description="如果你无法访问互联网,这个工具可以帮助你访问Bing互联网来解答问题", ), - ] + tool_names = [tool.name for tool in tools] diff --git a/server/api.py b/server/api.py index 0b0692a0..370f7edf 100644 --- a/server/api.py +++ b/server/api.py @@ -16,7 +16,7 @@ from server.chat import (chat, knowledge_base_chat, openai_chat, from server.knowledge_base.kb_api import list_kbs, create_kb, delete_kb from server.knowledge_base.kb_doc_api import (list_files, upload_docs, delete_docs, update_docs, download_doc, recreate_vector_store, - search_docs, DocumentWithScore) + search_docs, DocumentWithScore, update_info) from server.llm_api import (list_running_models, list_config_models, change_llm_model, stop_llm_model, get_model_config, list_search_engines) @@ -115,6 +115,11 @@ def create_app(): summary="删除知识库内指定文件" )(delete_docs) + app.post("/knowledge_base/update_info", + tags=["Knowledge Base Management"], + response_model=BaseResponse, + summary="更新知识库介绍" + )(update_info) app.post("/knowledge_base/update_docs", tags=["Knowledge Base Management"], response_model=BaseResponse, diff --git a/server/chat/agent_chat.py b/server/chat/agent_chat.py index 1f518025..c78add68 100644 --- a/server/chat/agent_chat.py +++ b/server/chat/agent_chat.py @@ -1,33 +1,34 @@ from langchain.memory import ConversationBufferWindowMemory -from server.agent.tools import tools, tool_names -from server.agent.callbacks import CustomAsyncIteratorCallbackHandler, Status, dumps +from server.agent.tools_select import tools, tool_names +from server.agent.callbacks import CustomAsyncIteratorCallbackHandler, Status from langchain.agents import AgentExecutor, LLMSingleActionAgent from server.agent.custom_template import CustomOutputParser, CustomPromptTemplate from fastapi import Body from fastapi.responses import StreamingResponse -from configs.model_config import LLM_MODEL, TEMPERATURE, HISTORY_LEN +from configs import LLM_MODEL, TEMPERATURE, HISTORY_LEN from server.utils import wrap_done, get_ChatOpenAI, get_prompt_template from langchain.chains import LLMChain -from typing import AsyncIterable, Optional +from typing import AsyncIterable, Optional, Dict import asyncio from typing import List from server.chat.utils import History import json - +from server.agent import model_container +from server.knowledge_base.kb_service.base import get_kb_details async def agent_chat(query: str = Body(..., description="用户输入", examples=["恼羞成怒"]), history: List[History] = Body([], description="历史对话", examples=[[ - {"role": "user", "content": "我们来玩成语接龙,我先来,生龙活虎"}, - {"role": "assistant", "content": "虎头虎脑"}]] + {"role": "user", "content": "请使用知识库工具查询今天北京天气"}, + {"role": "assistant", "content": "使用天气查询工具查询到今天北京多云,10-14摄氏度,东北风2级,易感冒"}]] ), stream: bool = Body(False, description="流式输出"), model_name: str = Body(LLM_MODEL, description="LLM 模型名称。"), temperature: float = Body(TEMPERATURE, description="LLM 采样温度", ge=0.0, le=1.0), - max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 - prompt_name: str = Body("agent_chat", - description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), + max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), + # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 + prompt_name: str = Body("default",description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), # top_p: float = Body(TOP_P, description="LLM 核采样。勿与temperature同时设置", gt=0.0, lt=1.0), ): history = [History.from_data(h) for h in history] @@ -43,19 +44,26 @@ async def agent_chat(query: str = Body(..., description="用户输入", examples model_name=model_name, temperature=temperature, max_tokens=max_tokens, + callbacks=[callback], ) - prompt_template = CustomPromptTemplate( - template=get_prompt_template(prompt_name), + ## 传入全局变量来实现agent调用 + kb_list = {x["kb_name"]: x for x in get_kb_details()} + model_container.DATABASE = {name: details['kb_info'] for name, details in kb_list.items()} + model_container.MODEL = model + + prompt_template = get_prompt_template("agent_chat", prompt_name) + prompt_template_agent = CustomPromptTemplate( + template=prompt_template, tools=tools, input_variables=["input", "intermediate_steps", "history"] ) output_parser = CustomOutputParser() - llm_chain = LLMChain(llm=model, prompt=prompt_template) + llm_chain = LLMChain(llm=model, prompt=prompt_template_agent) agent = LLMSingleActionAgent( llm_chain=llm_chain, output_parser=output_parser, - stop=["\nObservation:", "Observation:", "<|im_end|>"], # Qwen模型中使用这个 + stop=["\nObservation:", "Observation:", "<|im_end|>"], # Qwen模型中使用这个 allowed_tools=tool_names, ) # 把history转成agent的memory @@ -73,15 +81,15 @@ async def agent_chat(query: str = Body(..., description="用户输入", examples verbose=True, memory=memory, ) - input_msg = History(role="user", content="{{ input }}").to_msg_template(False) while True: try: task = asyncio.create_task(wrap_done( - agent_executor.acall(query, callbacks=[callback], include_run_info=True), - callback.done)) + agent_executor.acall(query, callbacks=[callback], include_run_info=True), + callback.done)) break except: pass + if stream: async for chunk in callback.aiter(): tools_use = [] @@ -89,46 +97,55 @@ async def agent_chat(query: str = Body(..., description="用户输入", examples data = json.loads(chunk) if data["status"] == Status.start or data["status"] == Status.complete: continue - if data["status"] == Status.error: + elif data["status"] == Status.error: + tools_use.append("\n```\n") tools_use.append("工具名称: " + data["tool_name"]) tools_use.append("工具状态: " + "调用失败") tools_use.append("错误信息: " + data["error"]) tools_use.append("重新开始尝试") tools_use.append("\n```\n") yield json.dumps({"tools": tools_use}, ensure_ascii=False) - if data["status"] == Status.agent_action: - yield json.dumps({"answer": "\n\n```\n\n"}, ensure_ascii=False) - if data["status"] == Status.tool_finish: + elif data["status"] == Status.tool_finish: + tools_use.append("\n```\n") tools_use.append("工具名称: " + data["tool_name"]) tools_use.append("工具状态: " + "调用成功") tools_use.append("工具输入: " + data["input_str"]) tools_use.append("工具输出: " + data["output_str"]) tools_use.append("\n```\n") yield json.dumps({"tools": tools_use}, ensure_ascii=False) - if data["status"] == Status.agent_finish: + elif data["status"] == Status.agent_finish: yield json.dumps({"final_answer": data["final_answer"]}, ensure_ascii=False) else: yield json.dumps({"answer": data["llm_token"]}, ensure_ascii=False) - else: - pass - # agent必须要steram=True,这部分暂时没有完成 - # result = [] - # async for chunk in callback.aiter(): - # data = json.loads(chunk) - # status = data["status"] - # if status == Status.start: - # result.append(chunk) - # elif status == Status.running: - # result[-1]["llm_token"] += chunk["llm_token"] - # elif status == Status.complete: - # result[-1]["status"] = Status.complete - # elif status == Status.agent_finish: - # result.append(chunk) - # elif status == Status.agent_finish: - # pass - # yield dumps(result) + else: + answer = "" + final_answer = "" + async for chunk in callback.aiter(): + # Use server-sent-events to stream the response + data = json.loads(chunk) + if data["status"] == Status.start or data["status"] == Status.complete: + continue + if data["status"] == Status.error: + answer += "\n```\n" + answer += "工具名称: " + data["tool_name"] + "\n" + answer += "工具状态: " + "调用失败" + "\n" + answer += "错误信息: " + data["error"] + "\n" + answer += "\n```\n" + if data["status"] == Status.tool_finish: + answer += "\n```\n" + answer += "工具名称: " + data["tool_name"] + "\n" + answer += "工具状态: " + "调用成功" + "\n" + answer += "工具输入: " + data["input_str"] + "\n" + answer += "工具输出: " + data["output_str"] + "\n" + answer += "\n```\n" + if data["status"] == Status.agent_finish: + final_answer = data["final_answer"] + else: + answer += data["llm_token"] + + yield json.dumps({"answer": answer, "final_answer": final_answer}, ensure_ascii=False) await task return StreamingResponse(agent_chat_iterator(query=query, diff --git a/server/chat/chat.py b/server/chat/chat.py index 2f37f99b..3ec68558 100644 --- a/server/chat/chat.py +++ b/server/chat/chat.py @@ -22,9 +22,10 @@ async def chat(query: str = Body(..., description="用户输入", examples=["恼 stream: bool = Body(False, description="流式输出"), model_name: str = Body(LLM_MODEL, description="LLM 模型名称。"), temperature: float = Body(TEMPERATURE, description="LLM 采样温度", ge=0.0, le=1.0), - max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 + max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), + # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 # top_p: float = Body(TOP_P, description="LLM 核采样。勿与temperature同时设置", gt=0.0, lt=1.0), - prompt_name: str = Body("llm_chat", description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), + prompt_name: str = Body("default", description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), ): history = [History.from_data(h) for h in history] @@ -41,7 +42,7 @@ async def chat(query: str = Body(..., description="用户输入", examples=["恼 callbacks=[callback], ) - prompt_template = get_prompt_template(prompt_name) + prompt_template = get_prompt_template("llm_chat", prompt_name) input_msg = History(role="user", content=prompt_template).to_msg_template(False) chat_prompt = ChatPromptTemplate.from_messages( [i.to_msg_template() for i in history] + [input_msg]) diff --git a/server/chat/knowledge_base_chat.py b/server/chat/knowledge_base_chat.py index 6ae90e29..c39b147e 100644 --- a/server/chat/knowledge_base_chat.py +++ b/server/chat/knowledge_base_chat.py @@ -31,9 +31,9 @@ async def knowledge_base_chat(query: str = Body(..., description="用户输入", stream: bool = Body(False, description="流式输出"), model_name: str = Body(LLM_MODEL, description="LLM 模型名称。"), temperature: float = Body(TEMPERATURE, description="LLM 采样温度", ge=0.0, le=1.0), - max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 - prompt_name: str = Body("knowledge_base_chat", description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), - request: Request = None, + max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), + # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 + prompt_name: str = Body("default", description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), ): kb = KBServiceFactory.get_service_by_name(knowledge_base_name) if kb is None: @@ -57,7 +57,7 @@ async def knowledge_base_chat(query: str = Body(..., description="用户输入", docs = search_docs(query, knowledge_base_name, top_k, score_threshold) context = "\n".join([doc.page_content for doc in docs]) - prompt_template = get_prompt_template(prompt_name) + prompt_template = get_prompt_template("knowledge_base_chat", prompt_name) input_msg = History(role="user", content=prompt_template).to_msg_template(False) chat_prompt = ChatPromptTemplate.from_messages( [i.to_msg_template() for i in history] + [input_msg]) @@ -74,10 +74,9 @@ async def knowledge_base_chat(query: str = Body(..., description="用户输入", for inum, doc in enumerate(docs): filename = os.path.split(doc.metadata["source"])[-1] parameters = urlencode({"knowledge_base_name": knowledge_base_name, "file_name":filename}) - url = f"{request.base_url}knowledge_base/download_doc?" + parameters + url = f"/knowledge_base/download_doc?" + parameters text = f"""出处 [{inum + 1}] [{filename}]({url}) \n\n{doc.page_content}\n\n""" source_documents.append(text) - if stream: async for token in callback.aiter(): # Use server-sent-events to stream the response diff --git a/server/chat/search_engine_chat.py b/server/chat/search_engine_chat.py index 930c9bdd..83ed65e4 100644 --- a/server/chat/search_engine_chat.py +++ b/server/chat/search_engine_chat.py @@ -72,8 +72,9 @@ async def search_engine_chat(query: str = Body(..., description="用户输入", stream: bool = Body(False, description="流式输出"), model_name: str = Body(LLM_MODEL, description="LLM 模型名称。"), temperature: float = Body(TEMPERATURE, description="LLM 采样温度", ge=0.0, le=1.0), - max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 - prompt_name: str = Body("knowledge_base_chat", description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), + max_tokens: int = Body(1024, description="限制LLM生成Token数量,当前默认为1024"), + # TODO: fastchat更新后默认值设为None,自动使用LLM支持的最大值。 + prompt_name: str = Body("default",description="使用的prompt模板名称(在configs/prompt_config.py中配置)"), ): if search_engine_name not in SEARCH_ENGINES.keys(): return BaseResponse(code=404, msg=f"未支持搜索引擎 {search_engine_name}") @@ -101,7 +102,7 @@ async def search_engine_chat(query: str = Body(..., description="用户输入", docs = await lookup_search_engine(query, search_engine_name, top_k) context = "\n".join([doc.page_content for doc in docs]) - prompt_template = get_prompt_template(prompt_name) + prompt_template = get_prompt_template("search_engine_chat", prompt_name) input_msg = History(role="user", content=prompt_template).to_msg_template(False) chat_prompt = ChatPromptTemplate.from_messages( [i.to_msg_template() for i in history] + [input_msg]) diff --git a/server/db/models/knowledge_base_model.py b/server/db/models/knowledge_base_model.py index 478bc1f3..f9035af4 100644 --- a/server/db/models/knowledge_base_model.py +++ b/server/db/models/knowledge_base_model.py @@ -10,10 +10,11 @@ class KnowledgeBaseModel(Base): __tablename__ = 'knowledge_base' id = Column(Integer, primary_key=True, autoincrement=True, comment='知识库ID') kb_name = Column(String(50), comment='知识库名称') + kb_info = Column(String(200), comment='知识库简介(用于Agent)') vs_type = Column(String(50), comment='向量库类型') embed_model = Column(String(50), comment='嵌入模型名称') file_count = Column(Integer, default=0, comment='文件数量') create_time = Column(DateTime, default=func.now(), comment='创建时间') def __repr__(self): - return f"" + return f"" diff --git a/server/db/repository/knowledge_base_repository.py b/server/db/repository/knowledge_base_repository.py index 585fd9b3..d20a973d 100644 --- a/server/db/repository/knowledge_base_repository.py +++ b/server/db/repository/knowledge_base_repository.py @@ -3,13 +3,14 @@ from server.db.session import with_session @with_session -def add_kb_to_db(session, kb_name, vs_type, embed_model): +def add_kb_to_db(session, kb_name, kb_info, vs_type, embed_model): # 创建知识库实例 kb = session.query(KnowledgeBaseModel).filter_by(kb_name=kb_name).first() if not kb: - kb = KnowledgeBaseModel(kb_name=kb_name, vs_type=vs_type, embed_model=embed_model) + kb = KnowledgeBaseModel(kb_name=kb_name, kb_info=kb_info, vs_type=vs_type, embed_model=embed_model) session.add(kb) - else: # update kb with new vs_type and embed_model + else: # update kb with new vs_type and embed_model + kb.kb_info = kb_info kb.vs_type = vs_type kb.embed_model = embed_model return True @@ -53,6 +54,7 @@ def get_kb_detail(session, kb_name: str) -> dict: if kb: return { "kb_name": kb.kb_name, + "kb_info": kb.kb_info, "vs_type": kb.vs_type, "embed_model": kb.embed_model, "file_count": kb.file_count, diff --git a/server/knowledge_base/kb_doc_api.py b/server/knowledge_base/kb_doc_api.py index e158ad06..3d01f9e2 100644 --- a/server/knowledge_base/kb_doc_api.py +++ b/server/knowledge_base/kb_doc_api.py @@ -203,6 +203,20 @@ def delete_docs(knowledge_base_name: str = Body(..., examples=["samples"]), return BaseResponse(code=200, msg=f"文件删除完成", data={"failed_files": failed_files}) +def update_info(knowledge_base_name: str = Body(..., description="知识库名称", examples=["samples"]), + kb_info:str = Body(..., description="知识库介绍", examples=["这是一个知识库"]), + ): + if not validate_kb_name(knowledge_base_name): + return BaseResponse(code=403, msg="Don't attack me") + + kb = KBServiceFactory.get_service_by_name(knowledge_base_name) + if kb is None: + return BaseResponse(code=404, msg=f"未找到知识库 {knowledge_base_name}") + kb.update_info(kb_info) + + return BaseResponse(code=200, msg=f"知识库介绍修改完成", data={"kb_info": kb_info}) + + def update_docs( knowledge_base_name: str = Body(..., description="知识库名称", examples=["samples"]), file_names: List[str] = Body(..., description="文件名称,支持多文件", examples=[["file_name1", "text.txt"]]), diff --git a/server/knowledge_base/kb_service/base.py b/server/knowledge_base/kb_service/base.py index a725a78e..701f0cdb 100644 --- a/server/knowledge_base/kb_service/base.py +++ b/server/knowledge_base/kb_service/base.py @@ -19,7 +19,7 @@ from server.db.repository.knowledge_file_repository import ( ) from configs import (kbs_config, VECTOR_SEARCH_TOP_K, SCORE_THRESHOLD, - EMBEDDING_MODEL) + EMBEDDING_MODEL, KB_INFO) from server.knowledge_base.utils import ( get_kb_path, get_doc_path, load_embeddings, KnowledgeFile, list_kbs_from_folder, list_files_from_folder, @@ -42,11 +42,11 @@ class KBService(ABC): embed_model: str = EMBEDDING_MODEL, ): self.kb_name = knowledge_base_name + self.kb_info = KB_INFO.get(knowledge_base_name, f"关于{knowledge_base_name}的知识库") self.embed_model = embed_model self.kb_path = get_kb_path(self.kb_name) self.doc_path = get_doc_path(self.kb_name) self.do_init() - def _load_embeddings(self, embed_device: str = embedding_device()) -> Embeddings: return load_embeddings(self.embed_model, embed_device) @@ -63,7 +63,7 @@ class KBService(ABC): if not os.path.exists(self.doc_path): os.makedirs(self.doc_path) self.do_create_kb() - status = add_kb_to_db(self.kb_name, self.vs_type(), self.embed_model) + status = add_kb_to_db(self.kb_name, self.kb_info, self.vs_type(), self.embed_model) return status def clear_vs(self): @@ -116,6 +116,14 @@ class KBService(ABC): os.remove(kb_file.filepath) return status + def update_info(self, kb_info: str): + """ + 更新知识库介绍 + """ + self.kb_info = kb_info + status = add_kb_to_db(self.kb_name, self.kb_info, self.vs_type(), self.embed_model) + return status + def update_doc(self, kb_file: KnowledgeFile, docs: List[Document] = [], **kwargs): """ 使用content中的文件更新向量库 @@ -127,7 +135,7 @@ class KBService(ABC): def exist_doc(self, file_name: str): return file_exists_in_db(KnowledgeFile(knowledge_base_name=self.kb_name, - filename=file_name)) + filename=file_name)) def list_files(self): return list_files_from_db(self.kb_name) @@ -271,6 +279,7 @@ def get_kb_details() -> List[Dict]: result[kb] = { "kb_name": kb, "vs_type": "", + "kb_info": "", "embed_model": "", "file_count": 0, "create_time": None, diff --git a/server/knowledge_base/kb_service/zilliz_kb_service.py b/server/knowledge_base/kb_service/zilliz_kb_service.py new file mode 100644 index 00000000..679e7d9b --- /dev/null +++ b/server/knowledge_base/kb_service/zilliz_kb_service.py @@ -0,0 +1,98 @@ +from typing import List, Dict, Optional +from langchain.embeddings.base import Embeddings +from langchain.schema import Document +from langchain.vectorstores import Zilliz +from configs import kbs_config +from server.knowledge_base.kb_service.base import KBService, SupportedVSType, EmbeddingsFunAdapter, \ + score_threshold_process +from server.knowledge_base.utils import KnowledgeFile + + +class ZillizKBService(KBService): + zilliz: Zilliz + + @staticmethod + def get_collection(zilliz_name): + from pymilvus import Collection + return Collection(zilliz_name) + + # def save_vector_store(self): + # if self.zilliz.col: + # self.zilliz.col.flush() + + def get_doc_by_id(self, id: str) -> Optional[Document]: + if self.zilliz.col: + data_list = self.zilliz.col.query(expr=f'pk == {id}', output_fields=["*"]) + if len(data_list) > 0: + data = data_list[0] + text = data.pop("text") + return Document(page_content=text, metadata=data) + + @staticmethod + def search(zilliz_name, content, limit=3): + search_params = { + "metric_type": "IP", + "params": {}, + } + c = ZillizKBService.get_collection(zilliz_name) + return c.search(content, "embeddings", search_params, limit=limit, output_fields=["content"]) + + def do_create_kb(self): + pass + + def vs_type(self) -> str: + return SupportedVSType.ZILLIZ + + def _load_zilliz(self, embeddings: Embeddings = None): + if embeddings is None: + embeddings = self._load_embeddings() + zilliz_args = kbs_config.get("zilliz") + self.zilliz = Zilliz(embedding_function=EmbeddingsFunAdapter(embeddings), + collection_name=self.kb_name, connection_args=zilliz_args) + + + def do_init(self): + self._load_zilliz() + + def do_drop_kb(self): + if self.zilliz.col: + self.zilliz.col.release() + self.zilliz.col.drop() + + def do_search(self, query: str, top_k: int, score_threshold: float, embeddings: Embeddings): + self._load_zilliz(embeddings=EmbeddingsFunAdapter(embeddings)) + return score_threshold_process(score_threshold, top_k, self.zilliz.similarity_search_with_score(query, top_k)) + + def do_add_doc(self, docs: List[Document], **kwargs) -> List[Dict]: + for doc in docs: + for k, v in doc.metadata.items(): + doc.metadata[k] = str(v) + for field in self.zilliz.fields: + doc.metadata.setdefault(field, "") + doc.metadata.pop(self.zilliz._text_field, None) + doc.metadata.pop(self.zilliz._vector_field, None) + + ids = self.zilliz.add_documents(docs) + doc_infos = [{"id": id, "metadata": doc.metadata} for id, doc in zip(ids, docs)] + return doc_infos + + def do_delete_doc(self, kb_file: KnowledgeFile, **kwargs): + if self.zilliz.col: + filepath = kb_file.filepath.replace('\\', '\\\\') + delete_list = [item.get("pk") for item in + self.zilliz.col.query(expr=f'source == "{filepath}"', output_fields=["pk"])] + self.zilliz.col.delete(expr=f'pk in {delete_list}') + + def do_clear_vs(self): + if self.zilliz.col: + self.do_drop_kb() + self.do_init() + + +if __name__ == '__main__': + + from server.db.base import Base, engine + + Base.metadata.create_all(bind=engine) + zillizService = ZillizKBService("test") + diff --git a/server/knowledge_base/migrate.py b/server/knowledge_base/migrate.py index 499e915d..517ed406 100644 --- a/server/knowledge_base/migrate.py +++ b/server/knowledge_base/migrate.py @@ -37,9 +37,10 @@ def folder2db( kb_names: List[str], mode: Literal["recreate_vs", "update_in_db", "increament"], vs_type: Literal["faiss", "milvus", "pg", "chromadb"] = DEFAULT_VS_TYPE, + kb_info: dict[str, Any] = {}, embed_model: str = EMBEDDING_MODEL, chunk_size: int = CHUNK_SIZE, - chunk_overlap: int = CHUNK_SIZE, + chunk_overlap: int = OVERLAP_SIZE, zh_title_enhance: bool = ZH_TITLE_ENHANCE, ): ''' diff --git a/server/llm_api.py b/server/llm_api.py index 2b1ce456..dc9ddced 100644 --- a/server/llm_api.py +++ b/server/llm_api.py @@ -32,7 +32,6 @@ def list_config_models() -> BaseResponse: 从本地获取configs中配置的模型列表 ''' configs = list_config_llm_models() - # 删除ONLINE_MODEL配置中的敏感信息 for config in configs["online"].values(): del_keys = set(["worker_class"]) diff --git a/server/utils.py b/server/utils.py index f62cccfe..2f6dfc49 100644 --- a/server/utils.py +++ b/server/utils.py @@ -389,15 +389,16 @@ def webui_address() -> str: return f"http://{host}:{port}" -def get_prompt_template(name: str) -> Optional[str]: +def get_prompt_template(type:str,name: str) -> Optional[str]: ''' 从prompt_config中加载模板内容 + type: "llm_chat","agent_chat","knowledge_base_chat","search_engine_chat"的其中一种,如果有新功能,应该进行加入。 ''' + from configs import prompt_config import importlib importlib.reload(prompt_config) # TODO: 检查configs/prompt_config.py文件有修改再重新加载 - - return prompt_config.PROMPT_TEMPLATES.get(name) + return prompt_config.PROMPT_TEMPLATES[type].get(name) def set_httpx_config( @@ -409,6 +410,7 @@ def set_httpx_config( 将本项目相关服务加入无代理列表,避免fastchat的服务器请求错误。(windows下无效) 对于chatgpt等在线API,如要使用代理需要手动配置。搜索引擎的代理如何处置还需考虑。 ''' + import httpx import os diff --git a/tests/api/test_kb_api.py b/tests/api/test_kb_api.py index 975f8bcc..82ef3a10 100644 --- a/tests/api/test_kb_api.py +++ b/tests/api/test_kb_api.py @@ -137,6 +137,14 @@ def test_search_docs(api="/knowledge_base/search_docs"): assert isinstance(data, list) and len(data) == VECTOR_SEARCH_TOP_K +def test_update_info(api="/knowledge_base/update_info"): + url = api_base_url + api + print("\n更新知识库介绍") + r = requests.post(url, json={"knowledge_base_name": "samples", "kb_info": "你好"}) + data = r.json() + pprint(data) + assert data["code"] == 200 + def test_update_docs(api="/knowledge_base/update_docs"): url = api_base_url + api diff --git a/webui_pages/dialogue/dialogue.py b/webui_pages/dialogue/dialogue.py index deadc32d..adc60293 100644 --- a/webui_pages/dialogue/dialogue.py +++ b/webui_pages/dialogue/dialogue.py @@ -3,10 +3,9 @@ from webui_pages.utils import * from streamlit_chatbox import * from datetime import datetime import os -from configs import LLM_MODEL, TEMPERATURE, HISTORY_LEN +from configs import LLM_MODEL, TEMPERATURE, HISTORY_LEN, PROMPT_TEMPLATES from typing import List, Dict - chat_box = ChatBox( assistant_avatar=os.path.join( "img", @@ -47,11 +46,11 @@ def get_default_llm_model(api: ApiRequest) -> (str, bool): if LLM_MODEL in running_models: return LLM_MODEL, True - + local_models = [k for k, v in running_models.items() if not v.get("online_api")] if local_models: return local_models[0], True - + return running_models[0], False @@ -94,15 +93,14 @@ def dialogue_page(api: ApiRequest): running_models = list(api.list_running_models()) available_models = [] config_models = api.list_config_models() - worker_models = list(config_models.get("worker", {})) # 仅列出在FSCHAT_MODEL_WORKERS中配置的模型 + worker_models = list(config_models.get("worker", {})) # 仅列出在FSCHAT_MODEL_WORKERS中配置的模型 for m in worker_models: if m not in running_models and m != "default": available_models.append(m) - for k, v in config_models.get("online", {}).items(): # 列出ONLINE_MODELS中直接访问的模型(如GPT) + for k, v in config_models.get("online", {}).items(): # 列出ONLINE_MODELS中直接访问的模型(如GPT) if not v.get("provider") and k not in running_models: print(k, v) available_models.append(k) - llm_models = running_models + available_models index = llm_models.index(st.session_state.get("cur_llm_model", get_default_llm_model(api)[0])) llm_model = st.selectbox("选择LLM模型:", @@ -124,11 +122,33 @@ def dialogue_page(api: ApiRequest): st.success(msg) st.session_state["prev_llm_model"] = llm_model + index_prompt = { + "LLM 对话": "llm_chat", + "自定义Agent问答": "agent_chat", + "搜索引擎问答": "search_engine_chat", + "知识库问答": "knowledge_base_chat", + } + prompt_templates_kb_list = list(PROMPT_TEMPLATES[index_prompt[dialogue_mode]].keys()) + prompt_template_name = prompt_templates_kb_list[0] + if "prompt_template_select" not in st.session_state: + st.session_state.prompt_template_select = prompt_templates_kb_list[0] + + def prompt_change(): + text = f"已切换为 {prompt_template_name} 模板。" + st.toast(text) + + prompt_template_select = st.selectbox( + "请选择Prompt模板:", + prompt_templates_kb_list, + index=0, + on_change=prompt_change, + key="prompt_template_select", + ) + prompt_template_name = st.session_state.prompt_template_select + temperature = st.slider("Temperature:", 0.0, 1.0, TEMPERATURE, 0.05) history_len = st.number_input("历史对话轮数:", 0, 20, HISTORY_LEN) - LLM_MODEL_WEBUI = llm_model - TEMPERATURE_WEBUI = temperature def on_kb_change(): st.toast(f"已加载知识库: {st.session_state.selected_kb}") @@ -144,8 +164,7 @@ def dialogue_page(api: ApiRequest): ) kb_top_k = st.number_input("匹配知识条数:", 1, 20, VECTOR_SEARCH_TOP_K) score_threshold = st.slider("知识匹配分数阈值:", 0.0, 1.0, float(SCORE_THRESHOLD), 0.01) - # chunk_content = st.checkbox("关联上下文", False, disabled=True) - # chunk_size = st.slider("关联长度:", 0, 500, 250, disabled=True) + elif dialogue_mode == "搜索引擎问答": search_engine_list = api.list_search_engines() with st.expander("搜索引擎配置", True): @@ -168,7 +187,11 @@ def dialogue_page(api: ApiRequest): if dialogue_mode == "LLM 对话": chat_box.ai_say("正在思考...") text = "" - r = api.chat_chat(prompt, history=history, model=llm_model, temperature=temperature) + r = api.chat_chat(prompt, + history=history, + model=llm_model, + prompt_name=prompt_template_name, + temperature=temperature) for t in r: if error_msg := check_error_msg(t): # check whether error occured st.error(error_msg) @@ -178,37 +201,38 @@ def dialogue_page(api: ApiRequest): chat_box.update_msg(text, streaming=False) # 更新最终的字符串,去除光标 + elif dialogue_mode == "自定义Agent问答": chat_box.ai_say([ f"正在思考...", Markdown("...", in_expander=True, title="思考过程", state="complete"), + ]) text = "" ans = "" - support_agent = ["gpt", "Qwen", "qwen-api", "baichuan-api"] # 目前支持agent的模型 + support_agent = ["gpt", "Qwen", "qwen-api", "baichuan-api"] # 目前支持agent的模型 if not any(agent in llm_model for agent in support_agent): ans += "正在思考... \n\n 该模型并没有进行Agent对齐,无法正常使用Agent功能!\n\n\n请更换 GPT4或Qwen-14B等支持Agent的模型获得更好的体验! \n\n\n" chat_box.update_msg(ans, element_index=0, streaming=False) - - for d in api.agent_chat(prompt, history=history, model=llm_model, - temperature=temperature): + prompt_name=prompt_template_name, + temperature=temperature, + ): try: d = json.loads(d) except: pass if error_msg := check_error_msg(d): # check whether error occured st.error(error_msg) - - elif chunk := d.get("final_answer"): - ans += chunk - chat_box.update_msg(ans, element_index=0) - elif chunk := d.get("answer"): + if chunk := d.get("answer"): text += chunk chat_box.update_msg(text, element_index=1) - elif chunk := d.get("tools"): + if chunk := d.get("final_answer"): + ans += chunk + chat_box.update_msg(ans, element_index=0) + if chunk := d.get("tools"): text += "\n\n".join(d.get("tools", [])) chat_box.update_msg(text, element_index=1) chat_box.update_msg(ans, element_index=0, streaming=False) @@ -225,6 +249,7 @@ def dialogue_page(api: ApiRequest): score_threshold=score_threshold, history=history, model=llm_model, + prompt_name=prompt_template_name, temperature=temperature): if error_msg := check_error_msg(d): # check whether error occured st.error(error_msg) @@ -244,6 +269,7 @@ def dialogue_page(api: ApiRequest): top_k=se_top_k, history=history, model=llm_model, + prompt_name=prompt_template_name, temperature=temperature): if error_msg := check_error_msg(d): # check whether error occured st.error(error_msg) diff --git a/webui_pages/knowledge_base/knowledge_base.py b/webui_pages/knowledge_base/knowledge_base.py index bf8f0894..95a1fcab 100644 --- a/webui_pages/knowledge_base/knowledge_base.py +++ b/webui_pages/knowledge_base/knowledge_base.py @@ -63,6 +63,9 @@ def knowledge_base_page(api: ApiRequest): else: selected_kb_index = 0 + if "selected_kb_info" not in st.session_state: + st.session_state["selected_kb_info"] = "" + def format_selected_kb(kb_name: str) -> str: if kb := kb_list.get(kb_name): return f"{kb_name} ({kb['vs_type']} @ {kb['embed_model']})" @@ -84,6 +87,11 @@ def knowledge_base_page(api: ApiRequest): placeholder="新知识库名称,不支持中文命名", key="kb_name", ) + kb_info = st.text_input( + "知识库简介", + placeholder="知识库简介,方便Agent查找", + key="kb_info", + ) cols = st.columns(2) @@ -123,18 +131,23 @@ def knowledge_base_page(api: ApiRequest): ) st.toast(ret.get("msg", " ")) st.session_state["selected_kb_name"] = kb_name + st.session_state["selected_kb_info"] = kb_info st.experimental_rerun() elif selected_kb: kb = selected_kb - - + st.session_state["selected_kb_info"] = kb_list[kb]['kb_info'] # 上传文件 files = st.file_uploader("上传知识文件:", [i for ls in LOADER_DICT.values() for i in ls], accept_multiple_files=True, ) + kb_info = st.text_area("请输入知识库介绍:", value=st.session_state["selected_kb_info"], max_chars=None, key=None, + help=None, on_change=None, args=None, kwargs=None) + if kb_info != st.session_state["selected_kb_info"]: + st.session_state["selected_kb_info"] = kb_info + api.update_kb_info(kb, kb_info) # with st.sidebar: with st.expander( diff --git a/webui_pages/utils.py b/webui_pages/utils.py index 3e077667..7b9e161c 100644 --- a/webui_pages/utils.py +++ b/webui_pages/utils.py @@ -279,7 +279,7 @@ class ApiRequest: model: str = LLM_MODEL, temperature: float = TEMPERATURE, max_tokens: int = 1024, - prompt_name: str = "llm_chat", + prompt_name: str = "default", **kwargs, ): ''' @@ -309,6 +309,7 @@ class ApiRequest: model: str = LLM_MODEL, temperature: float = TEMPERATURE, max_tokens: int = 1024, + prompt_name: str = "default", ): ''' 对应api.py/chat/agent_chat 接口 @@ -320,6 +321,7 @@ class ApiRequest: "model_name": model, "temperature": temperature, "max_tokens": max_tokens, + "prompt_name": prompt_name, } print(f"received input message:") @@ -339,7 +341,7 @@ class ApiRequest: model: str = LLM_MODEL, temperature: float = TEMPERATURE, max_tokens: int = 1024, - prompt_name: str = "knowledge_base_chat", + prompt_name: str = "default", ): ''' 对应api.py/chat/knowledge_base_chat接口 @@ -377,7 +379,7 @@ class ApiRequest: model: str = LLM_MODEL, temperature: float = TEMPERATURE, max_tokens: int = 1024, - prompt_name: str = "knowledge_base_chat", + prompt_name: str = "default", ): ''' 对应api.py/chat/search_engine_chat接口 @@ -558,6 +560,22 @@ class ApiRequest: ) return self._get_response_value(response, as_json=True) + + def update_kb_info(self,knowledge_base_name,kb_info): + ''' + 对应api.py/knowledge_base/update_info接口 + ''' + data = { + "knowledge_base_name": knowledge_base_name, + "kb_info": kb_info, + } + + response = self.post( + "/knowledge_base/update_info", + json=data, + ) + return self._get_response_value(response, as_json=True) + def update_kb_docs( self, knowledge_base_name: str, @@ -652,7 +670,7 @@ class ApiRequest: def get_model_config( self, - model_name: str, + model_name: str = None, ) -> Dict: ''' 获取服务器上模型配置 @@ -662,6 +680,7 @@ class ApiRequest: } response = self.post( "/llm_model/get_model_config", + json=data, ) return self._get_response_value(response, as_json=True, value_func=lambda r:r.get("data", {}))