【AI落地工程技术】-LangChain框架介绍及使用步骤

目录

一、特点

二、原理

三、应用场景

四、未来发展趋势

五、简单LangChain使用步骤

 安装LangChain

2. 配置环境

3. 创建提示模板(Prompt Templates)

4. 构建链(Chains)

5. 运行链并处理结果

6. 优化和部署

7. 持续监控和评估

示例代码整合

六、复杂LangChain使用步骤(构建一个问答系统)

步骤 1: 准备工作

安装必要的库

获取API密钥

步骤 2: 导入库和设置配置

步骤 3: 创建问答Chain


LangChain是一个开源框架,旨在帮助从事人工智能的开发者将大语言模型(如GPT-4)与外部计算和数据来源有效地结合起来。

一、特点

  1. 开源性:LangChain以Python或JavaScript包的形式提供,允许开发者自由使用和修改。
  2. 灵活性:支持多种大语言模型,如GPT-4和HuggingFace的模型,便于开发者根据需求选择合适的模型。
  3. 模块化设计:LangChain采用模块化设计思想,允许用户根据实际需求灵活组合不同的组件,构建功能强大的语言处理系统。
  4. 易于扩展:具有良好的扩展性,能够轻松集成新的语言模型和技术,以适应不断变化的需求。

二、原理

LangChain通过以下步骤实现其功能:

  1. 用户提出初始问题:用户通过LangChain提出一个初始问题。
  2. 问题处理与向量表示:这个问题被发送到大语言模型,并将其向量表示在向量数据库中做相似性搜索。
  3. 信息检索与反馈:从向量数据库中获取与问题相关的信息块,并将其反馈给大语言模型。
  4. 答案生成或行动执行:大语言模型根据初始问题和相关信息,生成一个答案或执行一个行动。

在这个过程中,LangChain使用了几个关键组件:

  • LLM Wrapper:包装器,允许连接到大语言模型。
  • Prompt Templates:提示模板,减少了对文本的硬编码需求。
  • Indexes for Relevant Information Retrieval:相关内容的索引,用于从外部数据源中提取信息。

三、应用场景

LangChain在多个领域展现出广泛的应用前景,包括但不限于:

  1. 智能客服:通过LangChain构建的智能客服系统能够更准确地理解用户意图,提供个性化的解答方案。
  2. 内容创作:辅助内容创作者快速生成高质量的文章、摘要等文本内容。
  3. 数据分析:帮助分析师从海量数据中快速提取关键信息,生成数据报告。
  4. 跨语言交流:在医疗、商务、旅游、教育等领域中,用于语言翻译,促进跨国交流和合作。
  5. 知识库构建:支持用户整理、分类和存储本地知识库,构建智能问答系统。

四、未来发展趋势

  1. 技术融合:LangChain将与更多先进技术进行融合,如深度学习、知识图谱等,进一步提升其语言处理能力。
  2. 定制化与个性化:通过深入分析用户数据,为用户提供更加定制化和个性化的语言处理方案。
  3. 跨界应用:LangChain有望在更多领域实现跨界应用,推动相关行业的数字化转型。
  4. 性能优化:不断优化模型间的交互机制,提高在大规模数据处理场景中的性能表现。

五、简单LangChain使用步骤

  1.  安装LangChain

    首先,确保你的Python环境已经设置好,并且pip工具可用。然后,通过pip安装LangChain及其相关依赖。在命令行中运行:

pip install langchain[llms]

这个命令会安装LangChain库以及支持大型语言模型(LLM)的额外组件。

2. 配置环境

对于使用OpenAI等大型语言模型的服务,你需要设置相应的环境变量或直接在代码中提供API密钥。这里以OpenAI为例,你可以在代码中直接设置API密钥:

from langchain.llms import OpenAI  
  
# 设置OpenAI API密钥  
OPENAI_API_KEY = "your_openai_api_key"  
  
# 初始化OpenAI模型  
llm = OpenAI(model_name="gpt-4-0613", temperature=0.7, openai_api_key=OPENAI_API_KEY)
3. 创建提示模板(Prompt Templates)

提示模板是LangChain中一个重要的概念,它允许你定义如何向LLM发送请求。你可以创建自己的提示模板或使用LangChain提供的模板。

from langchain.prompts import PromptTemplate  
  
# 创建一个简单的提示模板  
prompt_template = PromptTemplate(  
    template="请给我解释一下{}的概念。",  
    input_variables=["topic"]  
)
4. 构建链(Chains)

链是LangChain的核心,它将多个组件(如提示模板、LLM、输出解析器等)串联起来以执行复杂的任务。

# 创建一个链,将提示模板和LLM模型连接起来  
from langchain import Chain  
  
chain = Chain(  
    prompt=prompt_template.format_prompt,  
    llm=llm  
)

注意:在上面的代码中,直接使用了prompt_template.format_prompt作为链的prompt函数,这是一个简化的示例。在实际应用中,可能需要定义一个自定义函数来处理更复杂的逻辑。

5. 运行链并处理结果

现在,可以运行链并传入输入数据来获取处理结果了。

# 定义一个输入变量  
input_data = {"topic": "机器学习"}  
  
# 运行链并获取结果  
response = chain.run(input_data)  
  
# 打印结果  
print(response)
6. 优化和部署
  • 优化链:根据实际应用场景和需求,你可能需要调整链的组件、参数或逻辑,以提高处理效果和性能。
  • 部署链:你可以使用LangServe等工具将链部署为API服务,以便在生产环境中使用。部署过程通常涉及配置API端点、处理并发请求、监控API性能等步骤。
7. 持续监控和评估

使用LangSmith等工具对部署的链进行监控和评估,以确保其稳定性和可靠性。根据监控结果对链进行调整和优化。

示例代码整合

以下是将上述步骤整合在一起的示例代码:

from langchain import Chain  
from langchain.llms import OpenAI  
from langchain.prompts import PromptTemplate  
  
# 配置OpenAI API密钥  
OPENAI_API_KEY = "your_openai_api_key"  
  
# 初始化OpenAI模型  
llm = OpenAI(model_name="gpt-4-0613", temperature=0.7, openai_api_key=OPENAI_API_KEY)  
  
# 创建提示模板  
prompt_template = PromptTemplate(  
    template="请给我解释一下{}的概念。",  
    input_variables=["topic"]  
)  
  
# 创建链  
chain = Chain(  
    prompt=prompt_template.format_prompt,  
    llm=llm  
)  
  
# 定义输入变量并运行链  
input_data = {"topic": "机器学习"}  
response = chain.run(input_data)  
  
# 打印结果  
print(response)

请注意,上述代码中的"your_openai_api_key"需要替换为你自己的OpenAI API密钥。此外,由于LangChain和OpenAI等服务的更新,某些参数和API调用方式可能会发生变化,因此请参考最新的官方文档。

六、复杂LangChain使用步骤(构建一个问答系统)

这个问答系统将使用LangChain来集成数据检索(假设使用DuckDuckGo搜索API)和大型语言模型(如OpenAI的GPT)。用户输入一个问题,系统首先搜索相关信息,然后将搜索结果作为上下文传递给LLM以生成回答。

步骤 1: 准备工作
安装必要的库

首先,你需要确保安装了所有必要的Python库。这通常包括LangChain和任何你计划使用的LLM(如OpenAI的GPT模型)的库。

pip install langchain openai transformers

注意:如果你不打算使用OpenAI的GPT模型,你可以省略openai的安装。

获取API密钥

如果你打算使用像OpenAI这样的外部服务,你需要注册并获取API密钥。这通常在你的服务提供商的网站上完成。

步骤 2: 导入库和设置配置
import os  
from langchain.chains import LLMChain  
from langchain.prompts import PromptTemplate  
from langchain.retrievers import SearchEngineRetriever  # 注意:这里只是示例,可能需要自定义  
from langchain.llms import OpenAI  
  
# 设置API密钥(这里使用环境变量来存储敏感信息)  
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "default_value_if_not_set")  
  
# 初始化LLM(这里以OpenAI为例)  
llm = OpenAI(temperature=0.5, max_tokens=100, model_name="text-davinci-003", api_key=OPENAI_API_KEY)  
  
# 注意:SearchEngineRetriever在LangChain中可能不直接支持所有搜索引擎  
# 这里我们假设有一个自定义的或第三方的检索器,但这里我们还是用Mock来模拟  
class MockSearchEngineRetriever:  
    def __init__(self):  
        # 初始化代码(如果有的话)  
        pass  
  
    def get_documents(self, query):  
        # 模拟从搜索引擎获取的结果  
        # 这里应该调用实际的搜索引擎API并处理响应  
        # 但为了示例,我们手动返回一些数据  
        if query == "苹果公司的创始人":  
            return [  
                {"title": "苹果公司创始人", "text": "苹果公司的创始人是史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗恩·韦恩。"}  
            ]  
        elif query == "Python的创始人":  
            return [  
                {"title": "Python创始人", "text": "Python的创始人是吉多·范罗苏姆(Guido van Rossum)。"}  
            ]  
        else:  
            return []  
  
# 实例化检索器  
retriever = MockSearchEngineRetriever()  
  
# 定义提示模板  
prompt_template = """  
问题:{question}  
  
搜索结果摘要:  
{search_results_summary}  
  
请基于以上信息回答以下问题:  
"""  
  
# 注意:这里我们假设有一个函数可以生成搜索结果摘要,但在Mock中我们省略了这一步  
# 在实际应用中,你可能需要从检索器返回的文档中提取关键信息来构建摘要  
  
# 由于我们没有实现搜索结果摘要的生成,我们直接在模板中插入文档文本  
# 这在实际应用中可能不是最佳实践,因为它可能包含大量不必要的细节  
def format_documents(documents):  
    summaries = [f"{doc['title']}: {doc['text'][:100]}..." for doc in documents]  # 截取文本以模拟摘要  
    return "\n".join(summaries)  
  
# 修改提示模板以包含文档摘要  
prompt_template_with_summaries = prompt_template.replace("{search_results_summary}", "{documents}")  
prompt_template_with_summaries = prompt_template_with_summaries.replace("{documents}", "{document_summaries}")  
  
# 创建一个函数来生成带有摘要的提示  
def generate_prompt(question, documents):  
    document_summaries = format_documents(documents)  
    filled_prompt = prompt_template_with_summaries.format(question=question, document_summaries=document_summaries)  
    return filled_prompt  
  
# 创建PromptTemplate对象(但这里我们直接使用函数来生成提示)  
# prompt = PromptTemplate.from_template(prompt_template_with_summaries)  # 这行代码在当前上下文中被注释掉  
  
# 注意:由于我们直接使用了函数来生成提示,因此不需要PromptTemplate对象
步骤 3: 创建问答Chain
# 创建Chain,注意这里我们没有直接使用PromptTemplate,而是使用了函数来生成提示  
class CustomQAChain:  
    def __init__(self, llm, retriever):  
        self.llm = llm  
        self.retriever = retriever  
  
    def run(self, question):  
        # 使用检索器获取与问题相关的文档  
        documents = self.retriever.get_documents(question)  
          
        # 如果没有找到任何文档,则直接告诉用户  
        if not documents:  
            return "没有找到与您的问题相关的任何信息。"  
          
        # 使用之前定义的函数生成包含文档摘要的提示  
        prompt = generate_prompt(question, documents)  
          
        # 使用LLM处理提示并获取回答  
        answer = self.llm(prompt)  
          
        # 返回LLM生成的回答  
        return answer  
  
# 实例化问答Chain  
qa_chain = CustomQAChain(llm=llm, retriever=retriever)  
  
# 测试问答Chain  
question = "苹果公司的创始人是谁?"  
answer = qa_chain.run(question)  
print(f"问题:{question}\n回答:{answer}")  
  
# 你可以继续测试其他问题  
question = "Python的创始人是谁?"  
answer = qa_chain.run(question)  
print(f"问题:{question}\n回答:{answer}")

这里的generate_prompt函数和MockSearchEngineRetriever类已经在之前的步骤中定义好了。generate_prompt函数负责根据问题和检索到的文档生成一个适合LLM处理的提示,而MockSearchEngineRetriever类则模拟了一个检索器,它根据问题返回一些预定义的文档。

在实际应用中,检索器可能会是一个复杂的系统,它使用真实的搜索引擎API(如Google Custom Search JSON API、Bing Search API等)来检索互联网上的信息,并处理这些信息的格式和相关性。此外,你可能还需要一个更复杂的逻辑来生成提示,包括从检索到的文档中提取关键信息、构建摘要、处理多个文档等。

在这个示例中,为了简化,直接使用了模拟的检索器和提示生成函数。然而,这种方法为你提供了一个构建更复杂问答系统的框架,你可以根据需要对其进行扩展和修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

64位Office API声明语句第120讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

工厂模式之简单工厂模式

文章目录 工厂模式工厂模式分为工厂模式的角色简单工厂模式案例代码定义一个父类,三个子类定义简单工厂客户端使用输出结果 工厂模式 工厂模式属于创造型的模式,用于创建对象。 工厂模式分为 简单工厂模式:定义一个简单工厂类,根…

Vue3的模板语法插值表达式用法

在template中输入“5 3” &#xff0c;是没有运算能力的&#xff0c;只会把字符直接显示出来&#xff0c;代码如下&#xff1a; <template><view>这是demo</view><view>5 3</view><navigator open-type"navigateBack"><vi…

永劫无间国服延迟高、报错、卡顿的处理措施一览

永劫无间国服延迟高、报错、卡顿怎么办&#xff1f;快速解决办法分享 第一个办法&#xff1a;改善延迟 如果是一直遇到永劫无间国服延迟高、报错、卡顿的问题&#xff0c;重启游戏也不管用的话&#xff0c;那应该就是网络问题&#xff0c;玩家可以启动雷神&#xff0c;让其快速…

服了!DELETE 同一行记录也会造成死锁!!

1 问题背景 “哥们&#xff0c;又双叒叕写了个死锁&#xff0c;秀啊&#xff01;&#x1f60f;” 就算是经常写死锁的同学看到估计都会有点懵&#xff0c;两条一模一样的 DELETE 语句怎么会产生死锁呢&#xff1f; 2 MySQL 锁回顾 看到这里的靓仔肯定对 MySQL 的锁非常了解&…

红酒与建筑:品味历史与艺术的交汇

在时间的长河中&#xff0c;红酒与建筑都是人类智慧的结晶&#xff0c;它们各自承载着历史的厚重与艺术的韵味。当这两者交汇时&#xff0c;仿佛是一场穿越时空的对话&#xff0c;将我们带入一个既古老又现代、既深沉又温柔的世界。今天&#xff0c;就让我们一起走进这个奇妙的…

企业消费采购成本和员工体验如何实现“鱼和熊掌“的兼得?

有企业说企业消费采购成本和员工体验的关系好比是“鱼和熊掌”&#xff0c;无法兼得&#xff1f; 要想控制好成本就一定要加强管控&#xff0c;但是加强管控以后&#xff0c;就会很难让员工获得满意的体验度。如果不加以管控&#xff0c;员工自由度增加了&#xff0c;往往就很难…

为什么要在成像应用中使用图像采集卡?

达到最大产量是工业和工厂自动化的关键标准之一。提高传感器分辨率和帧速率有助于实现这一目标&#xff0c;但也使带宽达到极限&#xff0c;并提出了新的传输问题。当前高带宽接口(如10GigE、相机直接与PC连接和嵌入式系统)的实现促使成像应用的许多用户询问如何以最佳配置最优…

Day63 代码随想录打卡|回溯算法篇---电话号码的字母组合

题目&#xff08;leecode T17&#xff09;&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 方法&#xff1a;…

CCS方形低角度光源实现更均匀的照射

机器视觉系统中&#xff0c;光源设计作为图像成像效果的关键&#xff0c;今天的光源系列分享——FPQ3系列。 特点&#xff1a; ・从4个方向以低角度照射均匀扩射光的方型低角度光源。 ・实现比上一代产品2倍的高输出。白色和蓝色的亮度提高至2倍&#xff0c;红色的亮度提高至…

app单页下载页源码带管理后台

新版带后台管理APP应用下载页,自动识别安卓苹果下载页&#xff0c;带管理后台&#xff0c;内置带3套App下载模板带中文模板/英文模板随时切换。 app单页下载页源码带管理后台

保存到redis中的token乱码了

示图&#xff1a; 原因是缓存保存到redis需要序列化操作&#xff0c;没有序列化会出现这样的问题 序列化redis第一步&#xff1a; package com.abliner.test.configure.redis;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annota…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式&#xff1a;邮件形式&#xff1a; 异常机制MD5参考 环境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…

西南交通大学【算法分析与设计实验3】

实验3.3 任务分配问题 实验目的 &#xff08;1&#xff09;理解穷举法典型算法的求解过程。 &#xff08;2&#xff09;学习穷举法的时间复杂度分析方法&#xff0c;并通过实验验证算法的执行效率。 &#xff08;3&#xff09;学会如何利用穷举法求解具体问题&#xff0c;了…

51单片机嵌入式开发:STC89C52操作8八段式数码管原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STC89C52操作8八段式数码管原理 1 8位数码管介绍1.1 8位数码管概述1.2 8位数码管原理1.3 应用场景 2 原理图图解2.1 74HC573原理2.2 74HC138原理2.3 数码管原理 3 数码管程序…

现代智能宠物喂食器方案定制

现代智能宠物喂食器不仅具备定时喂食功能&#xff0c;帮助宠物主人管理宠物的饮食时间和食量&#xff0c;还加入了录音功能和摄像头&#xff0c;使得宠物主人即使不在家也能与宠物保持互动&#xff0c;并实时监控宠物的状况。此外&#xff0c;一些产品还具备紧急预警功能&#…

Docker加速器配置指南:提升镜像下载速度的秘诀 加速安装Mysql Redis ES

在安装 Docker 镜像时&#xff0c;由于官方镜像下载速度较慢&#xff0c;我们可以使用阿里云的镜像加速器来提升下载速度。 使用阿里云镜像加速器 首先&#xff0c;找到并配置阿里云的镜像加速器。安装教程如下&#xff1a; 登录阿里云&#xff0c;进入容器镜像服务。直达链…

PyTorch之nn.Module与nn.functional用法区别

文章目录 1. nn.Module2. nn.functional2.1 基本用法2.2 常用函数 3. nn.Module 与 nn.functional3.1 主要区别3.2 具体样例&#xff1a;nn.ReLU() 与 F.relu() 参考资料 1. nn.Module 在PyTorch中&#xff0c;nn.Module 类扮演着核心角色&#xff0c;它是构建任何自定义神经网…

大数据------JavaWeb------JSP(完整知识点汇总)

JSP 定义 JSP&#xff08;Java Server Pages&#xff09;&#xff0c;即Java服务端页面。它是一种动态的网页技术&#xff0c;其中可以定义HTML、CSS、JS等静态内容&#xff0c;还可以定义Java代码的动态内容JSP HTML Java 说白了JSP就是一个页面&#xff0c;它既可以写HTML标…

【每日刷题】Day79

【每日刷题】Day79 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1619. 删除某些元素后的数组均值 - 力扣&#xff08;LeetCode&#xff09; 2. 1365. 有多少小于当前…