使用DeepSeek和Ollama在Linux本地部署Embedding模型来运行斯坦福AI小镇

在原项目的基础上,我们使用 Ollama 在本地部署 embedding 模型 mxbai-embed-large,生成模型使用openrouter提供的模型的api key的方式来调用,来运行 Generative Agents 项目。

环境

1
2
3
4
5
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy

Ollama的安装和模型的本地部署

  1. 在Linux系统安装Ollama
1
curl -fsSL https://ollama.com/install.sh | sh
  1. 使用Ollama 安装embedding模型, 可安装模型列表
1
2
# mxbai-embed-large 
ollama pull mxbai-embed-large

代码修改

  1. 主要修改文件 reverie/backend_server/persona/prompt_template/gpt_structure.py, 可参考文件gpt_structure.py 中的 model_request 的函数的request_type == "openrouter"

  2. 在文件开头添加变量

1
2
3
4
# Ollama API 配置
OLLAMA_API_URL = "http://localhost:11434"
MODEL = "deepseek/deepseek-chat" # 使用 api key 调用
EMBEDDING_MODEL = "mxbai-embed-large:latest" # 本地部署调用
  1. 在generative_agents/reverie/backend_server/utils.py文件中添加变量,其中需要到openrouter注册账户并申请API KEY.
1
2
OPENROUTER_API_KEY = "sk-or-v1-xxx" # 替换为你自己申请的API KEY
OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1/chat/completions"
  1. 修改函数 ChatGPT_single_request(prompt), GPT4_request(prompt), ChatGPT_request(prompt)。

原代码:

1
2
3
4
5
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return completion["choices"][0]["message"]["content"]

替换代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
response = requests.post(
url=OPENROUTER_BASE_URL,
headers={
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
# "HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
# "X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
data=json.dumps({
"model": MODEL, # Optional
"messages": [
{
"role": "user",
"content": prompt
}
]

})
)
response_json = response.json()
return response_json["choices"][0]["message"]["content"]
  1. 修改函数GPT_request(prompt, gpt_parameter)

原代码:

1
2
3
4
5
6
7
8
9
10
11
response = openai.Completion.create(
model=gpt_parameter["engine"],
prompt=prompt,
temperature=gpt_parameter["temperature"],
max_tokens=gpt_parameter["max_tokens"],
top_p=gpt_parameter["top_p"],
frequency_penalty=gpt_parameter["frequency_penalty"],
presence_penalty=gpt_parameter["presence_penalty"],
stream=gpt_parameter["stream"],
stop=gpt_parameter["stop"],)
return response.choices[0].text

替换代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
response = requests.post(
url=OPENROUTER_BASE_URL,
headers={
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
# "HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
# "X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
data=json.dumps({
"model": MODEL, # Optional
"messages": [
{
"role": "user",
"content": prompt
}
]

})
)
response_json = response.json()
return response_json["choices"][0]["message"]["content"]
  1. 修改embeding 模型

原代码:

1
2
3
4
5
6
def get_embedding(text, model="text-embedding-ada-002"):
text = text.replace("\n", " ")
if not text:
text = "this is blank"
return openai.Embedding.create(
input=[text], model=model)['data'][0]['embedding']

替换代码:

1
2
3
4
5
6
7
8
def get_embedding(text, model=EMBEDDING_MODEL):
text = text.replace("\n", " ")
if not text:
text = "this is blank"

response = ollama.embeddings(model=model, prompt=text)
embedding = response["embedding"]
return embedding

运行

运行部分不需要做任何修改,可参考原README文件,

References

  1. 论文PDF: Generative Agents: Interactive Simulacra of Human Behavior

  2. 论文作者提供代码: Github

  3. 修改代码参考: liberow


使用DeepSeek和Ollama在Linux本地部署Embedding模型来运行斯坦福AI小镇
https://liberow.github.io/2025/02/04/agent/generative_agents/
Author
liberow
Posted on
February 4, 2025
Licensed under