外观
LangChain 面试题
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. 什么是 LangChain?
LangChain 是一个用于构建基于语言模型的端到端应用的强大框架。它提供了一套工具、组件和接口,简化了由 LLM 和聊天模型驱动的应用程序的创建过程。核心能力:管理与语言模型的交互、将多个组件链接为处理链(Chain)、集成 API 和数据库等外部资源。
2. LangChain 的核心概念
2.1 Component(组件)与 Chain(链)
- Component:模块化的构建块,可组合创建强大的应用
- Chain:组合在一起完成特定任务的一系列 Component(或其他 Chain)。一个 Chain 可能包含:Prompt 模板 → 语言模型 → 输出解析器,协同处理用户输入、生成响应并处理输出
2.2 Prompt Template(提示模板)
负责创建 PromptValue(最终传递给语言模型的内容),将用户输入和其他动态信息转换为适合语言模型的格式。支持文本或聊天消息等多种输出类型。
python
from langchain import PromptTemplate
template = "请给我解释一下{concept}的意思"
prompt = PromptTemplate(input_variables=["concept"], template=template)
prompt = prompt.format(concept="人工智能")2.3 Example Selector(示例选择器)
当需要在 Prompt 中动态包含示例时使用。接受用户输入并返回一组示例列表,使 Prompt 更强大且与上下文相关。
2.4 Output Parser(输出解析器)
负责将语言模型的响应构建为更有用的格式:
- 提供格式化指令
- 将 LLM 响应解析为结构化格式(如 JSON)
2.5 Index(索引)与 Retriever(检索器)
- Index:组织文档的方式,使语言模型更容易与它们交互
- Retriever:获取相关文档并与语言模型组合的接口
LangChain 提供了处理向量数据库和文本分割器等不同类型索引和检索器的工具。
2.6 Chat Message History(聊天消息历史)
负责记忆所有之前的聊天交互数据,可以将这些数据传递回模型、进行总结或以其他方式组合。有助于维护上下文并提高模型对对话的理解。
2.7 Agent(智能体)与 Toolkit(工具集)
- Agent:LangChain 中驱动决策的实体,可以访问一套工具,根据用户输入决定调用哪个工具
- Toolkit:一组协同工作的工具集,代理执行器负责为 Agent 运行适当的工具
Agent 特别适用于存在依赖用户输入的未知交互链的场景。
3. LangChain 的模型分类
LangChain 中的模型主要分为三类:
| 类型 | 说明 |
|---|---|
| LLM | 文本字符串输入 → 文本字符串输出。许多语言模型应用的支柱 |
| Chat Model | 聊天消息列表输入 → 聊天消息输出。结构化的 API,便于管理对话历史和上下文 |
| Text Embedding Model | 文本输入 → 浮点列表(嵌入向量)。用于文档检索、聚类和相似度比较 |
4. LangChain 的功能领域
- LLM 与 Prompt:管理 Prompt、优化 Prompt、为所有 LLM 创建通用接口
- Chain:LLM 或其他实用程序的调用序列,集成多种工具
- 数据增强生成:使 Chain 能够与外部数据源交互,用于总结长文本或基于特定数据源回答问题
- Agent:让 LLM 自主决策行动、观察结果、循环执行直到完成
- 内存(Memory):维护 Chain 或 Agent 调用之间的状态
- 评估(Evaluation):提供 Prompt 和 Chain 帮助开发者使用 LLM 评估自己的模型
5. LangChain 实践示例
5.1 调用 LLM 生成回复
python
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
response = llm("你好")
# 使用 ChatGLM 封装
from transformers import AutoTokenizer, AutoModel
class ChatGLM():
def __init__(self, model_name):
self.tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
self.model = AutoModel.from_pretrained(model_name, trust_remote_code=True).half().cuda().eval()
def __call__(self, prompt):
response, _ = self.model.chat(self.tokenizer, prompt)
return response5.2 使用 Chain 链接组件
python
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt_template)
print(chain.run("你好"))5.3 Embedding 与向量存储
python
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model_name="ada")
# 文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.create_documents([text])
# 本地向量存储(FAISS)
from langchain.vectorstores import FAISS
vector_store = FAISS.from_documents(texts, embeddings)
vector_store.save_local("./vector_store")
# 检索
related_docs = vector_store.similarity_search_with_score(query, k=2)6. LangChain 存在的问题
| 问题 | 说明 | 解决方案 |
|---|---|---|
| Token 计数效率低 | 小数据集上计数效率低 | 使用 OpenAI 的 Tiktoken 库替代 |
| 文档不完善 | 文档不够充分,经常有 404 页面 | 关注版本更新,同时参考社区资源 |
| 概念过多易混淆 | 大量 "helper" 函数本质是标准函数的包装器 | 理解核心 API,跳过不必要的封装 |
| 行为不一致 | 隐藏重要细节,如 ConversationRetrievalChain 对输入问题的重述破坏了对话自然性 | 充分测试后上线,了解内部行为 |
| 缺乏标准数据类型 | 缺少表示数据的标准方式,阻碍集成 | 关注社区标准化进程 |
7. LangChain 的替代方案
| 框架 | 特点 |
|---|---|
| LlamaIndex | 数据框架,将 LLM 连接到自定义数据源,支持存储、查询和索引数据,提供丰富的可视化和分析工具 |
| Haystack | 基于 Hugging Face Transformers 的开源框架,用于构建搜索和问答应用,提供多种查询和理解文本数据的工具 |
| Flowise AI | 低代码平台,通过拖拽即可实现 RAG 等 AI 应用 |