122
社区成员




技术概述:
LangChain 是一个用于开发由大语言模型驱动的应用程序的开源框架,提供了模块化的组件和可定制化的用例链。
简单来说,它允许开发人员将像 GPT-4 这样的大型语言模型与外部的计算和数据源结合起来。 目前,它提供了 Python 和 JavaScript(确切地说是 TypeScript )的软件包。LangChain 是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。 它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。
tools是LLM接触外部世界的工具,比如联网、数学计算、读取文件等都是通过tools的能力。
2.1 环境配置与依赖安装
首先,需要配置开发环境并安装必要的依赖项。
pip install langchain #其他需要的库
2.2 获取和配置国产大模型的API密钥
os.environ["MOONSHOT_API_KEY"] = "**************"
2.3 创建LangChain项目
创建一个新的LangChain项目,并初始化相关文件和目录结构。
2.4 编写调用国产大模型的工具代码
编写用于调用国产大模型API的函数。
llm = MoonshotChat(streaming=True,temperature=0.3,api_key="xxxxx")
先定义两个简单的tool类
def multiply(first_int: int, second_int: int) -> int:
"""将两个数相乘"""
return first_int * second_int
@tool
def add(first_int: int, second_int: int) -> int:
"将两个数相加"
return first_int + second_int``
tools=[multiply,add]
prompt = hub.pull("hwchase17/openai-tools-agent")
llm = init_llm("kimi")
定义一个agent
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "999+999*72177="})
继续接入实用的tool,比如baidusearch
@tool
def baidu_search(query:str) -> str:
"""联网搜索内容"""
params = {
"engine": "baidu",
"q": query,
"api_key": "xxxxxxx",
"rn":"6"
}
search = BaiduSearch(params)
results = search.get_dict()
return results["organic_results"]
调用和前面一样的,记得改为tools=[multiply,add,baidu_search]
联网效果:
2.4 编写流式异步传输不同事件数据的代码
async def chat_tools(history,input):
async for event in agent_executor.astream_events(
{"input":input,"chat_history":history},
version="v1",
):
kind = event["event"]
# 根据不同的事件类型生成不同的 SSE 消息
if kind == "on_chain_start":
if event["name"] == "Agent":
msg = f"data: Starting agent: {event['name']} with input: {event['data'].get('input')}\n\n"
yield msg
elif kind == "on_chain_end":
if event["name"] == "Agent":
msg = f"data:\n--\ndata: Done agent: {event['name']} with output: {event['data'].get('output')['output']}\n\n"
yield msg
elif kind == "on_chat_model_stream":
content = event["data"]["chunk"].content
if content:
msg = f"data: {content}\n\n"
yield msg
elif kind == "on_tool_start":
msg = f"data: --\ndata: Starting tool: {event['name']} with inputs: {event['data'].get('input')}\n\n"
yield msg
elif kind == "on_tool_end":
msg = f"data: Done tool: {event['name']}\ndata: Tool output was: {event['data'].get('output')}\ndata: --\n\n"
yield msg
因为Langchain没有对大部分国产大模型做适配,这一部分的工作得手工完成。
3.1 网络请求失败
问题描述:在调用API时,经常遇到网络请求失败的情况。
解决过程:
3.2 缺少合适的API
问题描述:很多API都需要访问海外网络,国内访问不了。
解决过程:
通过这次实践,我学会了如何在LangChain中集成和调用国产大模型,解决了在API调用和数据处理过程中遇到的多个技术难题。这不仅增强了我的技术能力,也提高了我在实际项目中解决问题的能力。