微信扫码
添加专属顾问
我要投稿
引言
近期,大型语言模型(LLM)如GPT系列模型引领了人工智能领域的一场技术革命。开发者们都在利用这些LLM进行各种尝试,虽然已经产生了许多有趣的应用,但是单独使用这些LLM往往难以构建功能强大的实用应用。
LangChain通过将大型语言模型与其他知识库、计算逻辑相结合,实现了功能更加强大的人工智能应用。简单来说,个人理解LangChain可以被视为开源版的GPT插件,它提供了丰富的大语言模型工具,可以在开源模型的基础上快速增强模型的能力。
LangChain主要概念与示例 模型(Models)
LangChain的一个核心价值就是它提供了标准的模型接口;然后我们可以自由的切换不同的模型,当前主要有两种类型的模型,但是考虑到使用场景,对我们一般用户来说就是使用一种模型即文本生成模型。
说到模型,大家就理解模型就是ChatGPT就可以。单纯的模型只能生成文本内容。
用于文本生成,文字作为输入,输出也是文字。
1. 普通LLM:接收文本字符串作为输入,并返回文本字符串作为输出。
from langchain.schema import HumanMessagefrom langchain.llms import OpenAIfrom langchain.chat_models import ChatOpenAIllm = OpenAI()chat_model = ChatOpenAI()print(llm("say hi!"))print(chat_model.predict("say hi!"))
这些模型接收文本作为输入并返回一组浮点数。这些浮点数通常用于表示文本的语义信息,以便进行文本相似性计算、聚类分析等任务。文本嵌入模型可以帮助开发者在文本之间建立更丰富的联系,提高基于大型语言模型的应用的性能。
from langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()text = "This is a test document."query_result = embeddings.embed_query(text)doc_result = embeddings.embed_documents([text])print(doc_result)
提示词(Prompts)
1. 对语言模型的说明,应该扮演什么角色。
2. 一组少量示例,以帮助LLM生成更好的响应。
from langchain import PromptTemplatetemplate = """I want you to act as a naming consultant for new companies.What is a good name for a company that makes {product}?"""prompt = PromptTemplate(input_variables=["product"],template=template,)prompt.format(product="colorful socks")# -> I want you to act as a naming consultant for new companies.# -> What is a good name for a company that makes colorful socks?
聊天模型提示词模板ChatPrompt Templates,ChatModels接受聊天消息列表作为输入。列表一般是不同的提示,并且每个列表消息一般都会有一个角色。
from langchain.prompts import (ChatPromptTemplate,PromptTemplate,SystemMessagePromptTemplate,AIMessagePromptTemplate,HumanMessagePromptTemplate,)from langchain.schema import (AIMessage,HumanMessage,SystemMessage)template="You are a helpful assistant that translates {input_language} to {output_language}."system_message_prompt = SystemMessagePromptTemplate.from_template(template)human_template="{text}"human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])# get a chat completion from the formatted messagesprint(chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages())
from langchain.prompts.example_selector.base import BaseExampleSelectorfrom typing import Dict, Listimport numpy as npclass CustomExampleSelector(BaseExampleSelector):def __init__(self, examples: List[Dict[str, str]]):self.examples = examplesdef add_example(self, example: Dict[str, str]) -> None:"""Add new example to store for a key."""self.examples.append(example)def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""Select which examples to use based on the inputs."""return np.random.choice(self.examples, size=2, replace=False)examples = [{"foo": "1"},{"foo": "2"},{"foo": "3"}]# Initialize example selector.example_selector = CustomExampleSelector(examples)# Select examplesprint(example_selector.select_examples({"foo": "foo"}))# -> array([{'foo': '2'}, {'foo': '3'}], dtype=object)# Add new example to the set of examplesexample_selector.add_example({"foo": "4"})print(example_selector.examples)# -> [{'foo': '1'}, {'foo': '2'}, {'foo': '3'}, {'foo': '4'}]# Select examplesprint(example_selector.select_examples({"foo": "foo"}))# -> array([{'foo': '1'}, {'foo': '4'}], dtype=object)
OutputParsers
3. PydanticOutputParser定义一个对象模型,让LLM按照这个模型返回数据。
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplatefrom langchain.llms import OpenAIfrom langchain.chat_models import ChatOpenAIfrom langchain.output_parsers import PydanticOutputParserfrom pydantic import BaseModel, Field, validatorfrom typing import Listmodel_name = 'text-davinci-003'temperature = 0.0model = OpenAI(model_name=model_name, temperature=temperature)# Define your desired data structure.class Joke(BaseModel):setup: str = Field(description="question to set up a joke")punchline: str = Field(description="answer to resolve the joke")# You can add custom validation logic easily with Pydantic.@validator('setup')def question_ends_with_question_mark(cls, field):if field[-1] != '?':raise ValueError("Badly formed question!")return fieldparser = PydanticOutputParser(pydantic_object=Joke)prompt = PromptTemplate(template="Answer the user query.\n{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()})joke_query = "Tell me a joke."_input = prompt.format_prompt(query=joke_query)output = model(_input.to_string())print(parser.get_format_instructions())print(output)print(parser.parse(output))
索引(Indexs)
在数据索引这块,LangChain提供的主要工具:
图中的FAISS是一种向量存储的服务;
import osfrom langchain.chains import RetrievalQAfrom langchain.document_loaders import TextLoaderfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.indexes import VectorstoreIndexCreatorfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain.llms import OpenAI# 设置代理os.environ['HTTP_PROXY'] = 'socks5h://127.0.0.1:13659'os.environ['HTTPS_PROXY'] = 'socks5h://127.0.0.1:13659'# 创建文本加载器loader = TextLoader('/Users/aihe/Downloads/demo.txt', encoding='utf8')# 加载文档documents = loader.load()# 文本分块text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)texts = text_splitter.split_documents(documents)# 计算嵌入向量embeddings = OpenAIEmbeddings()# 创建向量库db = Chroma.from_documents(texts, embeddings)# 将向量库转换为检索器retriever = db.as_retriever()# 创建检索问答系统qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=retriever)# 运行问题答案检索query = "如何申请租户?"print(qa.run(query))print(qa.run("能否说明下你可以提供的功能?"))
存储(Memory)
默认情况下Agent和Chain都是无状态的,也就是用完之后不知道上次的对话内容是什么。每次的query都是独立的。
但是在有些应用中,记住上一次的会话内容是比较重要的,比如聊天,LangChain对于也提供了一些相关的工具类。
from langchain import ConversationChain, OpenAIfrom langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory()memory.chat_memory.add_user_message("你好!")memory.chat_memory.add_ai_message("你好吗?")llm = OpenAI(temperature=0)chain = ConversationChain(llm=llm,verbose=True,memory=memory)chain.predict(input="最近怎么样!")print(chain.predict(input="感觉很不错,刚和AI做了场对话."))
链(Chains)
一个简单的案例:
# 引入所需模块和类from langchain.chains import LLMChainfrom langchain.chat_models import ChatOpenAIfrom langchain import PromptTemplatefrom langchain.prompts.chat import (ChatPromptTemplate,# 引入对话模板类HumanMessagePromptTemplate,# 引入人类消息模板类)# 创建人类消息模板类human_message_prompt = HumanMessagePromptTemplate(prompt=PromptTemplate(template="给我一个制作{product}的好公司名字?",# 输入模板,其中product为占位符input_variables=["product"],# 指定输入变量为product))# 创建对话模板类chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])# 创建OpenAI聊天模型对象chat = ChatOpenAI(temperature=0.9)# 创建LLMChain对象,将聊天模型和对话模板传入chain = LLMChain(llm=chat, prompt=chat_prompt_template)# 运行LLMChain对象,并输出结果print(chain.run("袜子"))
Agent是一个智能代理,它负责根据用户输入和应用场景,在一系列可用工具中选择合适的工具进行操作。Agent可以根据任务的复杂性,采用不同的策略来决定如何执行操作。
Agent内部涉及的核心概念如下:
代理的执行流程:
一个案例:
# 引入所需模块和类from langchain.agents import load_tools# 引入加载工具函数from langchain.agents import initialize_agent# 引入初始化代理函数from langchain.agents import AgentType# 引入代理类型类from langchain.llms import OpenAI# 引入OpenAI语言模型类import os# 引入os模块# 创建OpenAI语言模型对象,设定temperature为0,即关闭随机性llm = OpenAI(temperature=0)# 加载所需工具,包括serpapi和llm-mathtools = load_tools(["serpapi", "llm-math"], llm=llm)# 初始化代理对象,设定代理类型为ZERO_SHOT_REACT_DESCRIPTION,输出详细信息agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)# 运行代理对象,向其提问特朗普的年龄和年龄除以2的结果agent.run("特朗普今年多少岁? 他的年龄除以2是多少?")
上述代码中关于Agent有个初始化的阶段,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,代理类型决定了代理如何使用工具、处理输入以及与用户进行交互。从而为用户提供有针对性的服务。其中可以选择的类型如下:
initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
https://python.langchain.com/en/latest/modules/agents/tools/getting_started.html
我们通过一个自定义的工具,了解下工具怎么用,因为后面再使用LangChain的时候我们做的也就是不断的自定义工具。
1. 名称。
2. 工具描述:说明你的工具是做什么的?
3. 参数结构:当前工具需要的入参是什么结构?
LangChain应用案例
假设我们需要构建一个基于LLM的问答系统,该系统需要从指定的数据源中提取信息以回答用户的问题。我们可以使用LangChain中的数据增强生成功能与外部数据源进行交互,获取所需的数据。然后,将数据输入到LLM中,生成回答。记忆功能可以帮助我们在多次调用之间保持相关状态,从而提高问答系统的性能。此外,我们还可以使用智能代理功能实现系统的自动优化。最后,通过LangChain提供的评估提示和链实现,我们可以对问答系统的性能进行评估和优化。
LangChain生成图片
1. random_poem:随机返回中文的诗词。
2. prompt_generate:根据中文提示词生成对应的英文提示词。
import base64import jsonimport osfrom io import BytesIOimport requestsfrom PIL import Imagefrom pydantic import BaseModel, Fieldfrom langchain.agents import AgentType, initialize_agent, load_toolsfrom langchain.chat_models import ChatOpenAIfrom langchain.llms import OpenAIfrom langchain.tools import BaseTool, StructuredTool, Tool, toolfrom langchain import LLMMathChain, SerpAPIWrapperdef generate_image(prompt: str) -> str:"""根据提示词生成对应的图片Args:prompt (str): 英文提示词Returns:str: 图片的路径"""url = "http://127.0.0.1:7860/sdapi/v1/txt2img"headers = {"accept": "application/json","Content-Type": "application/json"}data = {"prompt": prompt,"negative_prompt": "(worst quality:2), (low quality:2),disfigured, ugly, old, wrong finger","steps": 20,"sampler_index": "Euler a","sd_model_checkpoint": "cheeseDaddys_35.safetensors [98084dd1db]",# "sd_model_checkpoint": "anything-v3-fp16-pruned.safetensors [d1facd9a2b]","batch_size": 1,"restore_faces": True}response = requests.post(url, headers=headers, data=json.dumps(data))if response.status_code == 200:response_data = response.json()images = response_data['images']for index, image_data in enumerate(images):img_data = base64.b64decode(image_data)img = Image.open(BytesIO(img_data))file_name = f"image_{index}.png"file_path = os.path.join(os.getcwd(), file_name)img.save(file_path)print(f"Generated image saved at {file_path}")return file_pathelse:print(f"Request failed with status code {response.status_code}")def random_poem(arg: str) -> str:"""随机返回中文的诗词Returns:str: 随机的中文诗词"""llm = OpenAI(temperature=0.9)text = """能否帮我从中国的诗词数据库中随机挑选一首诗给我,希望是有风景,有画面的诗:比如:山重水复疑无路,柳暗花明又一村。"""return llm(text)def prompt_generate(idea: str) -> str:"""生成图片需要对应的英文提示词Args:idea (str): 中文提示词Returns:str: 英文提示词"""llm = OpenAI(temperature=0, max_tokens=2048)res = llm(f"""Stable Diffusion is an AI art generation model similar to DALLE-2.Below is a list of prompts that can be used to generate images with Stable Diffusion:- portait of a homer simpson archer shooting arrow at forest monster, front game card, drark, marvel comics, dark, intricate, highly detailed, smooth, artstation, digital illustration by ruan jia and mandy jurgens and artgerm and wayne barlowe and greg rutkowski and zdislav beksinski- pirate, concept art, deep focus, fantasy, intricate, highly detailed, digital painting, artstation, matte, sharp focus, illustration, art by magali villeneuve, chippy, ryan yee, rk post, clint cearley, daniel ljunggren, zoltan boros, gabor szikszai, howard lyon, steve argyle, winona nelson- ghost inside a hunted room, art by lois van baarle and loish and ross tran and rossdraws and sam yang and samdoesarts and artgerm, digital art, highly detailed, intricate, sharp focus, Trending on Artstation HQ, deviantart, unreal engine 5, 4K UHD image- red dead redemption 2, cinematic view, epic sky, detailed, concept art, low angle, high detail, warm lighting, volumetric, godrays, vivid, beautiful, trending on artstation, by jordan grimmer, huge scene, grass, art greg rutkowski- a fantasy style portrait painting of rachel lane / alison brie hybrid in the style of francois boucher oil painting unreal 5 daz. rpg portrait, extremely detailed artgerm greg rutkowski alphonse mucha greg hildebrandt tim hildebrandt- athena, greek goddess, claudia black, art by artgerm and greg rutkowski and magali villeneuve, bronze greek armor, owl crown, d & d, fantasy, intricate, portrait, highly detailed, headshot, digital painting, trending on artstation, concept art, sharp focus, illustration- closeup portrait shot of a large strong female biomechanic woman in a scenic scifi environment, intricate, elegant, highly detailed, centered, digital painting, artstation, concept art, smooth, sharp focus, warframe, illustration, thomas kinkade, tomasz alen kopera, peter mohrbacher, donato giancola, leyendecker, boris vallejo- ultra realistic illustration of steve urkle as the hulk, intricate, elegant, highly detailed, digital painting, artstation, concept art, smooth, sharp focus, illustration, art by artgerm and greg rutkowski and alphonse muchaI want you to write me a list of detailed prompts exactly about the idea written after IDEA. Follow the structure of the example prompts. This means a very short description of the scene, followed by modifiers divided by commas to alter the mood, style, lighting, and more.IDEA: {idea}""")return resclass PromptGenerateInput(BaseModel):"""生成英文提示词所需的输入模型类"""idea: str = Field()class GenerateImageInput(BaseModel):"""生成图片所需的输入模型类"""prompt: str = Field(description="英文提示词")tools = [Tool.from_function(func=random_poem,name="诗歌获取",description="随机返回中文的诗词"),Tool.from_function(func=prompt_generate,name="提示词生成",description="生成图片需要对应的英文提示词,当前工具可以将输入转换为英文提示词,以便方便生成",args_schema=PromptGenerateInput),Tool.from_function(func=generate_image,name="图片生成",description="根据提示词生成对应的图片,提示词需要是英文的,返回是图片的路径",args_schema=GenerateImageInput),]def main():"""主函数,初始化代理并执行对话"""llm = OpenAI(temperature=0)agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run("帮我生成一张诗词的图片?")if __name__ == '__main__':main()
LangChain做答疑 Langchain输出结构化JSON数据import osfrom langchain.chains import RetrievalQAfrom langchain.document_loaders import TextLoaderfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.indexes import VectorstoreIndexCreatorfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain.llms import OpenAI# 设置代理os.environ['HTTP_PROXY'] = 'socks5h://127.0.0.1:13659'os.environ['HTTPS_PROXY'] = 'socks5h://127.0.0.1:13659'# 创建文本加载器loader = TextLoader('/Users/aihe/Downloads/demo.txt', encoding='utf8')# 加载文档documents = loader.load()# 文本分块text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)texts = text_splitter.split_documents(documents)# 计算嵌入向量embeddings = OpenAIEmbeddings()# 创建向量库db = Chroma.from_documents(texts, embeddings)# 将向量库转换为检索器retriever = db.as_retriever()# 创建检索问答系统qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=retriever)# 运行问题答案检索query = "如何申请租户?"print(qa.run(query))print(qa.run("能否说明下你可以提供的功能?"))import requestsfrom langchain.agents import AgentType, initialize_agentfrom langchain.chat_models import ChatOpenAIfrom langchain.tools import StructuredToolfrom pydantic import BaseModel, Fielddef post_message(type: str, param: dict) -> str:""" 当需要生成人群、分析画像、咨询问题时,使用如下的指示:url 固定为:http://localhost:3001/ 如果请求是生成人群,请求的type为crowd; 如果请求是分析画像,请求的type为analyze; 如果是其他或者答疑,请求的type为question; 请求body的param把用户指定的条件传进来即可 """result = requests.post("http://localhost:3001/", json={"type": type, "param": param})return f"Status: {result.status_code} - {result.text}"class PostInput(BaseModel):# body: dict = Field(description="""格式:{"type":"","param":{}}""")type: str = Field(description="请求的类型,人群为crowd,画像为analyze")param: dict = Field(description="请求的具体描述")llm = ChatOpenAI(temperature=0)tools = [StructuredTool.from_function(post_message)]agent = initialize_agent(tools, llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run("我想生成一个性别为男并且在180天访问过淘特的人群?")
LangChain做一款自己的聊天机器人
pip install langflow
langfow
FROM python:3.10-slimRUN apt-get update && apt-get install gcc g++ git make -yRUN useradd -m -u 1000 userUSER userENV HOME=/home/user \PATH=/home/user/.local/bin:$PATHWORKDIR $HOME/appCOPY --chown=user . $HOME/appRUN pip install langflow>==0.0.71 -U --userCMD ["langflow", "--host", "0.0.0.0", "--port", "7860"]
LangChain的未来展望
应用场景构思:
智能客服:结合聊天模型、自主智能代理和问答功能,开发智能客服系统,帮助用户解决问题,提高客户满意度。
个性化推荐:利用智能代理与文本嵌入模型,分析用户的兴趣和行为,为用户提供个性化的内容推荐。
知识图谱构建:通过结合问答、文本摘要和实体抽取等功能,自动从文档中提取知识,构建知识图谱。
自动文摘和关键信息提取:利用LangChain的文本摘要和抽取功能,从大量文本中提取关键信息,生成简洁易懂的摘要。
代码审查助手:通过代码理解和智能代理功能,分析代码质量,为开发者提供自动化代码审查建议。
搜索引擎优化:结合文本嵌入模型和智能代理,分析网页内容与用户查询的相关性,提高搜索引擎排名。
数据分析与可视化:通过与API交互和查询表格数据功能,自动分析数据,生成可视化报告,帮助用户了解数据中的洞察信息。
智能编程助手:结合代码理解和智能代理功能,根据用户输入的需求自动生成代码片段,提高开发者的工作效率。
在线教育平台:利用问答和聊天模型功能,为学生提供实时的学术支持,帮助他们解决学习中遇到的问题。
自动化测试:结合智能代理和代理模拟功能,开发自动化测试场景,提高软件测试的效率和覆盖率。
总结
本文介绍了LangChain框架,它能够将大型语言模型与其他计算或知识来源相结合,从而实现功能更加强大的应用。接着,对LangChain的关键概念进行了详细说明,并基于该框架进行了一些案例尝试,旨在帮助读者更轻松地理解LangChain的工作原理。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-10-29
为什么我们选择 LangGraph 作为智能体系统的技术底座?
2025-10-27
Langchain 、 Manus 组了一个研讨会:Agent越智能,死得越快!
2025-10-23
LangChain V1.0 深度解析:手把手带你跑通全新智能体架构
2025-10-23
LangChain 与 LangGraph 双双发布 1.0:AI 智能体框架迎来里程碑时刻!
2025-10-19
AI 不再“乱跑”:LangChain × LangGraph 打造可控多阶段智能流程
2025-10-15
LangChain对话Manus创始人:顶级AI智能体上下文工程的“满分作业”首次公开
2025-10-09
Langchain回应OpenAI:为什么我们不做拖拉拽工作流
2025-09-21
告别无效检索:我用LangExtract + Milvus升级 RAG 管道的实战复盘
2025-09-13
2025-09-21
2025-10-19
2025-08-19
2025-08-17
2025-09-19
2025-09-12
2025-09-06
2025-08-03
2025-08-29
2025-10-29
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
2025-05-21
2025-05-19