mini-langchain-chatglm:五分钟实现基于知识的问答
作者: AINLP 来源: AINLP
看了这么多源码以及实例,接下来我们将做一个最小限度的langchain-chatglm:
从文本中加载数据
text = """
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。
为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。
想让 ChatGLM-6B 更符合你的应用场景?欢迎参与 Badcase 反馈计划。
ChatGLM-6B 开源模型旨在与开源社区一起推动大模型技术发展,恳请开发者和大家遵守开源协议,勿将开源模型和代码及基于开源项目产生的衍生物用于任何可能给国家和社会带来危害的用途以及用于任何未经过安全评估和备案的服务。目前,本项目团队未基于 ChatGLM-6B 开发任何应用,包括网页端、安卓、苹果 iOS 及 Windows App 等应用。
尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 ChatGLM-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导(详见局限性)。本项目不承担开源模型和代码导致的数据安全、舆情风险或发生任何模型被误导、滥用、传播、不当利用而产生的风险和责任。
更新信息
[2023/06/25] 发布 ChatGLM2-6B,ChatGLM-6B 的升级版本,在保留了了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:
更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。
更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
更多信息参见 ChatGLM2-6B。
[2023/06/14] 发布 WebGLM,一项被接受于KDD 2023的研究工作,支持利用网络信息生成带有准确引用的长回答。
"""
import logging
from typing import List, Optional, Any
from langchain.docstore.document import Document
from langchain.document_loaders.base import BaseLoader
from langchain.document_loaders.helpers import detect_file_encodings
class StrLoader(BaseLoader):
"""Load text files.
Args:
file_path: Path to the file to load.
encoding: File encoding to use. If `None`, the file will be loaded
with the default system encoding.
autodetect_encoding: Whether to try to autodetect the file encoding
if the specified encoding fails.
"""
def __init__(
self,
text: str,
encoding: Optional[str] = None,
autodetect_encoding: bool = False,
):
"""Initialize with file path."""
self.text = text
self.encoding = encoding
self.autodetect_encoding = autodetect_encoding
def load(self) -> List[Document]:
# 从文本加载
metadata = {"source": "chatglm.md"}
return [Document(page_content=text, metadata=metadata)]
print("文本长度:", len(text))
loader = StrLoader(text)
继承BaseLoader,重写load方法,返回一个Document类,其中page_content是我们的文本,metadata是一些额外的元信息,比如文本的路径、文本的描述等。
将文本进行分割
from langchain.text_splitter import CharacterTextSplitter
class CharacterStrSplitter(CharacterTextSplitter):
"""Implementation of splitting text that looks at characters."""
def __init__(self, separator: str = "\n\n", **kwargs: Any) -> None:
"""Create a new TextSplitter."""
super().__init__(**kwargs)
self._separator = separator
def split_text(self, text: str) -> List[str]:
"""Split incoming text and return chunks."""
# First we naively split the large input into a bunch of smaller ones.
splits = text.split(self._separator)
_separator = "" if self._keep_separator else self._separator
return self._merge_splits(splits, _separator)
text_splitter = CharacterStrSplitter(
separator = "\n\n",
chunk_size = 512,
chunk_overlap = 100,
length_function = len,
)
docs = loader.load_and_split(text_splitter)
from pprint import pprint
pprint(docs)
"""
WARNING:langchain.text_splitter:Created a chunk of size 535, which is longer than the specified 512
文本长度:1442
[Document(page_content='ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。\n\n为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。\n\n想让 ChatGLM-6B 更符合你的应用场景?欢迎参与 Badcase 反馈计划。', metadata={'source': 'chatglm.md'}),
Document(page_content='想让 ChatGLM-6B 更符合你的应用场景?欢迎参与 Badcase 反馈计划。\n\nChatGLM-6B 开源模型旨在与开源社区一起推动大模型技术发展,恳请开发者和大家遵守开源协议,勿将开源模型和代码及基于开源项目产生的衍生物用于任何可能给国家和社会带来危害的用途以及用于任何未经过安全评估和备案的服务。目前,本项目团队未基于 ChatGLM-6B 开发任何应用,包括网页端、安卓、苹果 iOS 及 Windows App 等应用。\n\n尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 ChatGLM-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导(详见局限性)。本项目不承担开源模型和代码导致的数据安全、舆情风险或发生任何模型被误导、滥用、传播、不当利用而产生的风险和责任。\n\n更新信息\n[2023/06/25] 发布 ChatGLM2-6B,ChatGLM-6B 的升级版本,在保留了了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:', metadata={'source': 'chatglm.md'}),
Document(page_content='更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。\n更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。\n更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。\n更多信息参见 ChatGLM2-6B。', metadata={'source': 'chatglm.md'}),
Document(page_content='[2023/06/14] 发布 WebGLM,一项被接受于KDD 2023的研究工作,支持利用网络信息生成带有准确引用的长回答。', metadata={'source': 'chatglm.md'})]
"""
继承CharacterTextSplitter,重写split_text方法,这里我只简单的进行\n\n分割文本,可根据自己的需求定义。
初始化的参数:
-
separator:分割符
-
chunk_size:文本块的长度
-
chunk_overlap:文本块之间重叠的长度
-
length_function:计算长度的方法,这里也可以先进行tokenizer化,再计算长度
使用模型转换分割后的文本并进行存储
from langchian.
embeddings = HuggingFaceEmbeddings(model_name="GanymedeNil/text2vec-large-chinese", model_kwargs={'device': ""})
from langchain.vectorstores.faiss import FAISS
vector_store = FAISS.from_documents(docs, embeddings)
related_docs_with_score = vector_store.similarity_search_with_score(query, k=self.top_k)
"""
[(Document(page_content='ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。\n\n为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。\n\n想让 ChatGLM-6B 更符合你的应用场景?欢迎参与 Badcase 反馈计划。', metadata={'source': 'chatglm.md'}),
488.00125),
(Document(page_content='更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。\n更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。\n更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。\n更多信息参见 ChatGLM2-6B。', metadata={'source': 'chatglm.md'}),
538.00037)]
"""
这里可参考已经讲解的文章。
构建prompt
PROMPT_TEMPLATE = """已知信息:
{context}
根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:{question}"""
context = "\n".join([doc[0].page_content for doc in related_docs_with_score])
question = query
prompt = PROMPT_TEMPLATE.replace("{question}", query).replace("{context}", context)
print(prompt)
"""
已知信息:
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。
为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。
想让 ChatGLM-6B 更符合你的应用场景?欢迎参与 Badcase 反馈计划。
更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。
更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
更多信息参见 ChatGLM2-6B。
根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:chatglm-6b是什么?
"""
将查询出的内容和query以及基本模板进行整合。
根据prompt用模型生成结果
首先我们使用原始的模型直接对query进行预测:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
response, history = model.chat(tokenizer, query, history=[])
print(response)
"""
ChatGLM-6B 是一个基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型 GLM-6B 开发的人工智能助手。
"""
然后是使用带有知识的提问:
response, history = model.chat(tokenizer, prompt, history=[])
print(response)
"""
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
"""
总结
到这里,一个简单的基于知识的问道就全部完成了。
当然,prompt的构建和模型的使用我们并没有和langchain进行整合,整合的难度也不是很大,可参考已经写好的文章。
最后是贴上对langchain的学习资料,地址:
https://github.com/taishan1994/langchain-learning
目前已经整理学习的目录:
langchain-learning
langchain的学习笔记。依赖:
openai==0.27.8
langchian==0.0.225
文章
注意:由于langchain或langchain-ChatGLM的更新,可能导致部分源码和讲解的有所差异。
-
langchain组件-数据连接(data connection)
-
langchain组件-模型IO(model IO)
-
langchain组件-链(chains)
-
langchain组件-代理(agents)
-
langchain组件-内存(memory)
-
langchain组件-回调(callbacks)
-
langchain中ChatOpenAI背后做了什么.md
-
langchain.load.serializable.py.md
-
langchain中的一些schema.md
-
langchain中是怎么调用chatgpt的接口的.md
-
langchain结构化输出背后的原理,md
-
langchain中memory的工作原理.md
-
langchain怎么确保输出符合道德期望.md
-
pydantic中config的一些配置.md
-
pydantic中的Serializable和root_validator.md
-
python中常用的一些魔术方法.md
-
python的typing常用的类型.md
目前基于langchain的中文项目有两个:
我们从中可以学到不少。
langchain-ChatGLM
-
使用api部署langchain-chatglm的基本原理.md
-
上传文档时发生了什么.md
-
关于HuggingFaceEmbeddings.md
-
关于InMemoryDocstore.md
-
关于CharacterTextSplitter.md
-
关于TextLoader.md
-
关于怎么调用bing的搜索接口.md
-
根据query得到相关的doc的原理.md
-
根据查询出的docs和query生成prompt.md
-
根据prompt用模型生成结果.md
中文例子
-
定制中文LLM模型
-
定制中文聊天模型
-
使用中文splitter.md
-
根据query查询docs.md
英文例子
-
langchain使用openai例子.md(文本翻译)
-
openai调用chatgpt例子.md
-
langchain解析结果并格式化输出.md
-
langchain带有记忆的对话.md
-
langchain中使用不同链.md
-
langchain基于文档的问答md
langchain可能存在一些问题
虽然langchain给我们提供了一些便利,但是也存在一些问题:
-
无法解决大模型基础技术问题,主要是prompt重用问题:首先很多大模型应用的问题都是大模型基础技术的缺陷,并不是LangChain能够解决的。其中核心的问题是大模型的开发主要工作是prompt工程。而这一点的重用性很低。但是,这些功能都需要非常定制的手写prompt。链中的每一步都需要手写prompt。输入数据必须以非常特定的方式格式化,以生成该功能/链步骤的良好输出。设置DAG编排来运行这些链的部分只占工作的5%,95%的工作实际上只是在提示调整和数据序列化格式上。这些东西都是不可重用的。
-
LangChain糟糕的抽象与隐藏的垃圾prompt造成开发的困难:简单说,就是LangChain的抽象工作不够好,所以很多步骤需要自己构建。而且LangChain内置的很多prompt都很差,不如自己构造,但是它们又隐藏了这些默认prompt。
-
LangChain框架很难debug:尽管LangChain很多方法提供打印详细信息的参数,但是实际上它们并没有很多有价值的信息。例如,如果你想看到实际的prompt或者LLM查询等,都是十分困难的。原因和刚才一样,LangChain大多数时候都是隐藏了自己内部的prompt。所以如果你使用LangChain开发效果不好,你想去调试代码看看哪些prompt有问题,那就很难。
-
LangChain鼓励工具锁定:LangChain鼓励用户在其平台上进行开发和操作,但是如果用户需要进行一些LangChain文档中没有涵盖的工作流程,即使有自定义代理,也很难进行修改。这就意味着,一旦用户开始使用LangChain,他们可能会发现自己被限制在LangChain的特定工具和功能中,而无法轻易地切换到其他可能更适合他们需求的工具或平台。
以上内容来自:
-
Langchain Is Pointless | Hacker News (ycombinator.com)
-
使用LangChain做大模型开发的一些问题:来自Hacker News的激烈讨论~
有时候一些简单的任务,我们完全可以自己去实现相关的流程,这样每一部分都由我们自己把控,更易于修改。
使用langchain解决复杂任务
方法一:领域微调LLM
使用领域数据对LLM进行微调,受限于计算资源和模型参数的大小,而且模型会存在胡言乱语的情况。这里面涉及到一系列的问题:
-
数据怎么获取,怎么进行数据清理。
-
分词使用什么方式。
-
模型采用什么架构,怎么训练,怎么评估模型。
-
模型怎么进行有效推理,怎么进行部署。
-
领域预训练、领域指令微调、奖励模型、结果对齐。
方法二:langchain + LLM + tools
基本思路:
1、用户提问:请对比下商品雅诗兰黛特润修护肌活精华露和SK-II护肤精华?
2、RouterChain问题路由,即使用哪种方式回答问题:(调用一次LLM)
-
RouterChain可以是一个LLM,也可以是一个embedding,去匹配到合适的解决方案,如果没有匹配到任何解决方案,则使用模型内部知识进行回答。
-
这里匹配到商品对比这一问题,得到解决方案:(1)调用商品搜索工具得到每一个商品的介绍。(2)通过搜索结果对比这些商品。
3、使用Planner生成step:(调用一次LLM)
- 根据解决方案生成合适的steps,比如:(1)搜索雅诗兰黛特润修护肌活精华露。(2)搜索SK-II护肤精华。(3)对比上述商品。
4、执行者Executer执行上述步骤:(调用steps次LLM,n是超参数表明调用的最大次数)
-
需要提供工具,每个step的问题,需要调用llm生成每个工具的调用参数。
-
调用工具获取结果。
5、对所有的结果进行汇总。(调用一次LLM)
方法三:langchain + LLM + 检索
相比于方案1,不使用工具,直接根据问题进行对数据库进行检索,然后对检索到的结果进行回答。
检索的方式可以是基于给定问题的关键字,使用ES工具从海量数据库中检索到可能存在答案的topk段落。把这topk个段落连同问题一起发送给LLM,进行回答。
检索的方式改成向量的形式,先对所有已知资料按照300个字切分成小的段落,然后对这些段落进行编码成向量,当用户提问时,把用户问题同样编码成向量,然后对这些段落进行检索,得到topk最相关的段落,把这topk个段落连同问题一起发送给LLM,进行回答。
上述方法的优缺点:
领域微调LLM:需要耗费很多的人力收集领域内数据和问答对,需要耗费很多算力进行微调。
langchain + LLM + tools:是把LLM作为一个子的服务,LangChain作为计划者和执行者的大脑,合适的时机调用LLM,优点是解决复杂问题,缺点是不可靠。LLM生成根据问题和工具调用工具获取数据时不可靠。可以不能很好的利用工具。可能不能按照指令调用合适的工具,还可能设定计划差,难以控制。优点是:用于解决复杂的问题。
langchain + LLM + 检索:优点是现在的领域内主流问答结构,缺点:是根据问题对可能包含答案的段落检索时可能检索不准。不适用于复杂问答
总结:最大的问题还是LLM本身:
-
LLM输出的不可控性,会导致后续步骤出现偏差。
-
LLM的输入的context的长度问题:目前已经可以把长度推广到10亿以上了。
-
训练一个LLM需要的成本:对于数据而言,除了人工收集整理外,也可以使用大模型进行生成;对于训练而言,目前也有不少基于参数有效微调的例子。
-
LLM的部署问题:也已经有不少加速推理的方法,比如量化、压缩、使用分布式进行部署、使用C++进行部署等。
LLM是整个系统的基座,目前还是有不少选择的余地的,网上开源了不少中文大语言模型,但大多都是6B/7B/13B的,要想有一个聪明的大脑,模型的参数量还是需要有保证的。
以上参考:https://mp.weixin.qq.com/s/FvRchiT0c0xHYscO_D-sdA
扩展
留出一些问题以待思考:可能和langchain相关,也可能和大模型相关
怎么根据垂直领域的数据选择中文大模型?1、根据各评测的排行版。2、在自己领域数据上进行评测。3、借鉴现有的垂直领域模型的选择,比如金融大模型、法律大模型、医疗大模型等。
数据的一个答案由一系列相连的句子构成,怎么对文本进行切分以获得完整的答案?比如:怎么能够解决失眠?(1)、保持良好的心情。(2)、进行适当的训练。(3)、可适当使用药物。1、尽量将划分的文本的长度设置大一些。2、为了避免答案被分割,可以设置不同段之间可以重复一定的文本。3、检索时可返回前top_k个文档。4、融合查询出的多个文本,利用LLM进行总结。
怎么构建垂直领域的embedding?
怎么存储获得的embedding?
参考
Introduction | 🦜️🔗 Langchain
API Reference — 🦜🔗 LangChain 0.0.229
https://python.langchain.com.cn/docs/modules/agents/how_to/custom_llm_chat_agent
**进技术交流群请添加AINLP小助手微信(id: ainlp2)**
**请备注具体方向+所用到的相关技术点**
![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSJADkmZ2IX6Z23znAibuEevotDMq9iaMxiapK7jfMibiauGFkycicAJEs6x5U9SGyDJZ0S1tRed9TPNUUDQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
**关于AINLP**
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。
![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSKABHCqVVQkVYPrM4XY1vsd0iaeuXzyJnoFc8cibd5mYb4wdA3WMQtiaPVmr0XLZHMuVibqWncibpnTSnQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
**阅读至此了,分享、点赞、在看三选一吧🙏**
更多AI工具,参考Github-AiBard123,国内AiBard123