使用DeepSeek和Qdrant构建中文AI的步骤

2024年02月18日 由 alex 发表 606 0

DeepSeek LLM:具有长期性的开源语言模型


DeepSeek LLM 是一种先进的语言模型,已开发出包括 Base 和 Chat 在内的不同模型。它是在一个包含 2 万亿个中英文词块的数据集上从头开始训练的。就规模而言,DeepSeek LLM 模型有两种:一种包含 70 亿个参数,另一种包含 670 亿个参数。


70 亿个模型使用多头注意力(Multi-Head Attention),而 670 亿个模型使用分组查询注意力(Grouped-Query Attention)。这些变体的运行架构与 Llama 2 模型相同,后者是一个自回归变压器解码器模型。


DeepSeek LLM 是一个致力于从长远角度推进开源大型语言模型的项目。然而,DeepSeek LLM 67B 在推理、数学、编码和理解等多个领域的表现都优于 Llama 2 70B。与包括 GPT 3.5 在内的其他模型相比,DeepSeek LLM 在中文能力方面表现突出。


2


DeepSeek LLM的对齐流程包括两个阶段:


  1. 监督微调: 7B模型的微调时间为4个历元,而67B模型的微调时间为2个历元。在监督微调过程中,7B 模型的学习率为 1e-5,而 67B 模型的学习率为 5e-6。尽管数学 SFT 数据包含类似的推理模式,但当数学 SFT 数据量增加时,模型的重复率往往会增加。
  2. 直接偏好优化: 为了解决重复问题,我们使用了 DPO 训练来增强模型的能力,事实证明这是一种有效的 LLM 匹配方法。用于 DPO 训练的偏好数据是根据有用性和无害性构建的。


Qdrant: 高性能向量数据库


Qdrant 是一个用 Rust 编写的开源矢量数据库和矢量相似性搜索引擎,旨在利用先进的高性能矢量相似性搜索技术为下一代人工智能应用赋能。它的主要功能包括多语言支持(可实现各种数据类型的通用性)和适用于各种应用的过滤器。


Qdrant 对近似近邻搜索的 HNSW 算法进行了定制修改,通过保持精确的结果,确保了最先进的搜索能力,从而实现了速度和精确度的双赢。此外,它还支持与向量相关的额外有效载荷,允许根据有效载荷值过滤结果。Qdrant 支持丰富的数据类型和查询条件,包括字符串匹配、数值范围和地理位置,为数据管理提供了多功能性。


3


作为一个云原生和横向扩展平台,Qdrant 通过动态查询规划和有效载荷数据索引,有效利用计算资源,从而高效处理数据扩展需求。它的应用包括语义文本搜索、推荐、用户行为分析等,它提供了一种生产就绪的服务,具有方便的应用程序接口,可用于存储、搜索和管理向量及附加有效载荷。


利用FastEmbed进行轻量级嵌入生成


FastEmbed是一个轻量级、快速、精确的Python库,专门用于嵌入式生成,由Qdrant负责维护。它利用量化模型权重和 ONNX Runtime 实现高效和快速,从而避免了 PyTorch 依赖性的必要性。


4


FastEmbed 支持数据并行性,可高效地对庞大的数据集进行编码,并采用了以 CPU 为中心的设计方法。此外,与 OpenAI Ada-002 相比,FastEmbed 在准确率和召回率指标方面表现出色,其默认模型为 Flag Embedding,在 MTEB 排行榜上遥遥领先。它还支持 Jina Embedding 和 Text Embedding。FastEmbed 支持多种流行的文本模型。


用于稳健RAG的LlamaIndex框架


LlamaIndex 是一个强大的框架,非常适合构建检索增强生成(RAG)应用程序。它便于将用于检索和合成的块解耦,这是一个至关重要的功能,因为检索的最佳表示可能不同于合成的最佳表示。随着文档数量的增加,LlamaIndex 通过确保更精确的结果来支持结构化检索,尤其是当查询只与文档的子集相关时。


5


此外,LlamaIndex 还优先优化性能,提供一系列策略来有效增强 RAG 管道。它旨在通过减少幻觉来提高复杂数据集的检索和生成准确性。LlamaIndex 支持多种嵌入模型以及与大型语言模型的集成。此外,它还能与 LangChain、Flask 和 Docker 等成熟的技术平台无缝集成,并提供定制选项,例如用自定义摘要提示进行种子树构建。


用 DeepSeek 理解中文新闻


既然DeepSeek LLM在中文能力方面表现出色,那就让我们用检索增强生成技术来构建中文新闻人工智能吧。


6


要开始使用,让我们安装所有依赖项。


%pip install -q llama-index transformers datasets
%pip install -q llama-cpp-python
%pip install -q qdrant-client
%pip install -q llama_hub
%pip install -q fastembed


在这里,我使用了这个数据集;它是一个多语言新闻数据集。我选择的是中文。加载数据集并将其保存到你的目录中。我们将使用 LlamaIndex 和 SimpleDirectoryReader 来读取数据。


from datasets import load_dataset
dataset = load_dataset("intfloat/multilingual_cc_news", languages=["zh"], split="train")
dataset.save_to_disk("Notebooks/dataset")


现在,使用 LlamaIndex 从我们保存数据集的目录中加载数据。


from llama_index import SimpleDirectoryReader
documents = SimpleDirectoryReader("Notebooks/dataset").load_data()


然后,使用 SentenceSplitter 将文档分割成小块。在这里,我们需要维护文档和源文档索引之间的关系,以便有助于注入文档元数据。


from llama_index.node_parser.text import SentenceSplitter
text_parser = SentenceSplitter(chunk_size=1024,)
text_chunks = []
doc_idxs = []
for doc_idx, doc in enumerate(documents):
 cur_text_chunks = text_parser.split_text(doc.text)
 text_chunks.extend(cur_text_chunks)
 doc_idxs.extend([doc_idx] * len(cur_text_chunks))


然后,我们将手动从文本块中构建节点。


from llama_index.schema import TextNode
nodes = []
for idx, text_chunk in enumerate(text_chunks):
 node = TextNode(text=text_chunk,)
 src_doc = documents[doc_idxs[idx]]
 node.metadata = src_doc.metadata
 nodes.append(node)


对于每个节点,我们将使用 FastEmbed 嵌入模型生成嵌入。


from llama_index.embeddings import FastEmbedEmbedding
embed_model = FastEmbedEmbedding(model_name="BAAI/bge-small-en-v1.5")
for node in nodes:
 node_embedding = embed_model.get_text_embedding(node.get_content(metadata_mode="all"))
 node.embedding = node_embedding


现在,是时候使用 LlamaIndex 的 HuggingFaceLLM 加载 DeepSeek LLM 了。在这里,我使用的是聊天模型。


from llama_index.llms import HuggingFaceLLM
llm = HuggingFaceLLM(
 context_window=4096,
 max_new_tokens=256,
 generate_kwargs={"temperature": 0.7, "do_sample": False},
 tokenizer_name="deepseek-ai/deepseek-llm-7b-chat",
 model_name="deepseek-ai/deepseek-llm-7b-chat",
 device_map="auto",
 stopping_ids=[50278, 50279, 50277, 1, 0],
 tokenizer_kwargs={"max_length": 4096},
 model_kwargs={"torch_dtype": torch.float16}
)


然后,我们将定义由嵌入模型和大语言模型组成的 ServiceContext。


from llama_index import ServiceContext
service_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)


之后,我们将使用 Qdrant 向量数据库创建一个向量存储集合,并使用向量存储集合创建一个存储上下文。


import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(location=":memory:")
from llama_index.storage.storage_context import StorageContext
from llama_index import (VectorStoreIndex,
 ServiceContext,
 SimpleDirectoryReader,)
vector_store = QdrantVectorStore(client=client, collection_name="my_collection")
vector_store.add(nodes)
storage_context = StorageContext.from_defaults(vector_store=vector_store)


我们将把文档、存储上下文和服务上下文传入 VectorStoreIndex。


index = VectorStoreIndex.from_documents(documents, storage_context=storage_context, service_context=service_context)


我们将使用查询字符串生成查询嵌入,以建立检索管道。


query_str = "Can you give me news around IPhone?"
query_embedding = embed_model.get_query_embedding(query_str)


然后,我们将构建一个向量存储查询,并查询向量数据库。


from llama_index.vector_stores import VectorStoreQuery
query_mode = "default"
vector_store_query = VectorStoreQuery(query_embedding=query_embedding, similarity_top_k=2, mode=query_mode)
query_result = vector_store.query(vector_store_query)
print(query_result.nodes[0].get_content())


结果如下:


8%,僅排名第五,位居華為、OPPO和Vivo等本土手機廠商之後 - - 這三家中國手機廠商的市場份額加起來達到47%。
普遍對iPhone 8更期待
除此之外,即將發布的iPhone 7恐怕會成為大獲成功的iPhone 6的"犧牲品"。去年第一季度,得益於iPhone 6銷量激增,蘋果在中國的營收增長了74%。一年後,由於iPhone 6S銷量疲軟,蘋果在全球的iPhone銷量首次出現下滑,而公司營收更是出現13年來的首次滑坡,盡管根據市場研究機構Strategy Analytics的數據,iPhone 6S是今年第二季度全球最暢銷的智能手機。
到目前為止,新浪微博網友對iPhone 7發布的討論,已經超過了去年iPhone 6S發布前的熱度。部分中國用戶甚至已經開始盤算著購買有望於明年發布的iPhone8。鑒於2017年是iPhone上市十周年,外界預計iPhone 8將作出更大的升級。
由於投資者擔心iPhone銷量已過巔峰,蘋果股價在今年始終承受著壓力。盡管今年以來蘋果股價累計上漲了2.35%,但仍然落後於標准普爾500指數的平均漲幅。
市場研究機構Stratechery科技行業分析師本·湯普森(Ben Thompson)說:"相比2014年,今天最大的變化就是iPhone已無處不在。當人們第一次獲得購買iPhone的機會時,它還有巨大的增長空間,但如今那種潛力已經得到充分挖掘。"◎ 陳國雄
美國在1978年立法制定國際銀行法(International Banking Act of 1978),該法將外國銀行業納入與國內銀行相同準則。在此之前,外國銀行設立係依據州法沒有一致性。
1978年制定國際銀行法後,外國銀行設立採雙規制(Dual System),可向聯邦銀行管理機構OCC (Office of the Comptroller of the Currency)或州銀行 (State Banking Department)當局申請,如果向州申請設立毋須經過聯邦銀行同意。到了1991年外國銀行在美迅速成長,大約有280家外國銀行,資產值達6,260億美元,佔美國銀行總資產18%,大部份是依州法設立。


响应是:


'8%,排名第五,落后于本土手机制造商华为、OPPO 和 vivo,这三家中国手机制造商的市场份额总和为 47%。
对 iPhone 8 的广泛期待
此外,即将推出的 iPhone 7 恐怕会成为大获成功的 iPhone 6 的 "牺牲品"。去年第一季度,由于 iPhone 6 销量激增,苹果在中国的收入增长了 74%。一年后,根据市场研究机构Strategy Analytics的数据,尽管iPhone 6S是今年第二季度全球最畅销的智能手机,但由于iPhone 6S销售疲软,苹果全球iPhone销量首次出现下滑,公司营收也出现了13年来的首次滑坡。
到目前为止,新浪微博上关于 iPhone 7 发布的讨论已经超过了去年 iPhone 6S 发布时的热度。一些中国用户甚至开始计划购买 iPhone 8,该产品预计将于明年发布,鉴于 2017 年是 iPhone 发布十周年,预计升级幅度会更大。
由于投资者担心 iPhone 的销量已经见顶,苹果公司的股价今年以来一直承压。尽管自今年年初以来,苹果股价已上涨 2.35%,但仍落后于标准普尔 500 指数的平均涨幅。
市场研究机构 Stratechery 科技行业分析师本-汤普森(Ben Thompson)说: "与2014年相比,如今最大的变化就是iPhone无处不在。当人们第一次有机会购买iPhone时,还有巨大的发展空间,但如今这种潜力已经得到了充分发挥。" 陈国雄
美国于 1978 年颁布了《国际银行法》,将外国银行业纳入与国内银行相同的标准。在此之前,外资银行是根据各州法律设立的,没有统一标准。
1978 年国际银行法》颁布后,外资银行的设立采用双轨制,可以向货币监理署(OCC)、联邦银行机构或州银行部(State Banking Department)申请,不需要联邦银行机构的同意。如果是向州提出申请,则不需要联邦银行的同意。到 1991 年,外资银行在美国迅速发展,大约有 280 家外资银行,资产达 6260 亿美元,占美国银行资产总额的 18%,其中大部分是根据州法律成立的。


然后我们将结果解析为一组节点。


from llama_index.schema import NodeWithScore
from typing import Optional
nodes_with_scores = []
for index, node in enumerate(query_result.nodes):
 score: Optional[float] = None
 if query_result.similarities is not None:
 score = query_result.similarities[index]
 nodes_with_scores.append(NodeWithScore(node=node, score=score))


现在,我们将使用上述方法创建一个 retriever 类。


from llama_index import QueryBundle
from llama_index.retrievers import BaseRetriever
from typing import Any, List
class VectorDBRetriever(BaseRetriever):
 """Retriever over a qdrant vector store."""
 def __init__(self,
 vector_store: QdrantVectorStore,
 embed_model: Any,
 query_mode: str = "default",
 similarity_top_k: int = 2) -> None:
 """Init params."""
 self._vector_store = vector_store
 self._embed_model = embed_model
 self._query_mode = query_mode
 self._similarity_top_k = similarity_top_k
 super().__init__()
 def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
 """Retrieve."""
 query_embedding = embed_model.get_query_embedding(
 query_bundle.query_str
 )
 vector_store_query = VectorStoreQuery(
 query_embedding=query_embedding,
 similarity_top_k=self._similarity_top_k,
 mode=self._query_mode,
 )
 query_result = vector_store.query(vector_store_query)
 nodes_with_scores = []
 for index, node in enumerate(query_result.nodes):
 score: Optional[float] = None
 if query_result.similarities is not None:
 score = query_result.similarities[index]
 nodes_with_scores.append(NodeWithScore(node=node, score=score))
 return nodes_with_scores
retriever = VectorDBRetriever(
 vector_store, embed_model, query_mode="default", similarity_top_k=2
)


然后,创建一个 retriever 查询引擎。


from llama_index.query_engine import RetrieverQueryEngine
query_engine = RetrieverQueryEngine.from_args(
 retriever, service_context=service_context
)


最后,我们的 retriever 就可以进行查询和聊天了。让我们传递一个查询。


查询内容是 "告诉我有关南海问题"


query_str = "告诉我南海问题"
response = query_engine.query(query_str)
print(str(response))


以下是回复:


南海问题是指涉及南海地区多个国家的主权和海洋权益争议的问题。该地区包括南海诸岛及其附近海域,涉及中国、菲律宾、越南、马来西亚、文莱和台湾等国家和地区。南海地区拥有丰富的油气资源,因此争议各方在该地区的领土和资源开发上存在分歧。中国主张对南海诸岛及其附近海域拥有主权,并提出"九段线"主张,而其他国家则对此持有不同看法。南海问题涉及复杂的政治、经济和安全利益,是地区和国际社会关注的焦点之一。


响应是:


南海问题是指涉及南海地区多国主权和海洋权益争端的问题。该地区包括南海诸岛及其附近海域,涉及中国、菲律宾、越南、马来西亚、文莱和台湾等国家和地区。南海蕴藏着丰富的石油和天然气资源,因此争端各方对该地区的领土和资源开发存在分歧。中国声称对南海诸岛及其附近海域拥有主权,并提出了 "九段线 "主张,而其他国家对此持有不同看法。南海问题涉及复杂的政治、经济和安全利益,是地区和国际社会关注的焦点之一。


结论


DeepSeek LLM 在回答问题方面表现出色,没有遇到挑战。它的架构使其有别于其他模型,而最令人印象深刻的是它利用直接偏好优化来增强模型的能力。它是一个经过微调和优化的中英文模型,我们从结果中观察到了这样一个经过微调和优化的模型能有多好的表现。


我们利用 FastEmbed 和 Qdrant 进行嵌入生成和向量相似性搜索。使用 Qdrant 时,检索速度非常快。Qdrant 最令人印象深刻的特点之一是它可以通过 Docker 安装在云上,并且具有内存功能。Qdrant 在存储矢量嵌入方面用途广泛。


文章来源:https://medium.com/@akriti.upadhyay/steps-to-build-chinese-language-ai-using-deepseek-and-qdrant-74e5cda604c0
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消