Gemini API:使用 LangChain 和 Pinecone 进行问答

本教程面向有编程基础的开发者,深入讲解如何结合 Gemini、LangChain 和 Pinecone 构建基于检索增强生成(RAG)的问答系统。文章从环境配置、API 密钥设置开始,逐步实现检索器(加载网页、生成嵌入、存储到 Pinecone)和生成器(构建提示、创建 LCEL 链)两大核心组件。通过实际代码示例,读者将掌握 RAG 架构的完整流程,并了解如何利用向量数据库高效检索上下文以增强 LLM 回答的准确性。教程还提供了常见错误排查和生产优化建议,帮助开发者将理论快速落地到实际项目中。

技术背景

大型语言模型(LLM)在训练时使用的是公开的、静态的数据集,因此无法直接回答关于私有或实时数据的问题。RAG(检索增强生成)通过检索外部知识源(如文档、数据库)并将相关内容注入提示词,使 LLM 能够基于最新、最相关的信息生成答案。本教程选择 Gemini 作为 LLM,LangChain 作为编排框架,Pinecone 作为向量数据库,三者结合可构建高性能的问答系统。适用场景包括企业知识库问答、客服助手、文档检索等。主要限制包括:依赖外部数据质量、检索延迟、以及 API 成本。

核心原理

RAG 架构包含两个核心阶段:检索器(Retriever)和生成器(Generator)。检索器负责将用户查询转换为嵌入向量,并在向量数据库中查找最相似的文档片段;生成器则将检索到的片段与原始问题拼接成提示,交给 LLM 生成答案。本教程中,网页内容通过 WebBaseLoader 加载,使用 Gemini 的嵌入模型(gemini-embedding-001)生成 3072 维向量,存储到 Pinecone 索引中。检索时,Pinecone 使用余弦相似度计算向量距离,返回最相关的文档。生成阶段使用 LangChain 表达式语言(LCEL)构建链,将检索结果格式化为上下文,与问题一起输入到 ChatGoogleGenerativeAI(gemini-3.7-flash)模型,最终通过输出解析器得到答案。

架构分析

系统架构分为数据准备、向量存储、检索和生成四层。数据准备层使用 WebBaseLoader 加载网页,并通过字符串分割提取关键内容。向量存储层初始化 Pinecone 客户端,创建 Serverless 索引(维度 3072,余弦距离),然后通过 PineconeVectorStore.from_documents 将文档嵌入并存储。检索层通过 as_retriever 创建检索器,支持相似性搜索。生成层使用 LCEL 定义链:context 由检索器输出经 format_docs 格式化,question 通过 RunnablePassthrough 传递,然后依次经过 PromptTemplate、LLM 和 StrOutputParser。设计决策包括:使用 Serverless 索引以降低成本,选择余弦距离以衡量语义相似性,采用 stuff 链将所有文档合并到提示中(适用于文档量小的场景)。

完整实战教程

##### 版权所有 2026 Google LLC。

# @title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Gemini API:使用 LangChain 和 Pinecone 进行问答

注意: 此笔记本需要付费层级速率限制才能正常运行。(更多详情请参阅定价)。

概述

Gemini 是一系列生成式 AI 模型,让开发者能够生成内容并解决问题。这些模型经过设计和训练,可以处理文本和图像作为输入。

LangChain 是一个数据框架,旨在让大型语言模型(LLM)如 Gemini 更容易集成到应用程序中。

Pinecone 是一个云优先的向量数据库,允许用户以超低查询延迟搜索数十亿个嵌入向量。

在本笔记本中,您将学习如何借助 Gemini、LangChain 和 Pinecone 创建一个应用程序,该应用程序使用网站上的数据来回答问题。

设置

首先,您必须安装软件包并设置必要的环境变量。

安装

安装 LangChain 的 Python 库 langchain 和 LangChain 的 Gemini 集成包 langchain-google-genai。接下来,安装 LangChain 的 Pinecone 新版本集成包 langchain-pinecone 以及 Pinecone 的 Python SDK pinecone-client。最后,安装 langchain-community 以便稍后访问 WebBaseLoader 模块。

%pip install --quiet -U langchain
%pip install --quiet -U langchain-google-genai
%pip install --quiet -U langchain-pinecone
%pip install --quiet -U pinecone
%pip install --quiet -U langchain-community
%pip install --quiet -U bs4

配置你的 API 密钥

要运行以下单元格,你的 API 密钥必须存储在名为 GEMINI_API_KEY 的 Colab 密钥中。如果你还没有 API 密钥,或者不确定如何创建 Colab 密钥,请参阅 身份验证 示例。

import os
from google.colab import userdata
GEMINI_API_KEY=userdata.get('GEMINI_API_KEY')

os.environ["GEMINI_API_KEY"] = GEMINI_API_KEY

设置 Pinecone

要在你的应用中使用 Pinecone,你必须拥有一个 API 密钥。要创建 API 密钥,你需要先设置一个 Pinecone 账户。访问 Pinecone 的应用页面,然后注册或登录你的账户。接着,导航到“API 密钥”部分并复制你的 API 密钥。

关于获取 API 密钥的更详细说明,你可以阅读 Pinecone 的 快速入门文档。

设置环境变量 PINECONE_API_KEY 来配置 Pinecone 使用你的 API 密钥。

PINECONE_API_KEY=userdata.get('PINECONE_API_KEY')

os.environ['PINECONE_API_KEY'] = PINECONE_API_KEY

基本步骤

LLM是在大型公共数据语料库上离线训练的。因此,如果没有额外的上下文,它们无法基于自定义或私有数据准确回答问题。

如果你想利用LLM基于私有数据回答问题,你必须在提示词中提供相关文档作为上下文。这种方法称为检索增强生成(RAG)。

你将使用这种方法,通过LangChain集成的Gemini文本模型创建一个问答助手。该助手预期回答关于Gemini模型的问题。为了实现这一点,你将使用网站上的数据为助手添加更多上下文。

在本教程中,你将实现基于RAG架构的两个主要组件:

  1. 检索器(Retriever)

根据用户的查询,检索器检索相关的片段,这些片段为文档添加上下文。在本教程中,文档是网站数据。

相关的片段作为上下文传递给下一阶段——“生成器”。

  1. 生成器(Generator)

来自网站数据的相关片段与用户的查询一起传递给LLM,以生成准确的答案。

在接下来的章节中,你将在实现应用程序时了解更多关于这些阶段的内容。

导入所需的库

from langchain import hub
from langchain import PromptTemplate
from langchain.docstore.document import Document
from langchain.document_loaders import WebBaseLoader
from langchain.schema import StrOutputParser
from langchain.schema.prompt_template import format_document
from langchain.schema.runnable import RunnablePassthrough
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_pinecone import PineconeVectorStore
from pinecone import Pinecone as pc
from pinecone import ServerlessSpec

检索器

在此阶段,您将执行以下步骤:

  1. 使用 LangChain 读取并解析网站数据。
  1. 创建网站数据的嵌入。

嵌入是文本的数值表示(向量)。因此,具有相似含义的文本将具有相似的嵌入向量。您将使用 Gemini 的嵌入模型来创建网站数据的嵌入向量。

  1. 将嵌入存储在 Pinecone 的向量存储中。

Pinecone 是一个向量数据库。Pinecone 向量存储有助于高效检索相似的向量。因此,为了向 LLM 的提示添加上下文,可以使用 Pinecone 轻松检索与用户问题匹配的文本的相关嵌入。

  1. 从 Pinecone 向量存储创建检索器。

检索器将用于将相关的网站嵌入与用户查询一起传递给 LLM。

读取并解析网站数据

LangChain 提供了多种多样的文档加载器。要将网站数据作为文档读取,你将使用 LangChain 中的 WebBaseLoader。

要了解更多关于如何使用 LangChain 的文档加载器从不同来源读取和解析输入数据,请阅读 LangChain 的文档加载器指南。

loader = WebBaseLoader("https://blog.google/technology/ai/google-gemini-ai/")
docs = loader.load()

如果你只想选择网站数据中的特定部分来为提示添加上下文,可以使用正则表达式、文本切片或文本分割。

在本例中,你将使用Python的split()函数来提取所需部分的文本。提取的文本应转换回LangChain的Document格式。

# Extract the text from the website data document
text_content = docs[0].page_content
# The text content between the substrings "code, audio, image and video." to
# "Cloud TPU v5p" is relevant for this tutorial. You can use Python's `split()`
# to select the required content.
text_content_1 = text_content.split("code, audio, image and video.",1)[1]
final_text = text_content_1.split("Cloud TPU v5p",1)[0]

# Convert the text to LangChain's `Document` format
docs = [Document(page_content=final_text, metadata={"source": "local"})]

初始化 Gemini 的嵌入模型

为了从网站数据创建嵌入,你将使用 Gemini 的嵌入模型 gemini-embedding-001,该模型支持创建文本嵌入。

要使用此嵌入模型,你需要从 LangChain 导入 GoogleGenerativeAIEmbeddings。要了解更多关于嵌入模型的信息,请阅读 Google AI 的语言文档。

from langchain_google_genai import GoogleGenerativeAIEmbeddings

gemini_embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-001")

使用 Pinecone 存储数据

要创建 Pinecone 向量数据库,首先必须使用之前设置的 API 密钥初始化 Pinecone 客户端连接。

在 Pinecone 中,向量嵌入必须存储在索引中。索引代表向量数据的顶层组织单元。任何索引中的向量必须具有相同的维度和用于计算相似性的距离度量。您可以在 Pinecone 的索引文档 中了解更多关于索引的信息。

首先,您将使用 Pinecone 的 create_index 函数创建一个索引。Pinecone 允许您创建两种类型的索引:Serverless 索引和基于 Pod 的索引。Pinecone 的免费入门计划只允许您创建一个项目和一个基于 Pod 的入门索引,该索引具有足够的资源来支持 100,000 个向量。对于本教程,您必须创建一个基于 Pod 的入门索引。要了解更多关于不同索引及其创建方式的信息,请阅读 Pinecone 的 创建索引指南。

接下来,您将使用 LangChain 的 Pinecone.from_documents 将之前从网站数据中提取的文档插入到新创建的索引中。在底层,此函数使用指定的嵌入模型从 LangChain 的文档加载器创建的文档中生成嵌入,并将它们插入到 Pinecone 向量数据库的指定索引中。

在调用 from_documents 函数从网站数据创建向量数据库时,您必须指定使用 LangChain 的 WebBasedLoader 创建的 docs 以及 gemini_embeddings 作为嵌入模型。

# Initialize Pinecone client

pine_client= pc(
    api_key = os.getenv("PINECONE_API_KEY"),  # API key from app.pinecone.io
    )
index_name = "langchain-demo"

# First, check if the index already exists. If it doesn't, create a new one.
if index_name not in pine_client.list_indexes().names():
    # Create a new index.
    # https://docs.pinecone.io/docs/new-api#creating-a-starter-index
    print("Creating index")
    pine_client.create_index(name=index_name,
                      # `cosine` distance metric compares different documents
                      # for similarity.
                      # Read more about different distance metrics from
                      # https://docs.pinecone.io/docs/indexes#distance-metrics.
                      metric="cosine",
                      # The Gemini embedding model `gemini-embedding-001` uses
                      # 3072 dimensions.
                      dimension=3072,
                      # The `pod_type` is the type of pod to use.
                      # Read more about different pod types from
                      # https://docs.pinecone.io/docs/pod-types.
                      # Specify the pod details.
                      spec=ServerlessSpec(
                        cloud="aws",
                        region="us-east-1"
                        ),
    )
    print(pine_client.describe_index(index_name))

vectorstore = PineconeVectorStore.from_documents(docs,
                      gemini_embeddings, index_name=index_name)

使用 Pinecone 创建检索器

现在,你将创建一个检索器,它可以从新创建的 Pinecone 向量存储中检索网站数据嵌入。这个检索器稍后可用于传递嵌入,为 LLM 提供更多上下文,以回答用户的问题。

调用上一步中初始化的向量存储的 as_retriever 函数来创建检索器。

retriever = vectorstore.as_retriever()
# Check if the retriever is working by trying to fetch the relevant docs related
# to the word 'MMLU'(Massive Multitask Language Understanding). If the length is
# greater than zero, it means that the retriever is functioning well.
print(len(retriever.invoke("MMLU")))

生成器

当用户提问时,生成器会提示LLM给出答案。你在上一阶段从Pinecone向量库创建的检索器将用于将网站数据中的相关嵌入传递给LLM,从而为用户查询提供更多上下文。

在此阶段,你将执行以下步骤:

  1. 将以下内容链接在一起:
  2. * 一个用于使用检索器提取相关嵌入的提示。

    * 一个用于使用LangChain回答任何问题的提示。

    * 一个来自Gemini的LLM模型,用于提示。

  1. 以问题作为输入运行创建的链,以提示模型给出答案。

初始化 Gemini

您必须从 LangChain 导入 ChatGoogleGenerativeAI 来初始化您的模型。

在此示例中,您将使用 gemini-3.7-flash,因为它支持文本摘要。要了解更多关于文本模型的信息,请阅读 Google AI 的语言文档。

您可以通过在初始化 ChatGoogleGenerativeAI LLM 时传递适当的值来配置模型参数,例如 *temperature* 或 *top_p*。要了解有关这些参数及其用途的更多信息,请阅读 Google AI 的概念指南。

from langchain_google_genai import ChatGoogleGenerativeAI

# To configure model parameters use the `generation_config` parameter.
# eg. generation_config = {"temperature": 0.7, "topP": 0.8, "topK": 40}
# If you only want to set a custom temperature for the model use the
# "temperature" parameter directly.

llm = ChatGoogleGenerativeAI(model="gemini-3.7-flash")

创建提示模板

你将使用 LangChain 的 PromptTemplate 来生成向 LLM 提问的提示。

在 llm_prompt 中,变量 question 稍后将被输入的问题替换,变量 context 将被从 Pinecone 向量存储中检索到的网站相关文本替换。

# Prompt template to query Gemini
llm_prompt_template = """You are an assistant for question-answering tasks.
Use the following context to answer the question.
If you don't know the answer, just say that you don't know.
Use five sentences maximum and keep the answer concise.

Question: {question}
Context: {context}
Answer:"""

llm_prompt = PromptTemplate.from_template(llm_prompt_template)

print(llm_prompt)

创建 stuff 文档链

LangChain 提供了 Chains,用于将 LLM 与其他组件或彼此链接,以构建复杂应用。在此应用中,您将创建一个 stuff 文档链。stuff 文档链允许您合并所有相关文档,将其插入提示中,并将该提示传递给 LLM。

您可以使用 LangChain 表达式语言 (LCEL) 创建 stuff 文档链。

要了解不同类型的文档链,请阅读 LangChain 的 chains 指南。

此应用的 stuff 文档链会检索相关的网站数据,并将其作为上下文与输入问题一起传递给 LLM 提示。

# Combine data from documents to readable string format.
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

# Create stuff documents chain using LCEL.
# This is called a chain because you are chaining
# together different elements with the LLM.
# In the following example, to create a stuff chain,
# you will combine content, prompt, LLM model, and
# output parser together like a chain using LCEL.
#
# The chain implements the following pipeline:
# 1. Extract data from documents and save to the variable `context`.
# 2. Use the `RunnablePassthrough` option to provide question during invoke.
# 3. The `context` and `question` are then passed to the prompt and
#    input variables in the prompt are populated.
# 4. The prompt is then passed to the LLM (`gemini-3.7-flash`).
# 5. Output from the LLM is passed through an output parser
#    to structure the model response.
rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | llm_prompt
    | llm
    | StrOutputParser()
)

提示模型

现在,你可以通过向之前创建的 stuff documents 链的 invoke() 函数传递任何问题来查询 LLM。

from IPython.display import Markdown

Markdown(rag_chain.invoke("What is Gemini?"))

总结

Gemini API 与 Langchain 配合使用效果极佳。集成过程无缝衔接,并提供了便捷的接口,可用于:

下一步?

本笔记本仅展示了 langchain 与 Gemini API 的一种可能用例。你可以在此处找到更多示例。

常见问题

常见错误:1) API 密钥未正确设置,导致认证失败;解决:确保 GEMINI_API_KEY 和 PINECONE_API_KEY 已设置。2) Pinecone 索引维度不匹配,嵌入模型输出维度与索引维度不一致;解决:检查 gemini-embedding-001 的维度为 3072,创建索引时需指定相同维度。3) 免费计划限制,可能无法创建 Serverless 索引;解决:使用基于 Pod 的入门索引,或升级付费计划。4) 检索结果为空,可能因文档内容过短或分割不当;解决:调整文本分割逻辑,确保提取足够内容。5) 网络问题导致加载失败;解决:检查 URL 可访问性,或使用本地文件。生产环境优化:使用批量嵌入、缓存检索结果、增加索引分区、监控延迟和成本。

企业应用扩展

本教程展示了基础的 RAG 流程,可扩展的方向包括:1) 使用不同的文档加载器(如 PDF、数据库)以支持更多数据源。2) 引入重排序(reranking)机制提升检索精度。3) 使用多轮对话记忆,使问答系统支持上下文关联。4) 优化提示模板,加入系统指令或 few-shot 示例。5) 部署为 API 服务,使用 FastAPI 或 Cloud Functions。6) 集成监控和日志系统,跟踪检索质量和模型响应。7) 探索其他向量数据库(如 Weaviate、Qdrant)或云服务(如 Vertex AI 向量搜索)。

总结

本教程面向有编程基础的开发者,深入讲解如何结合 Gemini、LangChain 和 Pinecone 构建基于检索增强生成(RAG)的问答系统。文章从环境配置、API 密钥设置开始,逐步实现检索器(加载网页、生成嵌入、存储到 Pinecone)和生成器(构建提示、创建 LCEL 链)两大核心组件。通过实际代码示例,读者将掌握 RAG 架构的完整流程,并了解如何利用向量数据库高效检索上下文以增强 LLM 回答的准确性。教程还提供了常见错误排查和生产优化建议,帮助开发者将理论快速落地到实际项目中。

内容来源与验证

继续系统学习

站内还有更多完整实战教程

加入会员,解锁全部教程、完整代码与持续更新内容。

加入会员
查看全部RAG 与知识库教程