Skip to main content

概述

本概述涵盖基于文本的嵌入模型。LangChain 目前不支持多模态嵌入。
嵌入模型将原始文本——如句子、段落或推文——转换为固定长度的数字向量,该向量捕捉其语义含义。这些向量让机器能够基于含义而非精确词语来比较和搜索文本。 在实际应用中,这意味着具有相似思想的文本在向量空间中被放置在相近的位置。例如,嵌入技术可以检索到讨论相关概念的文档,即使使用了不同的措辞,而不仅仅是匹配“机器学习”这个短语。

工作原理

  1. 向量化 —— 该模型将每个输入字符串编码为一个高维向量。
  2. 相似度评分 —— 使用数学指标对向量进行比较,以衡量底层文本的关联程度。

相似度指标

通常使用几种指标来比较嵌入:
  • 余弦相似度 — 衡量两个向量之间的夹角。
  • 欧几里得距离 — 衡量点之间的直线距离。
  • 点积 — 衡量一个向量在另一个向量上的投影程度。
以下是计算两个向量之间余弦相似度的示例:
import numpy as np

def cosine_similarity(vec1, vec2):
    dot = np.dot(vec1, vec2)
    return dot / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

similarity = cosine_similarity(query_embedding, document_embedding)
print("Cosine Similarity:", similarity)

接口

LangChain 通过 Embeddings 接口,为文本嵌入模型(例如 OpenAI、Cohere、Hugging Face)提供了标准接口。 有两种主要方法:
  • embed_documents(texts: List[str]) → List[List[float]]: 嵌入文档列表。
  • embed_query(text: str) → List[float]: 嵌入单个查询。
该接口允许使用不同的策略对查询和文档进行嵌入,尽管实际上大多数提供商以相同的方式处理它们。

主要集成

缓存

嵌入可以被存储或临时缓存,以避免需要重新计算它们。 可以使用 CacheBackedEmbeddings 来缓存嵌入。该包装器将嵌入存储在键值存储中,其中文本会被哈希,哈希值则用作缓存中的键。 初始化 CacheBackedEmbeddings 的主要支持方法是 from_bytes_store。它接受以下参数:
  • underlying_embedder: 用于嵌入的嵌入器。
  • document_embedding_cache: 用于缓存文档嵌入的任何 ByteStore
  • batch_size: (可选,默认为 None) 两次存储更新之间要嵌入的文档数量。
  • namespace: (可选,默认为 "") 用于文档缓存的命名空间。有助于避免冲突(例如,将其设置为嵌入模型名称)。
  • query_embedding_cache: (可选,默认为 None) 用于缓存查询嵌入的 ByteStore,或使用 True 来复用与 document_embedding_cache 相同的存储。
import time
from langchain_classic.embeddings import CacheBackedEmbeddings  
from langchain_classic.storage import LocalFileStore 
from langchain_core.vectorstores import InMemoryVectorStore

# Create your underlying embeddings model
underlying_embeddings = ... # e.g., OpenAIEmbeddings(), HuggingFaceEmbeddings(), etc.

# Store persists embeddings to the local filesystem
# This isn't for production use, but is useful for local
store = LocalFileStore("./cache/") 

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings,
    store,
    namespace=underlying_embeddings.model
)

# Example: caching a query embedding
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")

# Subsequent calls use the cache
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")
在生产环境中,您通常会使用更健壮的持久化存储,例如数据库或云存储。请参阅 存储集成 以了解选项。

所有嵌入模型

Aleph Alpha

Anyscale

Ascend

AI/ML API

AwaDB

AzureOpenAI

Baichuan Text Embeddings

Baidu Qianfan

Baseten

Bedrock

BGE on Hugging Face

Bookend AI

Clarifai

Cloudflare Workers AI

Clova Embeddings

Cohere

DashScope

Databricks

DeepInfra

EDEN AI

Elasticsearch

Embaas

Fake Embeddings

FastEmbed by Qdrant

Fireworks

Google Gemini

Google Vertex AI

GPT4All

Gradient

GreenNode

Hugging Face

IBM watsonx.ai

Infinity

Instruct Embeddings

IPEX-LLM CPU

IPEX-LLM GPU

Intel Extension for Transformers

Jina

John Snow Labs

LASER

Lindorm

Llama.cpp

LLMRails

LocalAI

MiniMax

MistralAI

Model2Vec

ModelScope

MosaicML

Naver

Nebius

Netmind

NLP Cloud

Nomic

NVIDIA NIMs

Oracle Cloud Infrastructure

Ollama

OpenClip

OpenAI

OpenVINO

Optimum Intel

Oracle AI Vector Search

OVHcloud

Pinecone Embeddings

PredictionGuard

PremAI

SageMaker

SambaNovaCloud

SambaStudio

Self Hosted

Sentence Transformers

Solar

SpaCy

SparkLLM

TensorFlow Hub

Text Embeddings Inference

TextEmbed

Titan Takeoff

Together AI

Upstage

Volc Engine

Voyage AI

Xinference

YandexGPT

ZhipuAI

LangGraph 智能体

本指南将帮助你开始使用 LangGraph 构建智能体。我们将涵盖基础知识,然后展示如何使用 LangGraph 构建一个简单的智能体。

什么是智能体?

智能体是一个使用大型语言模型(LLM)来决定采取什么行动的系统。智能体可以访问工具,并可以使用这些工具来执行任务。智能体还可以访问记忆,并可以使用这些记忆来记住过去的交互。

LangGraph 智能体

LangGraph 是一个用于构建有状态、多参与者应用程序的库,它使用 LLM 来协调。LangGraph 智能体是 LangGraph 应用程序的一种,它使用 LLM 来决定采取什么行动。 LangGraph 智能体是构建智能体的强大方式,因为它们允许你:
  • 定义自定义状态:你可以定义智能体的状态,以及状态如何随时间变化。
  • 定义自定义逻辑:你可以定义智能体如何决定采取什么行动。
  • 定义自定义工具:你可以定义智能体可以使用的工具。
  • 定义自定义记忆:你可以定义智能体如何记住过去的交互。

构建一个简单的智能体

让我们构建一个简单的智能体,它可以访问一个搜索引擎和一个计算器。我们将使用 LangGraph 来构建这个智能体。

1. 安装依赖

首先,安装必要的依赖:
import numpy as np

def cosine_similarity(vec1, vec2):
    dot = np.dot(vec1, vec2)
    return dot / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

similarity = cosine_similarity(query_embedding, document_embedding)
print("Cosine Similarity:", similarity)

2. 设置环境

接下来,设置你的环境变量:
import time
from langchain_classic.embeddings import CacheBackedEmbeddings  
from langchain_classic.storage import LocalFileStore 
from langchain_core.vectorstores import InMemoryVectorStore

# Create your underlying embeddings model
underlying_embeddings = ... # e.g., OpenAIEmbeddings(), HuggingFaceEmbeddings(), etc.

# Store persists embeddings to the local filesystem
# This isn't for production use, but is useful for local
store = LocalFileStore("./cache/") 

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings,
    store,
    namespace=underlying_embeddings.model
)

# Example: caching a query embedding
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")

# Subsequent calls use the cache
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")

3. 定义工具

现在,定义智能体将使用的工具: CODE_BLOCK_2

4. 定义状态

接下来,定义智能体的状态: CODE_BLOCK_3

5. 定义智能体

现在,定义智能体本身: CODE_BLOCK_4

6. 编译智能体

接下来,编译智能体: CODE_BLOCK_5

7. 运行智能体

最后,运行智能体: CODE_BLOCK_6

下一步

现在你已经构建了一个简单的智能体,你可以开始探索更高级的功能。以下是一些你可以尝试的事情:
  • 添加记忆:你可以向智能体添加记忆,使其能够记住过去的交互。
  • 添加更多工具:你可以向智能体添加更多工具,使其能够执行更多任务。
  • 定义自定义逻辑:你可以定义自定义逻辑,使智能体能够做出更复杂的决策。
  • 定义自定义状态:你可以定义自定义状态,使智能体能够拥有更复杂的状态。
要了解更多信息,请查看 LangGraph 文档