万字详解,和你用RAG+LangChain实现chatpdf

利用LangChain实现RAG 通过实际代码例子详细阐述如何实现RAG(检索增强生成) 阅读详情

像chatgpt这样的大语言模型(LLM)可以回答很多类型的问题,但是,如果只依赖LLM,它只知道训练过的内容,不知道你的私有数据:如公司内部没有联网的企业文档,或者在LLM训练完成后新产生的数据。(即使是最新的GPT-4 Turbo,训练的数据集也只更新到2023年4月)所以,如果我们开发一个聊天机器人,可以与自己的文档对话,让LLM基于文档的信息回答我们的问题,是一件很有意义的事情。

本次我们会基于RAG的原理,通过LangChain来实现与pdf文档对话。

本次用到的文档放在这里的docs目录:github.com/fireshort/l… 我们这次会以吴恩达教授CS229(斯坦福的机器学习课程)的pdf为例子。

什么是RAG?

RAG是Retrieval-augmented generation(检索增强生成)的简称,它结合了检索和生成的能力,为文本序列生成任务引入额外的外部知识(通常是私有的或者是实时的数据),就是用外部信息来增强LLM的知识。RAG 将传统的语言生成模型与大规模的外部知识库相结合,使模型在生成响应或文本时可以动态地从这些知识库中检索相关信息。这种结合方法旨在增强模型的生成能力,使其能够产生更为丰富、准确和有根据的内容,特别适合需要具体细节或外部事实支持的场合。

RAG一般分为下面几步:

检索:对于给定的输入(问题),模型首先使用检索系统从大型文档集合中查找相关的文档或段落。这个检索系统通常基于密集向量搜索。

上下文编码:找到相关的文档或段落后,模型将它们与原始输入(问题)一起放到Prompt里。

生成:使用编码的上下文信息,模型生成输出(答案)。这通常通过大模型完成。

Untitled.png

RAG原理

使用LangChain实现

RAG看起来还是比较抽象,我们接下来会用LangChain实现,可以细分为下面5步: Untitled.jpeg

  1. Document Loading:文档加载器把 Documents 加载为以 LangChain 能够读取的形式。
  2. Splitting:文本分割器把 Documents 切分为指定大小的、语义上有意义的块,一般称为“文档块”或者“文档片”。
  3. Storage:将上一步中分割好的“文档块”以“嵌入”(Embedding)的形式存储到向量数据库(Vector DB)中,形成一个个的“嵌入片”。
  4. Retrieval:应用程序从存储中检索分割后的文档(例如通过比较余弦相似度,找到与输入问题类似的嵌入片)。
  5. Output:把问题和相似的文档块传递给语言模型(LLM),使用包含问题、检索到的文档块的提示生成答案。

注意,最新版的openai库与当前的LangChain不兼容,要安装0.28.1版的openai库。

!pip install openai==0.28.1

要先用.env文件来初始化环境变量。

关于如何用.env文件初始化环境变量和LangChain的入门教程,推荐阅读专栏《基于LangChain的LLM应用开发》:juejin.cn/column/7290…

from langchain.document_loaders import PyPDFLoader
from langchain.memory import ConversationBufferMemory
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chat_models import AzureChatOpenAI
from langchain.chains import ConversationalRetrievalChain

# 用.env文件初始化环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # read local .env file

文档加载

为了创建一个与pdf文档对话的应用,首先要将pdf文档加载为LangChain可以使用的格式。LangChain提供了文档加载器来完成这件事。LangChain有超过80种不同类型的文档加载器。

文档加载器把各种不同来源的数据格式转换成标准化的格式:Document类,包括page_content(文档内容)和关联的metadata(元数据,如果是pdf的话会包括来源和页码{‘source’: ‘docs/cs229_lectures/MachineLearning-Lecture01.pdf’, ‘page’: 0});如果是其他的文档类型,如Notion则没有页码)

需要先安装pypdf库:! pip install pypdf

# 加载文档
pdffiles = [
    "docs/cs229_lectures/MachineLearning-Lecture01.pdf",
    "docs/cs229_lectures/MachineLearning-Lecture01.pdf",  # 故意重复以模拟杂乱数据
    "docs/cs229_lectures/MachineLearning-Lecture02.pdf",
    "docs/cs229_lectures/MachineLearning-Lecture03.pdf"
]
docs = []
for file_path in pdffiles:
    loader=PyPDFLoader(file_path)
    docs.extend(loader.load())

print(f"The number of docs:{len(docs)}")
# print(docs[0])

这里故意重复加载第一章的pdf,目的是为了演示如何处理重复数据。在实际的工程中,即使经过数据清洗,很多时候也难以避免重复数据。

文档分割

文档已经加载了,但是这些文档仍然相当大,我们需要将加载的文本分割成更小的块,以便进行嵌入和向量存储。这一步很重要,因为我们对文档检索,只需要检索最相关的内容,没必要加载整个巨大的文档,一般只需要得到与主题相关的段落或句子就够了。

这一步看似简单,在实际实现的时候,有很多细节要考虑。

LangChain 中,文本分割器的工作原理如下:将文本分成小的、具有语义意义的块。开始将这些小块组合成一个更大的块,直到达到一定的大小。一旦达到该大小,一个块就形成了,可以开始创建新文本块。这个新文本块和刚刚生成的块要有一些重叠,以保持块之间的上下文。

LangChain 提供的各种文本拆分器可以帮助你从下面几个角度设定你的分割策略和参数:文本如何分割、块的大小chunk_size、块之间重叠文本的长度chunk_overlap。

  • CharacterTextSplitter

CharacterTextSplitter只是简单粗暴的按字符长度来分割,很容易切断语义关联的段落/句子,一般只用来测试。

  • TokenTextSplitter

TokenTextSplitter是按Token的长度来切割,一般用来理解Token的含义和位置。

  • MarkdownHeaderTextSplitter

MarkdownHeaderTextSplitter(Markdown标题文本切割器)适合用来切割markdown格式的文本,可以按标题或子标题来切割md文件,并且把标题/子标题的信息添加到元数据。

  • RecursiveCharacterTextSplitter

对于普通文本,一般使用RecursiveCharacterTextSplitter。RecursiveCharacterTextSplitter会根据默认的分隔符[“\n\n”, “\n”, " ", “”]递归地分割文本,通常可以很好地保持段落、句子和单词在一起,语义也相对比较完整。

some_text = """When writing documents, writers will use document structure to group content. \
This can convey to the reader, which idea's are related. For example, closely related ideas \
are in sentances. Similar ideas are in paragraphs. Paragraphs form a document. \n\n  \
Paragraphs are often delimited with a carriage return or two carriage returns. \
Carriage returns are the "backslash n" you see embedded in this string. \
Sentences have a period at the end, but also, have a space.\
and words are separated by space."""
r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=150,
    chunk_overlap=20,
)
r_splitter.split_text(some_text)

这是输出结果:

[“When writing documents, writers will use document structure to group content. This can convey to the reader, which idea’s are related. For example,”, ‘For example, closely related ideas are in sentances. Similar ideas are in paragraphs. Paragraphs form a document.’, ‘Paragraphs are often delimited with a carriage return or two carriage returns. Carriage returns are the “backslash n” you see embedded in this’, ‘embedded in this string. Sentences have a period at the end, but also, have a space.and words are separated by space.’]

chunk_size块大小设为了150个字符,实际上由于递归地分割文本,最终文本块的长度会≤150。块之间重叠文本的长度chunk_overlap被设为20,但是实际上也会考虑分隔符,重叠文本长度会≤20,甚至可能没有重叠。在一块的开头保留上一块结尾的一部分内容,有助于保持上下文的连贯性。

对于特殊的文本,如FAQ之类,切割的时候可以强制把问题和答案放在一起,这样检索的时候可以保证能把相关的文本找出来。总的原则是块的语义尽量相关。这个也算某种意义的“高内聚”?

选定了分割器之后,代码很简单:

# 文档分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1500,
    chunk_overlap=150
)
splits = text_splitter.split_documents(docs)
print(f"The number of splits:{len(splits)}")
# print(splits[0])

向量库存储

紧接着,我们将这些分割后的文本转换成嵌入的形式,并将其存储在向量数据库中。向量数据库有很多种,比如 Pinecone、Weaviate、Chroma 和 Qdrant,有收费的,也有开源的。在本文的例子中,我们使用了 OpenAIEmbeddings 来生成嵌入,然后使用 Chromadb这个向量数据库来存储嵌入(需要 pip install chromadb)。

什么是嵌入(Embedding)?嵌入就是文本在向量空间中的数字表示。内容相似的文本在向量空间中会有相似的向量值。

# 向量库存储
embedding = OpenAIEmbeddings()
persist_directory = 'docs/chroma/'

# 由于接口限制,每次只能传16个文本块,需要循环分批传入
for i in range(0, len(splits), 16):
    batch = splits[i:i+16]
    vectordb = Chroma.from_documents(
        documents=batch,
        embedding=embedding,
        persist_directory=persist_directory
    )
vectordb.persist() #保存下来,后面可以直接使用

# 已经保存到向量数据库,从数据库里读取
vectordb = Chroma(persist_directory=persist_directory,
                  embedding_function=embedding)
print(vectordb._collection.count())

吴恩达教授的机器学习pdf文件已经以“文档块嵌入片”的格式被存储在向量数据库里面了。我们只需要查询这个向量数据库,就可以找到大体上相关的信息。

这里我们是通过OpenAIEmbeddings 来手动对文本生成嵌入,再将嵌入保存到向量数据库。也有的向量数据库是创建集合(类似mongodb的集合)的时候指定Embedding 模型,在存储的时候只需要保存纯文本,就会自动将文本对应按照 Embedding 模型的嵌入保存到一个固定的字段Vector。(参考《腾讯向量数据库-连接并写入原始文本》:cloud.tencent.com/document/pr…)

检索

当文档存储到向量数据库之后,我们需要根据问题和任务来提取最相关的信息。此时,信息提取的基本方式就是把问题也转换为向量,然后去和向量数据库中的各个向量进行比较,然后选择最相似的前n个分块。最后将这n个最相似的分块与问题一起传递给LLM,就可以得到答案。

# 检索
metadata_field_info = [
    AttributeInfo(
        name="source",
        description="The lecture the chunk is from, should be one of `docs/cs229_lectures/MachineLearning-Lecture01.pdf`, `docs/cs229_lectures/MachineLearning-Lecture02.pdf`, or `docs/cs229_lectures/MachineLearning-Lecture03.pdf`",
        type="string",
    ),
    AttributeInfo(
        name="page",
        description="The page from the lecture",
        type="integer",
    ),
]
document_content_description = "Lecture notes"
llm = AzureChatOpenAI(deployment_name="GPT-4", temperature=0)
self_query_retriever= SelfQueryRetriever.from_llm(
    llm,
    vectordb,
    document_content_description,
    metadata_field_info,
    search_type="mmr",
    search_kwargs={'k': 5, 'fetch_k': 10},
    verbose=True
)

compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
    base_compressor = compressor,
    base_retriever = self_query_retriever
)

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)
qa = ConversationalRetrievalChain.from_llm(
    llm=llm,
    chain_type="stuff",
    # retriever=retriever,
    retriever=compression_retriever,
    memory=memory
)

我们先定义一个SelfQueryRetriever,这个Retriever命名有点“圣人之道,吾性自足,不假外求”的味道,其实就是调用LLM,利用FewShotPromptTemplate来确定是否要用文档块的元数据来过滤查询到的文档块。如果我们提问“what did they say about regression in the third lecture?”,LLM会加上一个filter:

{
    "query": "regression",
    "filter": "eq(\\"source\\", \\"docs/cs229_lectures/MachineLearning-Lecture03.pdf\\")"
}

self_query_retriever还定义了这两个参数,这两个是一起的:

search_type = “mmr”, search_kwargs = {‘k’: 5, ‘fetch_k’: 10},

search_type= “mmr” 是Maximum marginal relevance的缩写,最大边际相关性的意思

fetch_k=10:向量数据库返回10个相关的文档块

k=5:从返回的10个文档块中挑出5个最不相干的文档

很多情况下,search_type设置为mmr会比similarity好,如果设置为similarity,像我们前面故意加载了重复的pdf文件,会出现两个完全一样的文档块,那样既浪费token,得到的信息也不完整。这个其实也是“兼听则明,偏信则暗”的道理,决策前能尽量听取不同角度的意见,最后的决策就不容易出现偏差。

接下来我们定义了一个ContextualCompressionRetriever,通过base_retriever = self_query_retriever ,将它与self_query_retriever 连接起来。ContextualCompressionRetriever的用途是对取到的每一块文本块通过LLM进行总结,去掉无关紧要的废话。这里只是演示,我觉得意义不太大,一次问答就多了几次LLM调用,成本增大了几倍,响应时间也长了不少。

最后,我们通过ConversationalRetrievalChain.from_llm将文档块和用户的问题传给LLM,LLM返回最终的答案。

使用的Prompt类似:

Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Use three sentences maximum. Keep the answer as concise as possible. Always say "thanks for asking!" at the end of the answer.

{context}

Question: {question}

Helpful Answer:

文档块的内容会放到{context},用户的问题放到{question}。

chain_type设置为stuff,那么文档块的内容是直接拼接在一起放到{context}。还有 map_reduce、refine、map_rerank等chain_type,可以查询LangChain文档了解具体的使用情景。一般上下文没有超的话,还是用stuff比较合适。

我们还定义了ConversationBufferMemory来记录聊天历史,有了它,文档问答机器人才可以和我们畅聊。

如我们先问“Is probability a class topic?” AI回答:Yes, the context indicates that familiarity with basic probability and statistics is assumed for the class.

接着问:why are those prerequisites needed? 如果直接把这个问题传给向量数据库,向量数据库是给不出答案的。现在有了ConversationBufferMemory,LLM查找历史纪录将问题转为:Why are basic probability and statistics considered prerequisites for the class?

再推荐一次LangChain的smith平台,没有这个平台,没那么容易看清楚这些纷纷扰扰的细节:smith.langchain.com/

Untitled 1.png

生成回答并展示

这一步是问答系统应用的主要 UI 交互部分,我们创建一个 Flask 应用(需要安装 Flask 包)接收用户的问题,并生成相应的答案,最后通过 index.html 对答案进行渲染和呈现。

在这一步,我们使用了之前创建的 ConversationalRetrievalChain链来获取相关的文档块和生成答案。然后,将这些信息返回给用户,显示在网页上。

# Output 问答系统的UI实现
from flask import Flask, request, render_template

app = Flask(__name__)  # Flask APP

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        # 接收用户输入作为问题
        question = request.form.get('question')
        # ConversationalRetrievalChain链 - 读入问题,生成答案
        result = qa({"question": question})
        print(result)
        # 把大模型的回答结果返回网页进行渲染
        return render_template('index.html', result=result)

    return render_template('index.html')

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True, port=5000)

Untitled 2.png

延伸

目前用RAG+LangChain技术来与我们的文档对话还是有点麻烦,OpenAI最新发布的Assistants API大大简化了:只需要上传文档,不需要为您的文档计算和存储嵌入,也不需要实现分块和搜索算法,Assistants API会根据在ChatGPT中构建知识检索的经验,优化使用何种检索技术。

目前Assistants API还处于Beta阶段。后面估计其他大模型厂商也会跟上,推出类似的接口。不过RAG+LangChain还是不能放下,这个处理虽然麻烦,但是可以掌控更多的细节,有更多的应用场景。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

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

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

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

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

LangChain入门2 RAG详解 最常见的方法是嵌入每个文档分割的内容,并将这些嵌入插入到矢量数据库(或矢量存储)中。当我们想搜索分割时,我们采用文本搜索查询,嵌入它,并执行某种“相似性”搜索,以识别嵌入与查询嵌入最相似的存储分割。我们将使用LCEL Runnable协议来定义链,使我们能够以透明的方式将组件和函数管道连接在一起,在LangSmith中自动跟踪我们的链,从而获得流式、异步和批量调用。我们想要创建一个简单的应用程序,该应用程序接受用户问题,搜索与该问题相关的文档,将检索到的文档和初始问题传递给模型,并返回答案。 阅读详情

相关推荐

基于 RAG 和 LangChain 的 PDF 问答系统——ChatPDF

这篇文章用来介绍如何使用 RAG 技术与 LangChain 框架创建一个基于 PDF 文件的问答系统。 之前在《阿里云百炼构建私有知识问答应用》中构建了基于本地知识库的医疗智能体应用,构建过程为黑盒,本文以代码形式展示基于 PDF 文档的白盒问答系统。

2301_81658352的博客 2254

RAG全解析和LangChain代码实现

大家好,自从人们意识到可以用自有数据为大型语言模型(LLM)增效之后,就开始讨论如何最有效地弥合 LLM 的通用知识与专有数据之间的差距。围绕着微调还是检索增强生成(RAG)哪个更适合这一问题,人们展开了激烈的争论。本文重点介绍 RAG 的概念,首先介绍其理论,然后会继续展示如何使用LangChain进行编排、OpenAI 语言模型和 Weaviate 向量数据库来实现一个简单的 RAG 流水线。

csdn1561168266的博客 5222

与 PDF 对话:用 LangChain 和 Gradio 打造你的 AI 助手

通过 LangChain 和 Gradio,我们快速搭建了 ChatPDF 应用,让用户能自然语言与 PDF 互动。核心技术基于 RAG(检索增强生成),通过检索文档片段并结合 OpenAI 模型生成答案,特别适合处理大型文档。未来可优化支持更多文件格式,或使用更强大的模型提升准确性。对于非英语 PDF,建议关注支持多语言的模型或调整参数。

qq_38220914的博客 989

LangChain知识库构建与RAG设计

#加载文档import os#总结文档#翻译一下文档#精炼文档,删除除了某个主题或关键词之外的内容,仅保留与主题相关的内容。

Box_clf的博客 4135

超越ChatPDF!用IBM Docling和LangChain打造能读Excel/PPT的AI助手

本文介绍了如何利用IBM Docling和LangChain构建一个超越传统ChatPDF的多格式文档AI助手。该方案能统一解析PDF、Excel、PPT及扫描件,保留文档语义结构,并基于检索增强生成(RAG)技术实现智能问答,有效解决了复杂表格、图文混排等办公场景中的文档处理难题。

dropout6artist的博客 788

从向量检索到对话式应用:基于FAISS与LangChain构建智能ChatPDF系统

向量检索作为信息检索的核心技术,通过将文本转换为高维向量表示,实现了语义层面的相似性匹配。其原理基于嵌入模型将离散的文本映射到连续的向量空间,使得语义相近的内容在空间中也彼此接近。这项技术的核心价值在于能够突破传统关键词匹配的局限,实现更精准、更智能的文档内容理解与检索。在工程实践中,向量检索常与大型语言模型结合,形成检索增强生成(RAG)架构,广泛应用于智能问答、知识库构建和文档分析等场景。本文聚焦于如何利用FAISS向量数据库和LangChain框架,解决文档智能分块、海量向量快速检索以及检索结果与大模

weixin_33690367的博客 649

万字详解:利用RAG与LangChain打造ChatPDF应用

RAG是Retrieval-augmented generation(检索增强生成)的简称,它结合了检索和生成的能力,为文本序列生成任务引入额外的外部知识(通常是私有的或者是实时的数据),就是用外部信息来增强LLM的知识。RAG 将传统的语言生成模型与大规模的外部知识库相结合,使模型在生成响应或文本时可以动态地从这些知识库中检索相关信息。这种结合方法旨在增强模型的生成能力,使其能够产生更为丰富、准确和有根据的内容,特别适合需要具体细节或外部事实支持的场合。

2401_84204207的博客 1246

【大模型RAG实战】基于LangChain实现RAG应用

大模型应用开发框架LangChain被开发者广泛应用。接下来介绍LangChain中与RAG相关的组件,并利用LangChain构建一个可视化的大模型RAG应用,用于回答指定PDF中的相关问题。

sysu_lluozh 1864

如何用ChatPDF实现本地化RAG?5分钟快速上手教程

ChatPDF是一款基于本地大语言模型(LLM)实现检索增强生成(RAG)功能的开源工具,支持PDF、DOC、TXT等多种文件格式的智能问答。无需依赖第三方agent库,纯原生实现从文档解析到知识问答的全流程,让你轻松搭建本地化的文档智能交互系统。 ## 🚀 为什么选择ChatPDF实现本地化RAG? 本地化RAG技术正在成为企业和个人处理敏感文档的首选方案。ChatPDF凭借以下核心优势脱

gitblog_00113的博客 345

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 505

ArcGIS+PLUS+InVEST三件套:从零搞定生态系统服务模拟预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建一套完整的生态系统服务模拟预测工作流。内容涵盖从统一数据预处理、PLUS模型多情景模拟,到InVEST模型量化评估的全过程,并提供了关键脚本和避坑指南,旨在帮助研究者和从业者高效解决土地利用变化与生态系统服务评估结合的实际难题。

weixin_42522857的博客 139

Spring AI(12) :ChatPDF-实现ChatPDF应用

ChatPDF 是一种基于大型语言模型(如 ChatGPT)构建的智能文档交互应用。它的核心功能是允许用户像与人对话一样,与 PDF、Word、TXT 等格式的文档进行问答交流。用户上传文档后,系统会提取并理解文档内容,然后用户可以用自然语言提问,ChatPDF 会从文档中找出相关信息并生成清晰、准确的回答。简单来说,ChatPDF 让静态文档“活”了起来,变成了一个可以随时咨询的“知识专家”。

不积跬步,无以至千里 305

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 743

ChatPDF 开源项目教程

ChatPDF 是一个基于 Python 的开源项目,旨在通过自然语言处理技术,实现与 PDF 文档的交互式对话。该项目利用先进的机器学习模型,允许用户通过简单的文本输入,从 PDF 文档中提取信息或进行问答。ChatPDF 不仅适用于个人用户快速获取文档信息,也适用于企业级应用,如知识库管理、客户服务自动化等。 ## 项目快速启动 ### 环境准备 在开始之前,请确保您的系统已安装 Pyt...

gitblog_00612的博客 967

Redhawk-SC输入件配置中的5个常见错误及解决方法

本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。

earth的博客 233

YOLOv10改进,YOLOv10添加DICAM,用于水下图像增强模块,以提高朦胧水下图像的质量、对比度和色偏

在水下环境中,成像设备会出现水浑浊、光衰减、散射和颗粒问题,导致图像质量低、对比度差和彩色图像有偏差。这给使用传统视觉技术进行水下状态监测和检查带来了巨大挑战。近年来,水下图像增强因其在提高当前计算机视觉任务在水下目标检测和分割中的性能方面发挥着关键作用而受到越来越多的关注。由于主要从自然场景构建的现有方法在提高色彩丰富度和分布方面存在性能限制,作者提出了一种新颖的基于深度学习的方法,即 Deep Inception 和 Channel-wise Attention Modules (DICAM),以提高朦

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 480

【亲测免费】 推荐开源项目:local-rag-example - 在本地构建自己的ChatPDF

推荐开源项目:local-rag-example - 在本地构建自己的ChatPDF 1、项目介绍 local-rag-example 是一个独特的开源项目,它允许开发者在本地环境中构建和运行类似ChatPDF的交互式文档应用。该项目基于 langchain,一个强大的自然语言处理库,以及 streamlit,一个用于创建数据应用程序的优秀工具。通过这个项目,你可以轻松地创建一个能够理解和回应用户...

gitblog_00035的博客 769

【腾讯小龙虾WorkBuddy专栏05】深度解析WorkBuddy连接器(Connector)

深度解析WorkBuddy连接器(Connector)

AI人人懂 1315

AI产品经理必须知道的技术 之 RAG

在对用户问题进行Embedding前,对问题进行补充完善。避免用户问题太过简单、或者有明显错误。也可以考虑将用户问题,进行主题关键词抽取,或者使用知识图谱等进行初步的信息识别。这么做的目的是,避免用户的问题,信息太多太杂,导致检索出来的相关文档,与用户提问意图关联不大。也就是对用户问题进行简化。在检索文档时,可以增加一些过滤条件,例如指定章节、关键词包含、日期筛选、相似度阈值等,以使检索出来的内容更准确。对检索结果,也可考虑将相似度,与文档自身的权重进行综合加权。使提供给大模型的内容资料是最优的。

aolan123的博客 1519

thinkphp6/8 - 实现评论区发表评论、回复评论功能数据库表设计与整个逻辑思路过程分析,tp5 评论盖楼等功能(附带源码稍加改造即可使用)

tp5评论区数据库表设计,tp5发表回复评论功能设计,thinkphp5如何做评论功能,tp5 php评论区实现发表回复删除评论,tp5评论区盖楼源码及数据表设计思路,thinkphp评论功能详细教程,thinkphp实现评论与回复功能,thinkphp实现文章评论和回复评论功能,tp5实现评论回复功能,thinkphp如何实现评论区,tp5网站PC移动端h5怎么做评论区发表留言及回复功能,thinkphp实现评论区插件,thinkphp评论区相互发表回复功能详细教程,thinkphp有没有评论区的组件插件

✅ 精选推荐文章 3159

【网络协议】【TSN】精讲TSN工作原理!图解超赞超详细!!!

TSN有一个服务等级(class of service,CoS)的概念。对TSN网络而言,不同优先级的服务对应图3中的PCP码。3位PCP码定义了0(最低)~7(最高)这8个优先级,传输类型分别对应基础、最大努力、卓越努力、严苛应用、延时和抖动小于100 ms的视频、延时和抖动小于10 ms的音频、内部网络控制、网络控制。其会对网络场景进行不同的匹配,是后续调度、配置设计中会考虑到的数据流调度因素。

风云说通信 2632

从 RAG 到 Self-RAG —— LLM 的知识增强

事实上这种 LLM 主动使用工具并进行判断的方式并非 Self-RAG 首创,在此之前的 AutoGPT, Toolformer 和 Graph-Toolformer 中早已有之,而且支持多种 API 调用。针对 graph reasoning 任务设计少量 API Call 样本基于 ChatGPT 对 prompt 进行 augmentation使用现有 pre-train LLM 进行模型 fine-tuning。

python12345_的博客 1331

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于 Langchain 和 Streamlit,构建多 PDF RAG 聊天机器人

与 PDF 互动是很酷的。你可以与你的笔记、书籍和文档等进行聊天。本文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序,通过对话 AI 聊天机器人来读取、处理和互动PDF数据。以下是该应用程序的工作步骤,用简单的语言进行说明。

Python_cocola的博客 1207

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 哦豁!有了这份学习路径,AI大模型小白也能学懂大模型!!
下一篇: 一份在阿里内网悄悄流传的大模型面试真题!(2025年最新)
AI程序猿人
博客等级 码龄3年 6517粉丝 561原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值