如何使用 Llama 3 构建本地文件生成式搜索引擎(附源码&文档)

向量检索增强chatglm生成 1.总体介绍了基于向量检索的框架,主要分为两大块:内容存储、内容检索 2.具体介绍了内容存储部分技术细节:数据加载模块、数据切块模块、数据embbeding模块、数据存储模块及代码实现 3.具体介绍了内容检索部分:向量相似度召回+基于上下文生成问题答案,实现原理和实现代码 4.介绍了如何把向量检索生成封装成tool供agnet使用 ​ 项目代码:https://github.com/liangwq/Chatglm_lora_multi-gpu/tree/main/APP_example/chatglm 阅读详情

系统设计

为了构建一个本地生成式搜索引擎或助手,我们需要几个组建:

  1. 包含本地文件内容的索引,具有信息检索引擎,用于检索给定查询/问题的最相关文档。

  2. 大语言模型,用于从本地文档中选择内容并生成摘要答案

  3. 一个用户界面

这些组件的交互方式如下图所示。

首先,我们需要将本地文件索引到可以查询本地文件内容的索引中。

然后,当用户提出问题时,我们将使用创建的索引,以及一些不对称段落或文档embeddings,以检索可能包含答案的最相关文档。

这些文档的内容和问题将传递给本地部署的大型语言模型,该模型将使用给定文档的内容生成答案。

在指令提示prompt中,我们还会要求大语言模型返回所使用文档的引用。

最终,所有内容将在用户界面上向用户可视化呈现。

现在,让我们更详细地看每个组件如何工作和使用。

语义索引

构建一个语义索引,它将根据文件内容的相似性和给定的查询为我们提供最相关的文档。

为了创建这样的索引,我们将使用 Qdrant 作为向量存储(当然也此处也可以使用其他, 例如ElasticSearch)

Qdrant 客户端库 不需要完整安装 Qdrant 服务器,并且可以对适合工作内存(RAM)的文档进行相似性计算。因此,我们所需要做的就是 pip 安装 Qdrant 客户端。

可以按照以下方式初始化 Qdrant(请注意,由于pipeline流程的原因,hf 参数稍后定义,但是使用 Qdrant 客户端时,您已经需要定义使用哪种向量化方法和度量标准):

from qdrant_client import QdrantClient`              `from qdrant_client.models import Distance, VectorParams`              `client = QdrantClient(path="qdrant/")`              `collection_name = "MyCollection"`              `if client.collection_exists(collection_name):              ``client.delete_collection(collection_name)`              `   ``   ``client.create_collection(collection_name,vectors_config=VectorParams(size=768, distance=Distance.DOT))`              `qdrant = Qdrant(client, collection_name, hf)

为了创建向量索引,我们将不得不将文档embedding。对于embedding,我们将不得不选择正确的嵌入方法和正确的向量相似度度量标准。

可以使用多种段落、句子或单词嵌入方法,得到不同的结果。

基于文档创建embedding搜索的主要问题是不对称搜索的问题。

不对称搜索问题在信息检索中很常见,当查询较短且文档较长时会出现。单词或句子嵌入通常被微调以根据相似大小的文档(句子或段落)提供相似性分数。一旦不是这种情况,适当的信息检索可能会失败。

然而,我们可以找到一种嵌入方法,可以很好地解决不对称搜索问题。例如,通常在 MSMARCO 数据集上进行微调的模型效果很好。

MSMARCO 数据集基于必应搜索查询和文档,并由微软发布。因此,它非常适合我们正在处理的问题。

对于本文特定的实现,我选择了一个已经微调的模型,称为:

sentence-transformers/msmarco-bert-base-dot-v5

该模型基于 BERT,并且使用点积作为相似性度量进行了微调。我们已经初始化了 qdrant 客户端,以在以下行中使用点积作为相似性度量(请注意,此模型的维度为 768):

client.create_collection(collection_name,vectors_config=VectorParams(size=768, distance=Distance.DOT))

我们可以使用其他度量标准,例如余弦相似度,但是由于该模型是使用点积进行微调的,因此使用该度量标准将获得最佳效果。

此外,从几何角度来看:余弦相似度仅关注角度的差异,而点积同时考虑角度和大小。通过将数据归一化为具有统一大小,这两种度量变得等效。

在忽略大小有益的情况下,余弦相似度是有用的。然而,如果大小很重要,点积是更适合的相似性度量。

初始化 MSMarco 模型的代码如下(如果您有可用的 GPU,请使用它,尽管如此):

    `model_name = "sentence-transformers/msmarco-bert-base-dot-v5"``     model_kwargs = {'device': 'cpu'}               ``     encode_kwargs = {'normalize_embeddings': True}               ``     hf = HuggingFaceEmbeddings(               ``         model_name=model_name,               ``         model_kwargs=model_kwargs,               ``         encode_kwargs=encode_kwargs               ``)`  

接下来的问题是:由于transformer模型的二次内存要求,BERT 等模型的上下文大小受到限制。

在许多类似 BERT 的模型中,上下文大小设置为 512 个标记。有两种选择:

  1. 我们可以仅基于前 512 个标记的答案,并忽略文档的其余部分

  2. 创建一个索引,其中一个文档将被分成多个块并存储在索引中。

在第一种情况下,我们将丢失许多重要信息,因此我们选择了第二种变体。为了将文档分块,我们可以使用 LangChain 中的预构建块分割器:

from langchain_text_splitters import TokenTextSplitter`              `text_splitter = TokenTextSplitter(chunk_size=500, chunk_overlap=50)`              `texts = text_splitter.split_text(file_content)`              `metadata = []`              `for i inrange(0,len(texts)):              ``metadata.append({"path":file})`              `qdrant.add_texts(texts,metadatas=metadata)

在提供的代码部分中,我们将文本分块为 500 个tokens大小(一般系统默认是1024个),重叠 50 个tokens的窗口

这样我们可以在块结束或开始的地方保留一些上下文。在代码的其余部分,我们创建了包含用户硬盘上文档路径的元数据,并将这些带有元数据的块添加到索引中。

然而,在将文件内容添加到索引之前,我们需要读取它。甚至在读取文件之前,我们需要获取需要索引的所有文件。

为了简单起见,在这个项目中,用户可以定义一个要索引的文件夹。索引器以递归方式检索该文件夹及其子文件夹中的所有文件,并索引支持的文件(我们将看看如何支持 PDF、Word、PPT 和 TXT)。

我们可以以递归方式检索给定文件夹及其子文件夹中的所有文件:

`def get_files(dir):              ``     file_list = []               ``     for f in listdir(dir):               ``         if isfile(join(dir,f)):               ``             file_list.append(join(dir,f))               ``         elif isdir(join(dir,f)):               ``             file_list= file_list + get_files(join(dir,f))               ``return file_list` 

一旦在列表中检索到所有文件,我们可以读取包含文本的文件内容。在这个工具中,我们将支持 MS Word 文档(扩展名为“.docx”)、PDF 文档、MS PowerPoint 演示文稿(扩展名为“.pptx”)和纯文本文件(扩展名为“.txt”)。

为了读取 MS Word 文档,我们可以使用 docx-python 库。将文档读入字符串变量的函数如下:

import docx`              `def getTextFromWord(filename):              ``     doc = docx.Document(filename)               ``     fullText = []               ``     for para in doc.paragraphs:               ``         fullText.append(para.text)               ``    return'\n'.join(fullText)

类似的方法也可以用于 MS PowerPoint 文件。为此,我们需要下载并安装 pptx-python 库,并编写以下函数:

from pptx import Presentation`              `def getTextFromPPTX(filename):              ``     prs = Presentation(filename)               ``     fullText = []               ``     for slide in prs.slides:               ``         for shape in slide.shapes:               ``             fullText.append(shape.text)               ``    return'\n'.join(fullText)

读取文本文件非常简单:

f = open(file,'r')`              `file_content = f.read()`              `f.close()

在这种情况下,我们将使用 PyPDF2 库来读取 PDF 文件:

reader = PyPDF2.PdfReader(file)`              `for i inrange(0,len(reader.pages)):              ``    file_content = file_content + " "+reader.pages[i].extract_text()

最后,整个索引函数将如下所示:

file_content = ""              ``     forfile in onlyfiles:               ``         file_content = ""               ``         iffile.endswith(".pdf"):               ``             print("indexing "+file)               ``             reader = PyPDF2.PdfReader(file)               ``             for i inrange(0,len(reader.pages)):               ``                 file_content = file_content + " "+reader.pages[i].extract_text()               ``         eliffile.endswith(".txt"):               ``             print("indexing " + file)               ``             f = open(file,'r')               ``             file_content = f.read()               ``             f.close()               ``         eliffile.endswith(".docx"):               ``             print("indexing " + file)               ``             file_content = getTextFromWord(file)               ``         eliffile.endswith(".pptx"):               ``             print("indexing " + file)               ``             file_content = getTextFromPPTX(file)               ``         else:               ``             continue               ``         text_splitter = TokenTextSplitter(chunk_size=500, chunk_overlap=50)               ``         texts = text_splitter.split_text(file_content)               ``         metadata = []               ``         for i inrange(0,len(texts)):               ``             metadata.append({"path":file})               ``         qdrant.add_texts(texts,metadatas=metadata)               ``     print(onlyfiles)               ``    print("Finished indexing!")

生成式搜索 API

我们将使用 FastAPI 创建一个网络服务来托管我们的生成式搜索引擎。API 将访问 Qdrant 客户端,使用我们在上一节中创建的索引数据执行搜索,使用向量相似度度量来生成答案,并最终将答案提供给用户。

为了初始化和导入生成式搜索组件的库,我们可以使用以下代码:

`from fastapi import FastAPI`              `from langchain_community.embeddings import HuggingFaceEmbeddings`              `from langchain_qdrant import Qdrant`              `from qdrant_client import QdrantClient`              `from pydantic import BaseModel`              `import torch`              `from transformers import AutoTokenizer, AutoModelForCausalLM`              `import environment_var`              `import os`              `from openai import OpenAI`              `   ``   ``   ``class Item(BaseModel):              ``     query: str               ``     def__init__(self, query: str) -> None:               ``super().__init__(query=query)` 

如前所述,我们使用 FastAPI 创建 API 接口。我们将利用 qdrant_client 库访问我们创建的索引数据,并利用 langchain_qdrant 库进行额外支持。对于嵌入和本地加载 Llama 3 模型,我们将使用 PyTorch 和 Transformers 库。此外,我们将使用 OpenAI 库调用 NVIDIA NIM API,并将 API 密钥存储在我们创建的 environment_var(用于 Nvidia 和 HuggingFace)文件中。

我们创建了一个名为 Item 的类,它派生自 Pydantic 中的 BaseModel,用于传递给请求函数的参数。它将有一个名为 query 的字段。

现在,我们可以开始初始化我们的机器学习模型

model_name = "sentence-transformers/msmarco-bert-base-dot-v5"`              `model_kwargs = {'device': 'cpu'}`              `encode_kwargs = {'normalize_embeddings': True}`              `hf = HuggingFaceEmbeddings(              ``     model_name=model_name,               ``     model_kwargs=model_kwargs,               ``encode_kwargs=encode_kwargs`              `)
os.environ["HF_TOKEN"] = environment_var.hf_token`              `use_nvidia_api = False`              `use_quantized = True`              `if environment_var.nvidia_key !="":              ``     client_ai = OpenAI(               ``         base_url="https://integrate.api.nvidia.com/v1",               ``         api_key=environment_var.nvidia_key               ``     )               ``use_nvidia_api = True`              `elif use_quantized:              ``     model_id = "Kameshr/LLAMA-3-Quantized"               ``     tokenizer = AutoTokenizer.from_pretrained(model_id)               ``     model = AutoModelForCausalLM.from_pretrained(               ``         model_id,               ``         torch_dtype=torch.float16,               ``         device_map="auto",               ``)`              `else:              ``     model_id = "meta-llama/Meta-Llama-3-8B-Instruct"               ``     tokenizer = AutoTokenizer.from_pretrained(model_id)               ``     model = AutoModelForCausalLM.from_pretrained(               ``         model_id,               ``         torch_dtype=torch.float16,               ``         device_map="auto",               ``    )

在前几行中,我们加载了在 MSMARCO 数据上微调的基于 BERT 的模型的权重,我们还使用它来索引我们的文档。

然后,我们检查是否提供了 nvidia_key,如果提供了,我们将使用 OpenAI 库调用 NVIDIA NIM API。

当我们使用 NVIDIA NIM API 时,我们可以使用一个包含 70B 参数的 Llama 3 指令模型。如果未提供 nvidia_key,我们将在本地加载 Llama 3。

然而,在本地,至少对于大多数消费类电子产品来说,不可能加载 70B 参数模型。因此,我们将加载 Llama 3 8B 参数模型或额外进行量化的 Llama 3 8B 参数模型。

通过量化,我们节省了空间,并使模型能够在较少的 RAM 上执行。

例如,Llama 3 8B 通常需要约 14GB 的 GPU RAM,而 Llama 3 8B 量化后可以在 6GB 的 GPU RAM 上运行。因此,我们根据参数加载完整或量化模型。

现在我们可以初始化 Qdrant 客户端

client = QdrantClient(path="qdrant/")`              `collection_name = "MyCollection"`              `qdrant = Qdrant(client, collection_name, hf)

还有 FastAPI 并创建一个第一个模拟 GET 函数

app = FastAPI()              ``@app.get("/")`              `asyncdef root():              ``    return {"message": "Hello World"}

这个函数将以 JSON 格式返回 {“message”:“Hello World”}

然而,为了使此 API 起作用,我们将创建两个函数,一个仅执行语义搜索,而另一个将执行搜索,然后将前 10 个块作为上下文,并生成一个答案,引用它使用的文档。

@app.post("/search")`              `def search(Item:Item):              ``     query = Item.query               ``     search_result = qdrant.similarity_search(               ``         query=query, k=10               ``     )               ``     i = 0               ``     list_res = []               ``     for res in search_result:               ``         list_res.append({"id":i,"path":res.metadata.get("path"),"content":res.page_content})               ``    return list_res
@app.post("/ask_localai")`              `asyncdef ask_localai(Item:Item):              ``     query = Item.query               ``     search_result = qdrant.similarity_search(               ``         query=query, k=10               ``     )               ``     i = 0               ``     list_res = []               ``     context = ""               ``     mappings = {}               ``     i = 0               ``     for res in search_result:               ``         context = context + str(i)+"\n"+res.page_content+"\n\n"               ``         mappings[i] = res.metadata.get("path")               ``         list_res.append({"id":i,"path":res.metadata.get("path"),"content":res.page_content})               ``i = i +1`              `   ``   ``   `    `rolemsg = {"role": "system",``                "content": "Answer user's question using documents given in the context. In the context are documents that should contain an answer. Please always reference document id (in squere brackets, for example [0],[1]) of the document that was used to make a claim. Use as many citations and documents as it is necessary to answer question."}               ``     messages = [               ``         rolemsg,               ``         {"role": "user", "content": "Documents:\n"+context+"\n\nQuestion: "+query},               ``     ]               ``     if use_nvidia_api:               ``         completion = client_ai.chat.completions.create(               ``             model="meta/llama3-70b-instruct",               ``             messages=messages,               ``             temperature=0.5,               ``             top_p=1,               ``             max_tokens=1024,               ``             stream=False               ``         )               ``         response = completion.choices[0].message.content               ``     else:               ``         input_ids = tokenizer.apply_chat_template(               ``                 messages,               ``                 add_generation_prompt=True,               ``                 return_tensors="pt"               ``).to(model.device)`              `   `        `terminators = [``             tokenizer.eos_token_id,               ``             tokenizer.convert_tokens_to_ids("<|eot_id|>")               ``]`              `   ``   ``   `        `outputs = model.generate(``             input_ids,               ``             max_new_tokens=256,               ``             eos_token_id=terminators,               ``             do_sample=True,               ``             temperature=0.2,               ``             top_p=0.9,               ``         )               ``         response = tokenizer.decode(outputs[0][input_ids.shape[-1]:])               ``    return {"context":list_res,"answer":response}

这两个函数都是 POST 方法,我们使用我们的 Item 类通过 JSON 主体传递查询。第一个方法返回最相似的 10 个文档块,带有路径,并将文档 ID 从 0 到 9 进行分配。因此,它只是使用点积作为相似度度量进行普通语义搜索(这是在 Qdrant 中定义的,记住包含 distance=Distance.DOT 的行)。

第二个名为 ask_localai 的函数稍微复杂。它包含了第一个方法中的搜索机制(因此可能更容易通过那里的代码来理解语义搜索),但添加了一个生成部分。它创建了一个 Llama 3 的提示,其中包含系统提示消息中的指令:

使用上下文中提供的文档回答用户的问题。上下文中应包含应该包含答案的文档。请始终引用文档 ID(例如 [0],[1] 中的方括号)用于提出主张的文档。使用尽可能多的引用和文档来回答问题。

用户的消息包含一个文档列表,结构化为 ID(0-9),后跟文档块。为了保持 ID 和文档路径之间的映射,我们创建了一个名为 list_res 的列表,其中包括 ID、路径和内容。用户提示以单词 “Question” 结尾,后跟用户的查询。

响应包含上下文和生成的答案。然而,答案再次由 Llama 3 70B 模型(使用 NVIDIA NIM API)、本地 Llama 3 8B 或本地 Llama 3 8B 量化生成,具体取决于传递的参数。

API 可以从包含以下代码行的单独文件中启动(假设我们的生成式组件在名为 api.py 的文件中,因为 Uvicorn 中的第一个参数映射到文件名):

import uvicorn`              `   ``   ``if__name__=="__main__":              ``    uvicorn.run("api:app",host='0.0.0.0', port=8000, reload=False,  workers=3)

用户界面

我们本地生成式搜索引擎的最终组件是用户界面。我们将使用 Streamlit 构建一个简单的用户界面,其中包括一个输入栏,一个搜索按钮,一个用于显示生成的答案的部分,以及一个可以打开或下载的引用文档列表。

Streamlit 中用户界面的整个代码不到 45 行(确切地说是 44 行):

import re`              `import streamlit as st`              `import requests`              `import json`              `st.title('_:blue[Local GenAI Search]_ :sunglasses:')`              `question = st.text_input("基于您的本地文件提出问题", "")`              `if st.button("提出问题"):              ``     st.write("当前问题是 \"", question+"\"")               ``url = "http://127.0.0.1:8000/ask_localai"`              `   ``   `              `     payload = json.dumps({               ``       "query": question               ``     })               ``     headers = {               ``       'Accept': 'application/json',               ``       'Content-Type': 'application/json'               ``}`              `   ``   `              `response = requests.request("POST", url, headers=headers, data=payload)`              `   ``   `              `     answer = json.loads(response.text)["answer"]               ``     rege = re.compile("\[Document\ [0-9]+\]|\[[0-9]+\]")               ``     m = rege.findall(answer)               ``     num = []               ``     for n in m:               ``num = num + [int(s) for s in re.findall(r'\b\d+\b', n)]`              `   ``   `              `   ``   `              `     st.markdown(answer)               ``     documents = json.loads(response.text)['context']               ``     show_docs = []               ``     for n in num:               ``         for doc in documents:               ``             ifint(doc['id']) == n:               ``                 show_docs.append(doc)               ``     a = 1244               ``     for doc in show_docs:               ``         with st.expander(str(doc['id'])+" - "+doc['path']):               ``             st.write(doc['content'])               ``             withopen(doc['path'], 'rb') as f:               ``                 st.download_button("下载文件", f, file_name=doc['path'].split('/')[-1],key=a               ``                 )               ``                a = a + 1

最终效果如下图所示:

结论

本文展示了如何利用Qdrant使用生成式人工智能和语义搜索。它通常是一个在本地文件上引用索赔到本地文档的检索辅助生成(RAG)管道。整个代码大约有300行,我们甚至通过为用户提供在3种不同的Llama 3模型之间进行选择来增加了复杂性。对于这个用例,8B和70B参数模型都表现得非常好。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

Llama GEO:开源大模型时代的生成式引擎优化实战指南 生成式引擎优化(GEO)是面向开源大模型生态的新型可见性工程,其核心在于让品牌内容被llama.cpp、Ollama、vLLM等主流推理框架原生解析与优先引用。它不再依赖中心化搜索引擎排名,而是基于训练语料权重、社区信源信任度和RAG检索结构化标记三层协同机制,实现技术内容在分布式Llama实例中的稳定曝光。关键技术价值体现在对JSON-LD结构化数据、GGUF量化格式(如IQ4_NL)、MoE路由术语等底层要素的精准适配,广泛应用于开发者文档优化、硬科技企业出海、政务云AI基建等场景。本文聚焦Llama 阅读详情

相关推荐

Llama 3.2-Vision+Ollama实现端到端文档理解OCR

OCR(光学字符识别)本质是将图像中的文字信息转化为可计算文本,其核心瓶颈在于对版式、手写体、表格及语义关系的理解能力不足。传统方案依赖‘检测-识别-后处理’多阶段流水线,易受错误传播与结构丢失影响。而多模态大模型(VLM)如Llama 3.2-Vision通过联合建模像素与文本,支持原生图像输入与指令驱动的结构化输出,显著提升图文理解深度。结合Ollama轻量级本地部署框架,可在消费级GPU上实现低延迟、高隐私、强可控的端到端文档解析。该技术已广泛应用于财务票据识别、医疗报告结构化、工程图纸参数提取等需离

weixin_33690963的博客 496

《Llama 3大模型》技术报告中英文版,95页pdf

现代人工智能(AI)系统由基础模型驱动。本文介绍了一套新的基础模型,称为Llama 3。它是一群本地支持多语言、编码、推理和工具使用的语言模型。我们最大的模型是一个具有4050亿参数和高达128K令牌上下文窗口的密集Transformer。

2401_82469710的博客 1301

Llama 3 + Groq 超低延迟推理实战:从部署到生产落地

大语言模型推理延迟是制约AI产品实时性的核心瓶颈,其本质源于模型架构、硬件访存效率与编译调度三者的耦合失配。Llama 3凭借精简Tokenizer、高基数RoPE位置编码和BF16原生权重设计,显著提升推理友好性;Groq LPU则通过32MB片上SRAM全局缓冲与编译时静态调度,突破GPU内存墙限制,实现首token稳定<120ms的确定性延迟。这种软硬协同不仅压缩响应时间达12倍以上,更支撑起法律合同秒级审查、多语言客服同步响应、代码知识库即时问答等强实时场景。本文聚焦Llama 3在Groq平台的端

读书、思考、生活 547

【可能是全网最丝滑的LangChain教程】七、LCEL表达式语言

LangChain 表达式语言(LCEL)是一种声明式的方法,可以轻松地将多个链条组合在一起。LCEL 从第一天开始设计就支持将原型投入生产,无需进行代码更改,从最简单的“提示 + LLM”链条到最复杂的链条(我们见过人们在生产中成功运行包含数百个步骤的 LCEL 链条)。一流的流式支持当您使用 LCEL 构建链条时,您将获得最佳的首个令牌时间(即输出的第一块内容出现之前的经过时间)。

Jeffray1991的博客 1580

私有Copilot实战:基于Llama3的本地代码助手搭建指南

私有Copilot是企业级AI编码助手的核心范式,指在保障源码与敏感配置不出内网前提下,实现智能代码补全、解释与PR评审能力。其技术原理依托开源大模型(如Llama3)+ RAG增强 + 轻量推理框架的协同架构,通过高质量上下文注入弥补模型微调的高成本与低收益缺陷。技术价值在于平衡开发效率与数据主权,满足GDPR、等保2.0及内部审计刚性要求。典型应用场景包括金融、政务等强合规领域中对Java/Python/TypeScript代码库的实时辅助理解与生成。本文聚焦Llama3-8B-Instruct在A10

weixin_34275734的博客 561

LLama 使用手册

LLama 是一个基于深度学习的开源语言模型,它提供了强大的自然语言处理能力,可以应用于文本生成、问答系统、机器翻译等多个领域。本手册旨在介绍 LLama 的基本使用方法和功能,帮助用户快速上手并充分利用其强大的能力。如有任何疑问或建议,请随时联系我们。由于 LLama 是基于深度学习的模型,因此在运行时可能需要较大的计算资源,特别是 GPU。在使用 LLama 之前,需要对输入数据进行适当的预处理,例如分词、编码等。根据具体任务选择合适的预训练模型,不同模型在不同任务上可能表现出不同的性能。

Genio_Wang的博客 1011

LLMs之Llama-3:Llama 3的简介、安装和使用方法、案例应用之详细攻略

​ LLMs之Llama 3:Llama 3的简介、安装和使用方法、案例应用之详细攻略 目录 Llama 3的简介 Llama 3的安装和使用方法 Llama 3的案例应用 Llama 3的简介 2024年4月18日,Meta 重磅推出了Meta Llama 3,Llama 3是Meta最先进开源大型语言模型的下一代,包括具有80亿和700亿参数的预训练和指令微调的语言模型,能够支持广泛的应用场景。这一代Llama在一系列行业标准基准测试中展示了最

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5万+

大语言模型训练与推理模型构建源码解读(huggingface)

我们已搭建了llama训练与推理方法,而llama模型来源huggingface提供。为此,本节来解读huggingface的llma模型训练与推理源码解读。

weixin_38252409的博客 1115

使用 Meta Llama 家族构建生成式 AI 应用:Llama 3.1 原生函数调用与 Llama 3.2 多模态实战指南

本文是开源课程 [generative-ai-for-beginners](https://link.gitcode.com/i/7b096106016bef9b1678f7350a177691) 第 21 课《Building With the Meta Family Models》(对应西班牙语译文 [translations/es/21-meta/README.md](https://lin

gitblog_00048的博客 830

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 455

SAP 零售 FMS 物料主数据(一)

SAP 零售 FMS 物料主数据(一) SAP 对于鞋服行业最新的解决方案-FMS(相当于原来的AFS+Retail);更偏向与零售; 商品主数据与原来的AFS大不相同,取消了原来的Grid的网格概念,取而代之的是变式;商品主数据维护也偏向于Retail的维护模式;事物代码也不是MM01而是MM41 /MM46; 在维护商品主数据前,需要与商品部沟通定义各种商品相关的规范如编码规则,大中小类 ,颜色库,尺码库等,此处不赘述; 创建商品需要确定哪些物料是变式物料,哪些是常规不带特性的单一物料;这决定了在创建商

weixin_45518759的博客 5061

Astrid OS Book:源码驱动文档生成与 mdBook 技术参考书构建实践

> **导读**:本文讲解 Unicity Astrid OS 官方技术参考书(The Unicity Astrid OS Book)的构建方式与文档工程实践。这本以 [mdBook](https://github.com/rust-lang/mdBook) 构建的 canonical reference 覆盖内核、胶囊模型、宿主 ABI、总线与安全模型,且其关键附录(能力目录、宿主 ABI 错误

gitblog_00429的博客 687

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2663

Local Deep Research 接入 Elasticsearch 搜索引擎:从索引构建到高级查询的完整实战指南

本文围绕 [docs/elasticsearch_search_engine.md](https://link.gitcode.com/i/b03219beeebc65a89c5a34a3fe437581) 展开,系统讲解如何在 Local Deep Research(LDR)项目中接入并配置 Elasticsearch 搜索引擎,覆盖环境安装、代码级调用、Query String / DSL 高

gitblog_00043的博客 88

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8780

使用SSC添加大量的SDO条目

使用SSC添加大量的SDO条目 SSC用表格添加SDO,PDO部分必须指定到0x1600和0x1A00分配TxPdo和RxPdo映射,在0x1C12和0x1C13分别分配到SM2和SM3。在0x6000和0x7000未指定的entry就是SDO部分。

PI_sunyang的博客 3166

OpenCore Legacy Patcher:为停更的老 Mac 打上系统补丁,四步装上新版 macOS

你的 2011 年 Mac mini 在"软件更新"页面看到了"此 Mac 不受支持",但 CPU 和内存明明还能再战。OpenCore Legacy Patcher(OCLP)是一个基于 Python 的开源补丁工具,它通过替换引导加载程序并注入兼容性补丁,让苹果已停止支持的旧款 Intel Mac 能够安装并运行 Big Sur 到 Sequoia 的 macOS。整个过程不刷写固件,所有修改

gitblog_00535的博客 89

直流母线电压采集与缓冲调理电路

本文介绍了一种直流母线电压采集与缓冲调理电路的设计与应用。该电路通过电阻分压网络将高压直流母线电压降至适合ADC采样的范围,并采用运放电压跟随器实现高输入阻抗和低输出阻抗的缓冲功能,有效提高采样精度和抗干扰能力。文章重点阐述了低输出阻抗对驱动负载、抗干扰和电压稳定的重要性,并列举了该电路在工业电源监测、电动汽车BMS、通信电源和储能系统等领域的典型应用场景。

qq_37999850的博客 319

五一超级课堂---Llama3-Tutorial(Llama 3 超级课堂)---第三节llama 3图片理解能力微调(xtuner+llava版)

课程文档:课程视频:操作平台:请参照第一节课完成环境配置和webdemo部署以及源码拉取和安装。

haidizym的博客 1148

Allegro如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层

在Allegro做PCB设计的时候,如果需要复制器件的位号到其它层是无法直接实现的,如果直接拷贝器件的位号的话,效果如下。但是Allegro的Cross Copy命令是支持复制任何属性的图形到其它层的,下面以复制器件位号和丝印外框为例说明。同样如果使用Z-copy命令,也是无法Z-copy text的,Finds下方texts是灰色的。如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层。另外cap处可以选择线段的端点是圆形,八角形,或者方形的铜皮。拷贝C1013,出现的是C*

weixin_54787054的博客 2671

2022中山大学计算机技术专硕考研初试、复试经验帖

个人简介 推荐几个我自己感觉对考研非常有帮助的小助手吧。可以帮助节省时间! 考研时间规划总览 初试篇 数学 英语 政治 408 复试篇 机试 笔试 面试 关于选导师 个人感言

zik的博客 1万+

qmd 快速上手:3 条命令搭好本地文档搜索引擎,从安装到第一次检索

满盘的 Markdown 笔记、会议记录和接口文档散落在各个目录里,想找"上周谁定的支付方案"时,你只能挨个翻文件夹或者用 grep 硬搜。本文带你把 qmd 这套完全离线的本地文档搜索引擎跑起来:先装好并让第一条搜索命令出结果,再看它内部的数据流,最后讲清配置项和两个最常见的坑。 ## 🚀 三步出结果:安装、建索引、第一条搜索 跑通 qmd 只需要一个终端和一个目录。下面的命令串起来执行,

gitblog_00267的博客 539

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (十一)

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (十一)

大模型与Agent智能体 908

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Meta Llama 3 模型卡深度解析:8B/70B 架构、训练数据、基准评测与负责任使用实践(llama3 开源仓库)

本篇技术指南以官方 [MODEL_CARD.md](https://link.gitcode.com/i/8a565de3ebb0723ed5d300bc0b0dd7e5) 为骨架,结合本仓库(`GitHub_Trending/ll/llama3`)的推理源码([llama/model.py](https://link.gitcode.com/i/2a648871eab95bb9654ed5751

gitblog_01095的博客 134

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

基于阿里云PAI部署LLaMA Factory 完成Llama3低代码微调和部署

该教程介绍了如何使用 PAI 和 LLaMA Factory 框架,基于轻量化 LoRA 方法微调 Llama-3 模型,使其能够进行中文问答和角色扮演,同时通过验证集 ROUGE 分数和人 工测试验证了微调的效果。在后续实践中,可以使用实际业务数据集,对模型进行微调, 得到能够解决实际业务场景问题的本地领域大模型(完)

kun20031029的专栏 2531

3 分钟搭好 qmd:不用服务器的本地搜索引擎,个人文档检索即刻可用

qmd 是一个本地搜索引擎,专门给个人文档、会议笔记和知识库用:BM25 关键词检索与向量检索并行跑,再用本地 LLM 重排,专治"关键词搜不准、语义词搜不到"。本文带你从克隆代码到第一次真实出搜索结果,再把 `index.yml` 配成自己的索引,全程不需要部署任何服务。 ## 谁适合用它 如果你有一堆散落的 `.md` 笔记、会议纪要或项目文档,找资料时经常翻不到,又不想把内容交给云端搜索

gitblog_00934的博客 139
上一篇: 原理与实战:利用Agent技术提升AI应用效能
下一篇: RAG中,根据查询意图驱动的Router逻辑分析
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值