Python与LangChain:如何构建可解释的AI系统

云信安装大师
90
AI 质量分
2 5 月, 2025
2 分钟阅读
0 阅读

Python与LangChain:如何构建可解释的AI系统

引言

在AI应用日益普及的今天,构建可解释的AI系统变得尤为重要。LangChain作为一个强大的框架,能够帮助我们创建透明且易于理解的AI应用。本文将带你使用Python和LangChain,一步步构建一个可解释的问答系统。

准备工作

环境要求

  • Python 3.8+
  • pip包管理工具
  • OpenAI API密钥(或其他LLM提供商的API)

安装必要的库

代码片段
pip install langchain openai python-dotenv

获取API密钥

  1. 访问OpenAI官网注册账号
  2. 在API Keys页面创建新的密钥
  3. 将密钥保存在项目根目录的.env文件中:
代码片段
OPENAI_API_KEY=你的API密钥

构建基础问答系统

1. 初始化LangChain环境

代码片段
from langchain.llms import OpenAI
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()

# 初始化OpenAI LLM模型
llm = OpenAI(
    model_name="text-davinci-003",  # OpenAI最强大的文本模型之一
    temperature=0.7,               # 控制输出的创造性(0-1)
    max_tokens=1000,               # 限制响应长度
    openai_api_key=os.getenv("OPENAI_API_KEY")
)

参数说明
temperature:值越高输出越随机,值越低输出越确定
max_tokens:限制响应长度以防止过长的输出

2. 创建简单的问答函数

代码片段
def simple_qa(question):
    prompt = f"""
    请回答以下问题,并解释你的思考过程:

    问题: {question}

    回答:
    """

    response = llm(prompt)
    return response

# 测试问答函数
question = "为什么天空是蓝色的?"
print(simple_qa(question))

输出示例

代码片段
天空呈现蓝色是由于瑞利散射现象。当太阳光穿过大气层时,波长较短的蓝光比波长较长的红光更容易被空气分子散射到各个方向。这种散射过程被称为瑞利散射。

思考过程:
1. 首先考虑光的性质及其在大气中的行为
2. 回忆不同颜色光对应的波长差异(蓝光波长较短)
3. 理解散射现象对不同波长光的影响程度不同
4. 综合这些因素得出最终结论

增强系统的可解释性

1. 使用LangChain的Chain功能

代码片段
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 定义更结构化的提示模板
prompt_template = PromptTemplate(
    input_variables=["question"],
    template="""
    请按照以下步骤回答问题:

    问题: {question}

    1. [理解]首先分析问题的核心是什么:_______
    2. [检索]回忆相关知识:_______
    3. [推理]基于这些知识进行逻辑推理:_______
    4. [验证]检查推理是否合理:_______
    5. [结论]最终答案:_______
    """
)

# 创建链式处理流程
qa_chain = LLMChain(llm=llm, prompt=prompt_template)

# 测试增强版问答系统
response = qa_chain.run("为什么植物是绿色的?")
print(response)

输出示例

代码片段
1. [理解]首先分析问题的核心是什么:植物为什么呈现绿色,这与它们的色素有关。
2. [检索]回忆相关知识:植物含有叶绿素这种色素,主要用于光合作用。
3. [推理]基于这些知识进行逻辑推理:叶绿素吸收红光和蓝光较多,反射绿光。
4. [验证]检查推理是否合理:这与我们观察到的植物颜色一致。
5. [结论]最终答案:植物呈现绿色是因为它们含有叶绿素,这种色素主要反射绿光波段的光线。

2. 添加记忆功能增强上下文理解

代码片段
from langchain.memory import ConversationBufferMemory

# 创建带记忆功能的对话链
memory = ConversationBufferMemory()
conversation_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["history", "input"],
        template="""
        当前对话历史:
        {history}

        用户最新问题: {input}

        请逐步思考并回答:
        """
    ),
    memory=memory,
    verbose=True  # 显示详细处理过程
)

# 测试对话系统(多次交互保留上下文)
conversation_chain.run("什么是光合作用?")
conversation_chain.run("它为什么对植物很重要?")

优势
ConversationBufferMemory会保存之前的对话历史,使AI的回答更具连贯性;
verbose=True参数会显示LangChain的内部处理步骤,增强可解释性。

LangChain高级功能应用

1. Agent实现多步推理和工具使用

代码片段
from langchain.agents import load_tools, initialize_agent, AgentType

# 加载工具集(需要额外安装某些包)
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化代理(agent)
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
)

# Agent会自动决定何时使用计算器或搜索引擎查询数据后再回答复杂问题
result = agent.run("截至2023年,中国人口是多少?是美国人口的多少倍?")
print(result)

工作原理
1. Agent接收到复合问题后先分解任务;
2. “serpapi”工具查询最新人口数据;
3. “llm-math”工具执行除法计算;
4. Agent整合结果并返回完整答案。

实践经验与注意事项

1️⃣ API成本控制

代码片段
# Good -限制最大token数和温度参数来控制成本和质量平衡 
llm = OpenAI(max_tokens=500, temperature=0)  

# Bad -不设限制可能导致意外的高额账单 
llm = OpenAI()  

2️⃣ 提示工程技巧

代码片段
# Good -结构化提示模板提高稳定性 
template="""分三步回答: 
1)理解:{question}的核心是什么? 
2)分析:相关因素有哪些? 
3)结论:综合以上得出什么答案?"""

# Bad -过于简单的提示可能导致不稳定的输出 
template="回答:{question}"  

3️⃣ 错误处理

代码片段
from tenacity import retry, stop_after_attempt 

@retry(stop=stop_after_attempt(3)) 
def safe_query(prompt):     
"""添加重试机制的查询函数"""     
try:         
return llm(prompt)     
except Exception as e:         
print(f"Error occurred: {e}")         
raise  

4️⃣ 本地缓存优化

代码片段
from langchain.cache import InMemoryCache  
from langchain.globals import set_llm_cache  

set_llm_cache(InMemoryCache()) #缓存重复查询结果  

总结

通过本文我们学会了:

✅ LangChain基础组件使用方式
✅ Chain和Agent的概念与区别
✅ Memory机制实现多轮对话
✅ Tools扩展实现复杂任务处理

关键点回顾:

1️⃣ 可解释性设计原则
分步思考:强制模型展示推理过程
结构化输出:使用固定格式提高一致性
交互透明化:verbose模式查看决策流程

2️⃣ 进阶技巧

代码片段
#混合多个专家模型获得更好效果  
from langchain.chains import MultiPromptChain  

experts={'物理':'你是一位物理学教授...',          
'生物':'你是一位生物学博士...'}  

multi_chain = MultiPromptChain.from_expert(llm,experts)  
multi_chain.run("光合作用中的量子效应")  

完整项目代码可在GitHub获取:[示例仓库链接]

下一步可以尝试:
接入知识库(VectorStoreRetriever)实现基于文档的问答
部署Web界面(Gradio/Streamlit)制作演示demo

原创 高质量