摆脱 OpenAI 依赖,8 分钟教你用开源生态构建全栈 AI 应用

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 大模型时代的到来使得 AI 应用开发变得更加轻松、省时,尤其是在 CVP Stack 的范式下,开发者甚至可以用一个周末的时间做出一个完整的应用程序。

大模型时代的到来使得 AI 应用开发变得更加轻松、省时,尤其是在 CVP Stack 的范式下,开发者甚至可以用一个周末的时间做出一个完整的应用程序。

本文将应用理论于实践,给大家演示如何利用 Milvus、Xinference、Llama 2-70B 开源模型和 LangChain,构筑出一个全功能的问答系统。Xinference 使得本地部署 Llama 2 模型变得简洁高效,而 Milvus 则提供了高效的向量存储和检索能力。

摆脱对 OpenAI 的依赖,借助开源生态系统构建出全流程的 AI 应用,现在开始!

01. 项目介绍

Milvus

Milvus(https: //milvus.io/docs/overview.md) 是一个向量数据库,其主要功能是存储、索引和管理大规模的嵌入向量,这些向量由深度神经网络和其他机器学习模型生成。与传统的关系数据库不同,Milvus 专门处理输入向量的查询,并能够索引规模达到万亿级别的向量。

Milvus 的设计从底层开始,特别考虑了处理来自非结构化数据的嵌入向量。随着互联网的发展,非结构化数据如电子邮件、论文、传感器数据、照片等变得越来越普遍。为了让计算机能够理解和处理这些非结构化数据,这些数据会被转换成向量,使用嵌入技术。Milvus 的任务就是存储和索引这些向量,并通过计算向量之间的相似度来分析它们的相关性。

Xinference

Xinference(https: //github.com/xorbitsai/inference) 使得本地模型部署变得非常简单。用户可以轻松地一键下载和部署内置的各种前沿开源模型,例如 Llama 2(https: //ai.meta.com/llama/)、ChatGLM2、通义千问等。为了让使用 OpenAI API 的用户能够无缝迁移,Xinference 提供了与 OpenAI 兼容的 RESTful 接口。与 OpenAI 这样的专有大模型方案相比,Xinference 有以下优势:

  • 更安全:在私有化部署下,数据完全不外流,大大降低了数据泄露的风险。
  • 成本更低:与OpenAI的LLM服务相比,私有化的LLM允许用户在定制化的基础上,用更小的模型达到相似的效果。这可以大大减少硬件需求并提高推理效率。
  • 可定制:用户可以基于开源基础模型,使用自己的数据集进行微调,从而创建一个属于自己的模型。

Xinference 还可以在分布式集群中部署,实现高并发推理,并简化了扩容和缩容的过程。Xinference 不仅支持在CPU上进行推理,而且在 GPU 繁忙时,可以将部分计算任务交给 CPU 来完成,从而提高系统的吞吐率。

LangChain

LangChainhttps://github.com/langchain-ai/langchain) 为开发基于语言模型的应用提供了一个灵活且易用的框架,使应用能够与数据源交互并高效地适应其环境。它不仅提供了各种功能组件,还为每一层的抽象都提供了多种实现方式。在这个示例中,LangChain 成功地将诸如 Milvus、Xinference Embedding 和 Xinference LLM 等模块连接起来。我们使用 LangChain 对工作流程进行编排,极大地简化了 AI 应用的开发过程。

以下是问答系统的工作流程图:

1.png

02. 具体操作

  • 安装&启动服务

通过 PyPI 安装 LangChain、Milvus 和 Xinference:

pip install langchain milvus "xinference[all]"

这条命令将在本地 19530 端口启动 Milvus 向量检索服务:

$ milvus-server

这条命令将在本地 9997 端口启动 Xinference 模型推理服务:

$ xinference
  • 部署 Llama 2 和 Falcon 模型

在本示例中,我们将通过 Xinference 的命令行工具的 launch命令在本地部署两个模型服务:

Falcon-40B-Instruct:Falcon-40B-Instruct 是一个具有 400 亿万参数的因果解码器模型,它在 Baize 数据集的混合数据上进行了微调。我们将使用这个模型来为文档块生成词向量。

Llama 2-Chat-70B:Llama 2系列模型是一组GPT-like (也被称作自回归Transformer 模型)大语言模型,Llama 2-Chat 针对聊天对话场景进行了微调,采用了监督微调(SFT)和人类反馈强化学习(RLHF)进行了迭代优。我们将使用这个模型作为 LLM 后端,进行对话。

启动 Falcon-40B-Instruct 模型:

xinference launch --model-name "falcon-instruct" \
   --model-format pytorch \
   -size-in-billions 40 \ 
   --endpoint "http://127.0.0.1:9997"

启动 Llama 2-Chat-70B 模型:

$ xinference launch --model-name "llama-2-chat" \ 
  --model-format ggmlv3 \
  --size-in-billions 70 \
  --endpoint "http://127.0.0.1:9997"

上述两个命令都会返回 model_uid,可以利用它在 LangChain 中与它们交互。要了解如何在集群中部署 Xinference,可参考 Xinference 的 README。

  • 用 Xinference Embeddings 抽取向量

在这个示例中,我们选择了这个文件https://github.com/hwchase17/chat-your-data/blob/master/state_of_the_union.txt)来作为问答系统的“知识库”,可以将它替换为其他内容,或者增加更多的文档。我们使用 LangChain 的 TextLoader 和 RecursiveCharacterTextSplitter 来记载以及对文档分块。

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = TextLoader("../../state_of_the_union.txt") # 替换成任何你想要进行问答的txt文件

documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 512,
    chunk_overlap  = 100,
    length_function = len,
)
docs = text_splitter.split_documents(documents)

连接到我们在上一步中创建的 Xinference Embedding 服务端点,即 Falcon-40B-Instruct 模型。之后,我们可以使用embed_queryembed_documents 方法来提取查询或文档片段的文本向量。

from langchain.embeddings import XinferenceEmbeddings

xinference_embeddings = XinferenceEmbeddings(
    server_url="http://127.0.0.1:9997", # 换成设置的url,这里用的是默认端口
    model_uid = {model_uid}  # 替换成之前返回的Falcon-Instruct模型model_uid
)
  • 用 Milvus 实现向量搜索

通过刚才的步骤,我们将一篇长文章进行了分块,并且对每个分块进行了向量化。接下来我们借助 LangChain 提供的 from_documents 方法将向量化后的文档写入了 Milvus:

from langchain.vectorstores import Milvus

vector_db = Milvus.from_documents(
    docs,
    xinference_embeddings,
    connection_args={"host": "0.0.0.0", "port": "19530"},
)

然后我们就可以开始对文档进行搜索了!在这里我们使用了 LangChain 提供的 similarity_search(https: //python.langchain.com/docs/modules/model_io/prompts/example_selectors/similarity) 接口,它的原理是寻找和 query 具有最大余弦相似度的 Embedding,因此它召回的内容也都是文本中的原句。

query = "what does the president say about Ketanji Brown Jackson"
docs = vector_db.similarity_search(query, k=10)
print(docs[0].page_content) 

结果如下,可以看出 Top-k 回答中的第一个回答就给出了文本中关于 Ketanji Brown Jackson 的上下文原句。

One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. 

And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
  • 用 Xinference LLM 构建对话式问答系统

接下来我们将演示如何利用 LLM 对文本内容进行归纳和总结,并且借助 LangChain 创造对话式的问答体验。

首先,我们引入 LangChain 的 Xinference LLM 模块,用我们之前启动的 Llama2 模型作为 LLM 来提供对话的能力:

from langchain.llms import Xinference

xinference_llm = Xinference(
    server_url="http://127.0.0.1:9997", # 换成设置的url,这里用的是默认端口
    model_uid = {model_uid} # 替换成上一步返回的Llama 2 chat模型的model_uid
)

我们先试试看,在不利用文档信息的前提下,看看 Llama 2 会给出什么答案:

xinference_llm(prompt="What did the president say about Ketanji Brown Jackson?")
'\nWhat did the president say about Ketanji Brown Jackson?\nPresident Joe Biden called Judge Ketanji Brown Jackson a "historic" and "inspiring" nominee when he introduced her as his pick to replace retiring Supreme Court Justice Stephen Breyer. He highlighted her experience as a public defender and her commitment to justice and equality, saying that she would bring a unique perspective to the court.\n\nBiden also praised Jackson\'s reputation for being a "fair-minded" and "thoughtful" jurist who is known for her ability to build'

为了让 LLM 能记住上下文,我们用 LangChain 中 ConversationBufferMemory 模块的创建一个拥有“记忆”对象,用来保存对话的历史记录。

from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

我们使用 LangChain 中的 ConversationalRetrievalChain 作为核心模块,LangChain 替我们处理了和 Memory 打交道并且从向量数据库中召回文档的细节,使得我们在开发应用的过程中无需关注它们的实现:首先,LangChain 会将聊天历史(这里是从提供的 Memory 中检索的)与当前问题合并,形成一个独立的问题;然后,根据独立的问题从检索器中查找相关文档;最后,将检索到的文档和独立的问题传递给问答链,生成回答。

from langchain.chains import ConversationalRetrievalChain

chain = ConversationalRetrievalChain.from_llm(
    llm=xinference_llm,
    retriever=vector_db.as_retriever(),
    memory=memory)

创建好这个 Chain 之后,我们就可以开始对文档进行提问了:

query = "What did the president say about Ketanji Brown Jackson"
result = chain({"question": query})
print(result["answer"])
' According to the provided text, President Biden said that he nominated Circuit Court of Appeals Judge Ketanji Brown Jackson to serve on the United States Supreme Court 4 days ago, and that she is one of our nation’s top legal minds who will continue Justice Breyer’s legacy of excellence.'

对比之前不借助文档直接提问的效果,使用了文档搜索之后的回答看起来更靠谱了,因为 LLM 使用了我们提前准备好的“知识库”来回答,并且对文档内容进行了一定的总结。

因为有 Memory 的加持,我们还能够和 LLM 持续对话:

query = "Did he mention who she succeeded"
result = chain({"question": query})
print(result["answer"])
'According to the given text, President Biden said that Ketanji Brown Jackson succeeded Justice Breyer on the Supreme Court.'

可以看到 Llama 2 精准地认识到“he”指代上一个 query 中的 the president, “she” 指代上一个 query 中的 Ketanji Brown Jackson。

再换一个问题,这次 Llama 2 找到了文章中关于总统对 COVID-19 的评论,并总结出了相关的答案:

query = "Summarize the President's opinion on COVID-19"
result = chain({"question": query})
print(result['answer'])
'  According to the text, the president views COVID-19 as a "God-awful disease" and wants to move forward in addressing it in a unified manner, rather than allowing it to continue being a partisan dividing line.'

03. 总结

在这篇文章中,我们以构建本地全功能问答系统为例,展示如何巧妙地融合 Xinference 和 Milvus 两大强大的开源工具,并通过 LangChain 实现顺畅的串联,并且利用了开源模型的强大为例,打破了被单一大模型 API 束缚的桎梏。我们深信,通过持续探索和技术的协同,一定可以实现更多激动人心的应用与技术突破,创造更大的价值。

参考链接:

如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
3天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
|
5天前
|
人工智能 自然语言处理 监控
解决方案评测:主动式智能导购AI助手构建
作为一名数据工程师,我体验了主动式智能导购AI助手构建解决方案,并进行了详细评测。该方案通过百炼大模型和函数计算实现智能推荐与高并发处理,部署文档详尽但部分细节如模型调优需改进。架构设计清晰,前端支持自然语言处理与语音识别,中间件确保实时数据同步。生产环境部署顺畅,但在系统监控方面可进一步优化。总体而言,该方案在零售行业具有显著应用潜力,值得尝试。
35 17
|
3天前
|
人工智能 安全 机器人
OpenAI重拾规则系统,用AI版机器人定律守护大模型安全
在人工智能领域,大语言模型(LLM)展现出强大的语言理解和生成能力,但也带来了安全性和可靠性挑战。OpenAI研究人员提出“规则基于奖励(RBR)”方法,通过明确规则引导LLM行为,确保其符合人类价值观和道德准则。实验显示,RBR方法在安全性与有用性之间取得了良好平衡,F1分数达97.1。然而,规则制定和维护复杂,且难以完全捕捉语言的多样性。论文:https://arxiv.org/pdf/2411.01111。
30 13
|
3天前
|
数据采集 机器学习/深度学习 人工智能
基于AI的网络流量分析:构建智能化运维体系
基于AI的网络流量分析:构建智能化运维体系
38 13
|
5天前
|
人工智能 自然语言处理 前端开发
openai 12天发布会收官 | AI大咖说
OpenAI这12天的发布会,并没有太多特别令人惊喜的内容,可能是前面的惊喜太多了。更多的是,让ChatGPT越来越侧重参与现实中的应用,真正赋能改变生活,包括projects项目管理,canvas文档写作,接入电话,接入ios,接入桌面,接入搜索,以及chatGPT桌面和更多应用的交互。 以及更多的多模态的延展,视觉vision,语音,视频sora。 在最后收官中,宣布新一代的O3和O3-mini更强的推理模型
82 11
|
3天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
2天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
76 0
|
2天前
|
人工智能 安全 图形学
【AI落地应用实战】篡改检测技术前沿探索——从基于检测分割到大模型
在数字化洪流席卷全球的当下,视觉内容已成为信息交流与传播的核心媒介,然而,随着PS技术和AIGC技术的飞速发展,图像篡改给视觉内容安全带来了前所未有的挑战。 本文将探讨篡改检测技术的现实挑战,分享篡改检测技术前沿和最新应用成果。
|
2月前
|
机器学习/深度学习 人工智能 并行计算
"震撼!CLIP模型:OpenAI的跨模态奇迹,让图像与文字共舞,解锁AI理解新纪元!"
【10月更文挑战第14天】CLIP是由OpenAI在2021年推出的一种图像和文本联合表示学习模型,通过对比学习方法预训练,能有效理解图像与文本的关系。该模型由图像编码器和文本编码器组成,分别处理图像和文本数据,通过共享向量空间实现信息融合。CLIP利用大规模图像-文本对数据集进行训练,能够实现zero-shot图像分类、文本-图像检索等多种任务,展现出强大的跨模态理解能力。
235 2
|
21天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。