LangChain

发布于:2024-12-20 ⋅ 阅读:(184) ⋅ 点赞:(0)

LangChain

Introduction | 🦜️🔗 LangChain

一、LangChain 是什么?

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它具有连接数据、执行行动、无需硬编码等优势,其结构类似数据库领域的 JDBC,通过三个核心组件实现增强。

LangChain 框架可以实现数据感知和环境互动,将大型语言模型与外部的计算和数据源结合起来,目前提供了 Python 和 JavaScript(确切地说是 TypeScript)的软件包。其工作原理是通过三个核心组件:Components “组件”、Chains “链” 和 Agents “代理”,来提升大型语言模型(LLMs)的功能。

Components “组件” 为 LLMs 提供接口封装、模板提示和信息检索索引;Chains “链” 将不同的组件组合起来解决特定的任务,比如在大量文本中查找信息;Agents “代理” 使得 LLMs 能够与外部环境进行交互,例如通过 API 请求执行操作。

LangChain 的应用场景非常广泛,包括个人助手、学习辅助、数据分析和数据科学等。它可以帮助预订航班、转账、缴税,参考整个课程大纲帮助更快学习材料,连接公司客户数据或市场数据促进数据分析进展等。

二、核心概念

1. LLM Wrappers

LLM Wrappers 允许连接到大型语言模型,如 GPT-4 或 Hugging Face 提供的模型。它作为一个包装器,为开发人员提供了一种便捷的方式来与这些强大的语言模型进行交互,使得开发基于语言模型的应用程序变得更加容易。

2. Prompt Templates

Prompt Templates 可以动态生成查询,避免硬编码文本输入。这些模板包含一个文本字符串,可以接受来自用户的一组参数并生成提示。它可能包含对语言模型的指令、一些示例以及对语言模型的问题,帮助引导语言模型生成更好的响应。

3. Indexes

Indexes 帮助从语言模型中提取相关信息。LangChain 提供了多种文档加载器、文档转换器和检索器,能够从各种来源加载文档,将大型文档分割成较小的块,并通过文本嵌入模型为文档创建嵌入向量,以便在向量存储中进行高效检索和语义匹配。

4. Chains

Chains 将多个组件组合在一起,解决特定任务,构建完整的语言模型应用程序。例如,LLMChain 将 LLM 和 prompt 组合在一起,接受用户输入,格式化提示词模板,然后将格式化后的响应传递给 LLM。此外,还有 SimpleSequentialChain 和 SequentialChain 等类型的链,可以将多个链组合在一起,实现更复杂的任务。

5. Agents

Agents 允许语言模型与外部 API 交互。通过 Agents,语言模型可以执行特定的任务,如调用外部 API 获取信息、执行操作等,从而使语言模型能够与外部环境进行交互,进一步扩展了其应用范围。

三、工作流程

  1. 用户提问:
    用户向基于 LangChain 开发的应用程序提出问题,这个问题可以是关于各种领域的查询、请求特定的操作或者寻求解决方案等。

  2. 问题转换成向量表示,在向量数据库中进行相似性搜索:
    当用户提出问题后,问题会被转换成向量表示。这种向量表示能够捕捉问题的语义特征,以便在向量数据库中进行高效的相似性搜索。向量数据库中存储了大量的文本信息,这些信息也以向量的形式存在。通过计算问题向量与数据库中向量的相似度,可以快速找到与用户问题最相关的信息块。

  3. 从向量数据库中提取相关信息块,并输入给语言模型:
    根据相似性搜索的结果,从向量数据库中提取出最相关的信息块。这些信息块包含了可能与用户问题相关的知识、数据或上下文信息。然后,将这些信息块输入给语言模型,为语言模型提供更多的背景信息和参考依据。

  4. 语言模型提供答案或执行操作:
    语言模型在接收到用户的初始问题和从向量数据库中提取的相关信息后,利用其强大的语言理解和生成能力,提供答案或执行特定的操作。如果是回答问题,语言模型会根据问题和相关信息生成准确、详细的回答;如果是执行操作,语言模型会根据指令调用相应的外部 API 或执行其他任务。

四、应用场景

  1. 个人助手,可帮助预订航班、转账、缴税等。
    LangChain 在个人助手方面具有很大的潜力。它可以通过与各种外部系统的交互,实现诸如预订航班、转账和缴税等任务。例如,通过连接到航空公司的预订系统,LangChain 可以根据用户的需求查询航班信息、进行座位选择并完成预订流程。在转账方面,它可以与银行系统集成,实现安全快速的资金转移。对于缴税,LangChain 可以协助用户准备所需的文件和信息,并与税务机构的系统进行交互,确保税款的准确缴纳。

  2. 学习辅助,参考课程大纲,加快学习材料。
    在学习辅助方面,LangChain 能够参考整个课程大纲,为学生提供更高效的学习体验。它可以分析课程大纲中的知识点,根据学生的学习进度和需求,提供个性化的学习材料推荐。例如,当学生学习某个特定主题时,LangChain 可以检索相关的教材、文章、视频等资源,并以简洁明了的方式呈现给学生。此外,它还可以回答学生在学习过程中遇到的问题,帮助他们更好地理解和掌握知识。

  3. 数据分析和数据科学,连接公司数据,促进数据分析进展。
    在数据分析和数据科学领域,LangChain 可以连接公司的客户数据或市场数据,极大地促进数据分析的进展。它可以与各种数据源进行集成,包括数据库、数据仓库和云存储服务。通过对这些数据的分析,LangChain 可以帮助企业发现潜在的趋势和模式,为决策提供有力支持。例如,在市场营销方面,它可以分析客户行为数据,为企业制定更精准的营销策略。在金融领域,LangChain 可以分析市场数据,为投资决策提供参考。

以下是一些使用LangChain的简单代码示例,以帮助你初步了解其基本用法,示例涵盖了几个常见的应用场景,这里以Python语言为例(确保你已经安装了 langchain 库以及对应的语言模型相关依赖等,比如连接OpenAI API的话要安装 openai 库并配置好相应的API密钥)。

示例一:简单的语言模型调用

这个示例展示了如何通过LangChain连接到OpenAI的语言模型(此处以 text-davinci-003 为例,实际可根据你的权限和需求换用其他模型),并发送一个简单文本提示来获取回复。

from langchain.llms import OpenAI

# 设置OpenAI API密钥(替换为你真实的密钥,实际应用中要注意密钥安全,不要明文写在代码里,可通过环境变量等方式配置)
import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"

# 初始化语言模型实例
llm = OpenAI(model_name="text-davinci-003", temperature=0)

# 输入一个提示文本
prompt = "请描述一下人工智能在医疗领域的应用有哪些"
# 获取语言模型的回复
response = llm(prompt)
print(response)

示例二:使用Prompt Templates(提示模板)

Prompt Templates可以让你动态地构造发送给语言模型的提示,方便根据不同输入灵活调整。

from langchain.llms import OpenAI
from langchain import PromptTemplate

# 同样先设置好API密钥
import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"

# 定义一个简单的提示模板,有一个占位符{topic}
template = "请给我详细介绍一下{topic}相关的知识"
prompt_template = PromptTemplate(
    input_variables=["topic"],
    template=template
)

# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)

# 填入具体的话题值
topic = "区块链技术"
formatted_prompt = prompt_template.format(topic=topic)

# 发送格式化后的提示给语言模型并获取回复
response = llm(formatted_prompt)
print(response)

示例三:使用Indexes

以下是一个使用LangChain中Indexes相关功能的示例代码,展示了如何从本地文本文件中加载文档,进行分割、创建嵌入向量,并实现基于向量存储的检索,以从文档中提取相关信息,这里以使用 Chroma 作为向量数据库(你需要提前安装 langchainchromadb 以及相关的嵌入模型相关依赖等,示例中嵌入模型采用 OpenAIEmbeddings ,意味着还需要配置好 OpenAI_API_KEY 环境变量并安装 openai 库)为例:

import os
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalChain
from langchain.llms import OpenAI

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"

# 1. 加载文档
# 假设你有一个本地的文本文件(这里以example.txt为例,你可替换为实际的文档路径)
loader = TextLoader('example.txt')
documents = loader.load()

# 2. 分割文档
# 使用递归文本分割器将大型文档分割成较小的块,方便后续处理
text_splitter = RecursiveTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# 3. 创建嵌入向量
# 使用OpenAI的嵌入模型为分割后的文档块创建嵌入向量
embeddings = OpenAIEmbeddings()

# 4. 存储到向量数据库(这里使用Chroma)
# 将文档嵌入向量存储到Chroma向量数据库中,会自动根据向量进行索引,便于检索
docsearch = Chroma.from_documents(texts, embeddings)

# 5. 创建检索链
# 结合语言模型和检索器构建检索链,用于后续查询并提取相关信息
llm = OpenAI(model_name="text-davinci-003", temperature=0)
qa = RetrievalChain.from_llm(llm, docsearch.as_retriever())

# 6. 进行查询并获取相关信息
query = "文档中提到的主要技术优势有哪些"
result = qa({"question": query})
print(result['answer'])

在上述示例中:

  1. 首先通过 TextLoader 从本地文本文件加载文档内容,它可以处理多种常见的文本格式文件。
  2. 接着利用 RecursiveTextSplitter 把加载进来的文档按照指定的块大小(这里是1000个字符)分割成一个个较小的文本块,避免处理过大文本时的不便,且设置了块重叠为0(可根据实际情况调整重叠情况以保证语义连贯性等)。
  3. 然后借助 OpenAIEmbeddings 嵌入模型为这些分割好的文本块创建嵌入向量,使得文本能够在向量空间中有对应的语义表示。
  4. 使用 Chroma 向量数据库存储这些带有嵌入向量的文本块,它会自动构建索引方便后续基于语义的检索操作。
  5. 最后构建了 RetrievalChain ,将 OpenAI 语言模型和向量数据库的检索器结合起来,这样当输入一个查询问题时,检索链会先从向量数据库中检索出和问题语义相关的文本块,再传递给语言模型进行处理,最终返回提取到的相关信息作为答案。

你可以根据实际需求,替换文本文件内容、调整分割策略、更换向量数据库等,以适应不同的应用场景,比如处理大量的技术文档、新闻文章等,来高效提取你所需的信息。

请注意,不同版本的库以及具体的应用场景可能需要对代码进行适当调整,并且要确保遵循各服务(如OpenAI等)的使用条款和隐私政策,妥善保管好API密钥等敏感信息。

示例四:构建一个简单的Chain(链)

Chains可以把多个组件(比如多个操作或者不同的语言模型调用等)组合起来完成更复杂的任务,以下是一个简单的顺序链示例,先对输入文本进行格式化,再传递给语言模型获取回复。

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain import PromptTemplate

import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"

# 定义提示模板
template = "对下面这段话进行总结:{text}"
prompt_template = PromptTemplate(
    input_variables=["text"],
    template=template
)

# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)

# 创建链,将提示模板和语言模型关联起来
chain = LLMChain(llm=llm, prompt=prompt_template)

# 待处理的文本内容
text = "人工智能在诸多领域都有着广泛应用,比如医疗领域能辅助诊断疾病,交通领域能优化路况调度,教育领域可以个性化教学等等,它正深刻改变着人们的生活和各行业的运作模式。"
# 通过链来处理文本并获取结果
result = chain.run(text)
print(result)

示例五:利用Agents(代理)与外部工具交互(以使用SerpAPI进行搜索并回答问题为例)

Agents可以让语言模型具备调用外部工具的能力,比如根据问题去搜索引擎查找信息后再整合回答。

首先确保安装了 langchain 以及 serpapi 库,并且配置好 SERPAPI_API_KEY 环境变量(在SerpAPI官网注册获取对应的API密钥)。

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

import os
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
os.environ["SERPAPI_API_KEY"] = "YOUR_SERPAPI_KEY"

# 实例化语言模型
llm = OpenAI(model_name="text-davinci-003", temperature=0)
# 加载要使用的工具,这里是SerpAPI搜索引擎工具
tools = load_tools(["serpapi"], llm=llm)

# 初始化代理,设置为零-shot模式(根据问题直接调用工具尝试解决,无需预先的示例训练)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

# 提出一个需要查询外部信息的问题
question = "最新的人工智能研究成果有哪些"
# 通过代理去处理问题,代理会决定是否调用工具及如何整合回答
response = agent.run(question)
print(response)

这些示例只是LangChain强大功能的冰山一角,你可以基于它去构建各种更复杂、更贴合实际业务需求的语言模型驱动的应用程序,比如聊天机器人、智能文档问答系统等。

请注意,代码中的API密钥等敏感信息要妥善保管,按照正规的安全规范来配置和使用,避免出现安全风险。同时,不同版本的LangChain以及对应的依赖库可能在接口等方面有细微变化,具体使用时可参考官方文档进行调整。

以下是使用LangChain实现调用ChatGPT并获得流式回答的示例代码,这里以Python语言为例,在运行代码前,请确保你已经安装了 langchainopenai 等相关库,并且配置好了有效的OpenAI API密钥(将其设置在环境变量 OPENAI_API_KEY 中)。

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
import time


def stream_chat_response():
    # 初始化ChatOpenAI实例,设置为流式响应模式
    chat = ChatOpenAI(streaming=True, temperature=0.7)

    # 构造消息列表,这里仅示例一个简单的用户消息,你可以根据需求扩展
    messages = [HumanMessage(content="请介绍一下人工智能在医疗领域的最新应用情况")]

    # 用于收集流式响应的内容
    full_response = ""
    for chunk in chat.stream(messages):
        content = chunk.content
        print(content, end='', flush=True)
        full_response += content
        time.sleep(0.05)  # 适当添加延迟,让输出更平滑,可根据实际情况调整
    print()  # 换行,确保输出格式美观
    return full_response


if __name__ == "__main__":
    stream_chat_response()

在上述代码中:

  1. 首先通过 ChatOpenAI 类来实例化语言模型对象,关键在于设置 streaming=True 参数,这就开启了流式响应模式,使得模型的回复会以流的形式逐步返回,而不是一次性返回全部内容。
  2. 接着构造了发送给模型的消息列表,这里使用 HumanMessage 来表示用户输入的消息,你可以根据具体的应用场景,增加更多的消息来丰富对话上下文等。
  3. 然后通过 chat.stream(messages) 来发起流式调用,它会逐个返回包含回复内容的块(chunk),在循环中获取每个块的内容,并将其输出展示(这里简单地直接打印,你也可以将其传递到前端界面等其他地方用于实时显示给用户),同时累加到 full_response 变量中,以便后续如果需要完整保存整个回复内容可以使用。另外添加了一个小的时间延迟(通过 time.sleep )是为了让输出在视觉上更加平滑,避免内容过快刷出而影响阅读体验,这个延迟时间可以根据实际网络情况以及期望的展示效果等进行适当调整。

这样,运行代码时就能看到ChatGPT的回复以流式的方式逐字或逐段地呈现出来,模拟了更加自然流畅的对话交互体验。

请注意,使用OpenAI API需遵循其相应的使用条款和政策,并且要确保API密钥的安全性,防止泄露。同时不同版本的 langchain 等库可能在接口细节等方面有细微变化,具体使用时可参考官方文档进一步优化代码。

LangChain 就是对这些通用逻辑做了封装,让使用者可以不用关注在与大模型之间的交互细节能够更专注在业务本身上,通过组合模块和能力抽象来扩展LLM 的能力,通过chain、agent、model等多种封装工具,提供了扩展 LLM 使用场景、便捷 LLM 调用方式的一系列功能。。


网站公告

今日签到

点亮在社区的每一天
去签到