[Python]大模型应用开发 langchain 之 langchain 入门

什么 langchain ?

LangChain是一个用于开发由大型语言模型( LLMs )支持的应用程序的框架。

从下面开始我们认知常用的 langchain 常用的生态库以及知识点。

资源库

langchain 有自己的生态,下面是 langchain 生态的一些常用的资源:

  • langchain /langchainjs
  • langchain 集成
  • langchain api
  • langserve
  • LangSmith
  • langgraph/langgraph cloud

langchain 不仅支持 Python 生态,也支持 TypeScript/JavaScript 生态,意味着开发者可以使用 JS 生态开发 AI 应用。

目前的 langchain 的版本是: v0.3+。langchain 集成众多的 llm 和组件,使得 AI 开发变得容易。

langchain 经典架构图

LCEL

LCEL 全称 LangChain Expression Language,是一种创建任意自定义链的方法。

核心模块和安装

langchain 目前是 v0.3+ 版本,如果使用了旧版本,可能有内容发生了变化。这里还是以 Python 为例:

  • langchain-core
  • langchain-community
  • langchain
  • langgraph
  • langserve
  • langsmith
  • langchain-cli

如果你是使用 pip 作为安装工具:

sh

pip install langchain-core
pip install langchain
pip install langsmith
pip install -U langgraph
pip install "langserve[all]"
pip install -U langchain-cli

# 社区
pip install langchain_community

# 大模型
pip install langchain-openai
pip install -qU langchain-anthropic

langchain 组件

langchain 提供了很多的组件帮助开发方便的开发 LLM 应用:

术语 说明
Prompt Template 提示词模板,用于定义输入给模型的格式和内容。
Example selectors 示例选择器,用于从一组示例中选择适当的示例以供参考或生成响应。
Chat models 聊天模型,专门设计用于与用户进行对话和互动的语言模型。
Messages 消息,指用户与模型之间的交流内容。
LLM 大模型(旧语言模型),指大型预训练语言模型,通常用于生成和理解文本。
Output parsers 输出解释器,用于处理和格式化模型生成的输出,使其更易于使用。
Document loaders 文档加载器,用于将文档内容加载到系统中以便处理和分析。
Text splitters 文本分割器,用于将长文本分割成较小的部分,以便更好地处理和分析。
Embedding models 嵌入模型,将文本转换为向量表示,以便进行相似度计算和检索。
Vector stores 向量存储,保存向量数据的数据库或系统,以支持高效的检索和查询。
Retrievers 检索器,负责从存储中获取相关数据或信息的组件。
Indexing 索引,建立数据结构以支持快速搜索和检索。
Tools 工具,辅助完成特定任务的软件组件或功能。
Multimodal 多模型,涉及处理和分析多种数据类型(如文本、图像等)的能力。
Agents 代理(智能体),自动化执行特定任务的智能系统或程序。
Callbacks 回调,允许在特定事件发生时执行自定义代码的机制。
自定义组件 用户自定义的模块或功能,以扩展系统的功能或适应特定需求。

py

# PromptTemplate, ChatPromptTemplate
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate 
prompt_template = PromptTemplate.from_template("Tell me a joke about {topic}") 
prompt_template = ChatPromptTemplate([  
    ("system", "You are a helpful assistant"),  
    ("user", "Tell me a joke about {topic}")  
])

prompt_template.invoke({"topic": "cats"})

# example_selector
class BaseExampleSelector(ABC):
    """Interface for selecting examples to include in prompts."""

    @abstractmethod
    def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:
        """Select which examples to use based on the inputs."""
        
    @abstractmethod
    def add_example(self, example: Dict[str, str]) -> Any:
        """Add new example to store."""

prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    # ...
)

# chat model
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")

# message
from langchain_core.messages import HumanMessage
model.invoke([HumanMessage(content="Hello, how are you?")])

# llm 
from langchain_openai import OpenAI  
llm = OpenAI(model="gpt-3.5-turbo-instruct", n=2, best_of=2)

# outparser str
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()

# loader
from langchain_community.document_loaders.csv_loader import CSVLoader
from langchain_community.document_loaders import PyPDFLoader

# langchain_text_splitters
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(document)

# embedding_models: OpenAIEmbeddings 和 HuggingFaceEmbeddings and ZhipuAIEmbeddings
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.embeddings import ZhipuAIEmbeddings

# vectorstores
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.vectorstores import FAISS
from langchain_chroma import Chroma

vectorstore = InMemoryVectorStore.from_texts(
    [txt_content],
    embedding=embeddings,
)
vectorstore = FAISS.from_documents(texts, embeddings)
vector_store = Chroma(  
    collection_name="example_collection",  
    embedding_function=embeddings,  
    persist_directory="./chroma_langchain_db", # Where to save data locally, remove if not necessary  
)

# retriever invoke
retriever = vectorstore.as_retriever()
docs = retriever.invoke("what did the president say about ketanji brown jackson?")

# index
from langchain.indexes import SQLRecordManager, index

# tools
from langchain_core.tools import tool  
  
@tool  
def multiply(a: int, b: int) -> int:  
    """Multiply two numbers."""  
    return a * b
    
# agent

from langchain.agents import AgentExecutor  
agent = (
    {
        "input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_to_openai_tool_messages(
            x["intermediate_steps"]
        ),
        "chat_history": lambda x: x["chat_history"],
    }
    | prompt
    | llm_with_tools
    | OpenAIToolsAgentOutputParser()
)

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

## langgraph create_tool_calling_agent
from langchain.agents import create_tool_calling_agent  
  
agent = create_tool_calling_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

## langgraphcreate_react_agent
from langgraph.prebuilt import create_react_agent  
  
langgraph_agent_executor = create_react_agent(model, tools)

# callbacks
from langchain_core.callbacks import BaseCallbackHandler
callbacks = [LoggingHandler()]
chain = prompt | llm  
  
chain.invoke({"number": "2"}, config={"callbacks": callbacks})

大模型

在大模型应用中开发中,大模型直接用的是:

  • chat 大模型
  • embedding 大模型

常用的大模型和运行器

  • OpenAI/AzureOpenAI/OpenAIEmbeddings
  • Anthropic
  • vertexai
  • huggingface
  • aws
  • ollama
  • ZhipuAI
  • MistralAI
  • Baidu Qianfan

向量数据库

  • Chroma
  • FAISS
  • InMemoryVectorStore
  • Milvus
  • PGVector
  • Redis
  • SQLiteVec
  • ….

运行环境

运行大模型,其实可以用不同的 python 运行环境

  1. 硬编码:使用编辑器硬编码
  2. jupyter notebook: python 代码能够分段,缓存数据,结构清晰, jupyter 推荐配合 vscode 使用,可以使用通用的编辑器。
  3. google 的 Colab notebooks, Colab 赠送不少的内存,对于小的应用基本够用了。如果没有使用过大概是这样的

一个简单的聊天

我们使用 zhipuAI,为什么?因为 zhipu AI 的 glm-4-flash 目前是免费调用。

如果还没有注册的新进入大模型应用开发的,可以考虑使用zhipu AI,质谱的支持自己的 sdk, 和 openAI 的方式以及 langchain 的 openAI 的方式调用大模型。

同时质朴也有 embeddings 模型速度可以,在初期学习已经够用了。

首先需要创建一个 .env 文件将质谱 AI 的 key 保存起来,方便访问。

.env

OPENAI_API_KEY = your_zhupu_ai_key

langchain_openai 使用 ChatOpenAI 调用质谱 AI 的 glm-4-flash 大模型。同时我们需要传入 openai_api_base 地址。

py

import dotenv

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

key = dotenv.get_variable(".env", "OPENAI_API_KEY") # 不同的版本不一样

model = ChatOpenAI(
    temperature=0.95,
    model="glm-4-flash",
    openai_api_key=key,
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)

# 消息
messages = [
    SystemMessage(content="Translate the following from English into Italian"),
    HumanMessage(content="hi!"),
]

# invoke 调用模型
model.invoke(messages)


# 格式化输出
parser = StrOutputParser()
result = model.invoke(messages)
parser.invoke(result)

# 使用 chain 链
chain = model | parser
chain.invoke(messages)、

# 使用提示词
system_template = "Translate the following into {language}:"
prompt_template =  ChatPromptTemplate.from_messages(
  [("system", system_template), ("user", "{text}")]
)
chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})

小结

本文主要介绍 Langchian 的基本基本概念,组件、生态内容。以及常用的大模型,向量数据库 embedding 以及使用 zhipu ai 配合 ChatOpenAI 实现一个简单的 chatmodel 的例子。

标签

发表评论