如何让你的大模型变得更强?如何确定其获取信息起源的准确性?
想要答复这两个问题,就不得不提到明天文章的配角——RAG。RAG,也就是检索加强生成(Retrieval-augmented generation),能够补救现有 LLM 利用能力的技术。
以后,LLM 的最大问题就是不足最新的常识和特定畛域的常识。对于这一问题,业界有两种次要解决办法:微调和检索加强生成。业内许多公司(如 Zilliz、OpenAI 等)都认为相比微调,RAG 是更好的解决办法。归根究底是因为微调的老本更高,须要应用的数据也更多,因而次要实用于格调迁徙(style transfer)的场景。相比之下,RAG 办法应用例如 Milvus 之类的向量数据库,从而将常识和数据注入到利用中,更实用于通用场景。
采纳 RAG 办法就意味着应用向量数据库存储真谛数据,这样能够确保利用返回正确的信息和常识,而不是在不足数据时产生幻觉,捏造答复。不过,随着越来越多的文档、用例等信息被注入利用中,越来越多开发者意识到信息起源的重要性,它能够确保信息准确性,使得大模型的答复更加实在。
这就须要用到援用或者归属(attribution)。如果返回的响应带有援用或者归属,那么咱们就能够理解该响应内容来自于哪个文档或文档中的哪个片段。因而,本文将详解为 LLM 退出援用的重要性,以及如何获取援用起源。
01. 如何增加 RAG 援用源?
正如上文所说,RAG(https://zilliz.com/use-cases/llm-retrieval-augmented-generation) 援用源是一种通用的解决方案,能够为 LLM 利用的响应增加援用源,从而为响应提供更多上下文信息。那么如何为响应增加 RAG 援用源呢?其实有很多解决办法。你既能够将文本块存储在向量数据库中,也能够应用 LlamaIndex 之类的框架。
接下来就让咱们深刻代码,学习如何同时应用 LlamaIndex 和 Milvus(https://zilliz.com/what-is-milvus) 为 LLM 响应增加援用源。
开始之前
开始前,先通过 pip install milvus llama-index python-dotenv
装置所需工具和框架。milvus
和 llama-index
是外围性能,而 python-dotenv
用于加载环境变量,例如 OpenAI 的 API 密钥。
在本示例中,咱们从百科中获取了不同城市的数据,并进行查问,最终取得带援用的响应。
首先,导入一些必要的库并加载 OpenAI API 密钥,同时也须要用到 LlamaIndex 的 7 个子模块。在本示例中,OpenAI
用于拜访 LLM,CitationQueryEngine
用于创立援用查问引擎,MilvusVectorStore
用于将 Milvus 作为向量存储数据库。此外,导入 VectorStoreIndex
来应用 Milvus,SimpleDirectoryReader
用于读取本地数据,以及 StorageContext
和 ServiceContext
用于拜访 Milvus。最初,用 load_dotenv
加载咱们的 OpenAI API 密钥。
from llama_index.llms import OpenAI
from llama_index.query_engine import CitationQueryEngine
from llama_index import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
ServiceContext,
)
from llama_index.vector_stores import MilvusVectorStore
from milvus import default_server
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")
获取测试数据
首先筹备和解决数据,上面的代码从百科 API 中获取了 wiki_titles
列表中提到的页面并将后果保留到本地文件中。
wiki_titles = ["Toronto", "Seattle", "San Francisco", "Chicago", "Boston", "Washington, D.C.", "Cambridge, Massachusetts", "Houston"]
from pathlib import Path
import requests
for title in wiki_titles:
response = requests.get(
'<https://en.wikipedia.org/w/api.php>',
params={
'action': 'query',
'format': 'json',
'titles': title,
'prop': 'extracts',
'explaintext': True,
}
).json()
page = next(iter(response['query']['pages'].values()))
wiki_text = page['extract']
data_path = Path('data')
if not data_path.exists():
Path.mkdir(data_path)
with open(data_path / f"{title}.txt", 'w') as fp:
fp.write(wiki_text)
在 LlamaIndex 中设置向量存储(Vector Store)
数据筹备实现后,能够设置带应用逻辑。首先,咱们须要启动向量数据库。在本例中,咱们应用 Milvus Lite,因为它能够间接在笔记本电脑上运行。而后,用 LlamaIndex 的 MilvusVectorStore 模块连贯 Milvus,将其作为向量存储。
default_server.start()
vector_store = MilvusVectorStore(
collection_name="citations",
host="127.0.0.1",
port=default_server.listen_port
)
接着,为索引创立上下文,从而帮忙索引和检索器理解须要应用哪些服务。本例应用 GPT 3.5 Turbo。此外,咱们还须要创立一个存储上下文,以便索引晓得在哪里存储和查问数据。本例应用上述创立的 Milvus 向量存储。
service_context = ServiceContext.from_defaults(llm=OpenAI(model="gpt-3.5-turbo", temperature=0)
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
设置实现后能够加载此前爬取的数据,并创立向量存储索引。
documents = SimpleDirectoryReader("./data/").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context, storage_context=storage_context)
带援用的查问
这一步能够创立一个援用查问引擎。能够设置向量索引,返回后果数量以及援用文本块大小。随后运行查问命令。
query_engine = CitationQueryEngine.from_args(
index,
similarity_top_k=3,
# 此处咱们能够管制援用起源的粒度,默认值为 512
citation_chunk_size=512,
)
response = query_engine.query("Does Seattle or Houston have a bigger airport?")
print(response)
for source in response.source_nodes:
print(source.node.get_text())
响应如下所示:
02. 总结
RAG 利用是风行的 LLM 利用。本文教学了如何为 RAG 增加援用或归属。
具体来看,能够应用 LlamaIndex 作为数据路由器,Milvus 作为向量存储来构建带有援用的 RAG 利用。本文提供的示例代码先从百科上获取一些数据,而后启动一个 Milvus 实例,并在 LlamaIndex 中创立一个向量存储实例。将数据存入 Milvus 中,并应用 LlamaIndex 构建援用查问引擎来追踪返回响应的归属和援用源。
🌟「寻找 AIGC 时代的 CVP 实际之星」专题流动行将启动!
Zilliz 将联合国内头部大模型厂商一起甄选利用场景,由单方提供向量数据库与大模型顶级技术专家为用户赋能,一起打磨利用,晋升落地成果,赋能业务自身。
如果你的利用也适宜 CVP 框架,且正为利用落地和实际效果发愁,可间接申请参加流动,取得最业余的帮忙和领导!分割邮箱为 business@zilliz.com。
- 如果在应用 Milvus 或 Zilliz 产品有任何问题,可增加小助手微信“zilliz-tech”退出交换群。
- 欢送关注微信公众号“Zilliz”,理解最新资讯。
本文由 mdnice 多平台公布